spiegel-keyman/windows/src/developer/kmcmpdll/UnreachableRules.cpp
Marc Durdin a639eaa946 feat(developer): promote 'info' messages to 'hint'
There was confusion in the compiler between INFO and HINT type messages.
The problem is that INFO messages will be suppressed by -s/-ss in
kmcomp, but we actually still want HINT messages to be emitted. So I
have gone ahead and renamed CERR_INFO to CERR_HINT and updated all the
places.

This was necessary in order for the kmcomp e2e test 194 to pass.
2022-03-30 17:04:48 +11:00

48 lines
1.1 KiB
C++

#include "pch.h"
#include <compfile.h>
#include <compiler.h>
#include <comperr.h>
#include <vkeys.h>
#include <kmcmpdll.h>
#include <unordered_map>
#include <unordered_set>
#include <string>
#include <sstream>
#include "UnreachableRules.h"
std::wstring MakeHashKeyFromFileKey(PFILE_KEY kp) {
std::wstringstream key;
key << kp->Key << "," << kp->ShiftFlags << ",";
if (kp->dpContext) key << kp->dpContext;
return key.str();
}
DWORD VerifyUnreachableRules(PFILE_GROUP gp) {
PFILE_KEY kp = gp->dpKeyArray;
DWORD i;
std::unordered_map<std::wstring, FILE_KEY> map;
std::unordered_set<int> reportedLines;
for (i = 0; i < gp->cxKeyArray; i++, kp++) {
std::wstring key = MakeHashKeyFromFileKey(kp);
if (map.count(key) > 0) {
FILE_KEY const & k1 = map.at(key);
if (kp->Line != k1.Line && reportedLines.count(kp->Line) == 0) {
reportedLines.insert(kp->Line);
currentLine = kp->Line;
wsprintf(ErrExtra, "Overridden by rule on line %d", k1.Line);
AddWarning(CHINT_UnreachableRule);
}
}
else {
map.insert({ key, *kp });
}
}
return CERR_None;
}