forked from OSchip/llvm-project
Try to make the output of PlistDiagnostics more deterministic by sorting PathDiagnostics before they are emitted. Fixes <rdar://problem/7439668>.
llvm-svn: 90478
This commit is contained in:
parent
4313a9c56a
commit
a3536e23c8
|
@ -29,6 +29,40 @@ namespace clang {
|
|||
class Preprocessor;
|
||||
}
|
||||
|
||||
namespace {
|
||||
struct CompareDiagnostics {
|
||||
// Compare if 'X' is "<" than 'Y'.
|
||||
bool operator()(const PathDiagnostic *X, const PathDiagnostic *Y) const {
|
||||
// First compare by location
|
||||
const FullSourceLoc &XLoc = X->getLocation().asLocation();
|
||||
const FullSourceLoc &YLoc = Y->getLocation().asLocation();
|
||||
if (XLoc < YLoc)
|
||||
return true;
|
||||
if (XLoc != YLoc)
|
||||
return false;
|
||||
|
||||
// Next, compare by bug type.
|
||||
llvm::StringRef XBugType = X->getBugType();
|
||||
llvm::StringRef YBugType = Y->getBugType();
|
||||
if (XBugType < YBugType)
|
||||
return true;
|
||||
if (XBugType != YBugType)
|
||||
return false;
|
||||
|
||||
// Next, compare by bug description.
|
||||
llvm::StringRef XDesc = X->getDescription();
|
||||
llvm::StringRef YDesc = Y->getDescription();
|
||||
if (XDesc < YDesc)
|
||||
return true;
|
||||
if (XDesc != YDesc)
|
||||
return false;
|
||||
|
||||
// FIXME: Further refine by comparing PathDiagnosticPieces?
|
||||
return false;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
namespace {
|
||||
class PlistDiagnostics : public PathDiagnosticClient {
|
||||
std::vector<const PathDiagnostic*> BatchedDiags;
|
||||
|
@ -315,6 +349,11 @@ void PlistDiagnostics::FlushDiagnostics(llvm::SmallVectorImpl<std::string>
|
|||
|
||||
flushed = true;
|
||||
|
||||
// Sort the diagnostics so that they are always emitted in a deterministic
|
||||
// order.
|
||||
if (!BatchedDiags.empty())
|
||||
std::sort(BatchedDiags.begin(), BatchedDiags.end(), CompareDiagnostics());
|
||||
|
||||
// Build up a set of FIDs that we use by scanning the locations and
|
||||
// ranges of the diagnostics.
|
||||
FIDMap FM;
|
||||
|
|
Loading…
Reference in New Issue