r343511 - [analyzer][NFC] Refactor functions in PlistDiagnostics to take Preproc as parameter
Kristof Umann via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 1 11:11:51 PDT 2018
Author: szelethus
Date: Mon Oct 1 11:11:51 2018
New Revision: 343511
URL: http://llvm.org/viewvc/llvm-project?rev=343511&view=rev
Log:
[analyzer][NFC] Refactor functions in PlistDiagnostics to take Preproc as parameter
This is patch is a preparation for the proposed inclusion of macro expansions in the plist output.
Differential Revision: https://reviews.llvm.org/D52735
Modified:
cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
Modified: cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp?rev=343511&r1=343510&r2=343511&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp Mon Oct 1 11:11:51 2018
@@ -31,13 +31,13 @@ using namespace markup;
namespace {
class PlistDiagnostics : public PathDiagnosticConsumer {
const std::string OutputFile;
- const LangOptions &LangOpts;
+ const Preprocessor &PP;
const bool SupportsCrossFileDiagnostics;
const bool SerializeStatistics;
public:
PlistDiagnostics(AnalyzerOptions &AnalyzerOpts,
const std::string& prefix,
- const LangOptions &LangOpts,
+ const Preprocessor &PP,
bool supportsMultipleFiles);
~PlistDiagnostics() override {}
@@ -61,10 +61,9 @@ namespace {
PlistDiagnostics::PlistDiagnostics(AnalyzerOptions &AnalyzerOpts,
const std::string& output,
- const LangOptions &LO,
+ const Preprocessor &PP,
bool supportsMultipleFiles)
- : OutputFile(output),
- LangOpts(LO),
+ : OutputFile(output), PP(PP),
SupportsCrossFileDiagnostics(supportsMultipleFiles),
SerializeStatistics(AnalyzerOpts.shouldSerializeStats()) {}
@@ -72,23 +71,20 @@ void ento::createPlistDiagnosticConsumer
PathDiagnosticConsumers &C,
const std::string& s,
const Preprocessor &PP) {
- C.push_back(new PlistDiagnostics(AnalyzerOpts, s,
- PP.getLangOpts(), false));
+ C.push_back(new PlistDiagnostics(AnalyzerOpts, s, PP, false));
}
void ento::createPlistMultiFileDiagnosticConsumer(AnalyzerOptions &AnalyzerOpts,
PathDiagnosticConsumers &C,
const std::string &s,
const Preprocessor &PP) {
- C.push_back(new PlistDiagnostics(AnalyzerOpts, s,
- PP.getLangOpts(), true));
+ C.push_back(new PlistDiagnostics(AnalyzerOpts, s, PP, true));
}
static void EmitRanges(raw_ostream &o,
const ArrayRef<SourceRange> Ranges,
const FIDMap& FM,
- const SourceManager &SM,
- const LangOptions &LangOpts,
+ const Preprocessor &PP,
unsigned indent) {
if (Ranges.empty())
@@ -97,6 +93,10 @@ static void EmitRanges(raw_ostream &o,
Indent(o, indent) << "<key>ranges</key>\n";
Indent(o, indent) << "<array>\n";
++indent;
+
+ const SourceManager &SM = PP.getSourceManager();
+ const LangOptions &LangOpts = PP.getLangOpts();
+
for (auto &R : Ranges)
EmitRange(o, SM,
Lexer::getAsCharRange(SM.getExpansionRange(R), SM, LangOpts),
@@ -122,10 +122,12 @@ static void EmitMessage(raw_ostream &o,
static void ReportControlFlow(raw_ostream &o,
const PathDiagnosticControlFlowPiece& P,
const FIDMap& FM,
- const SourceManager &SM,
- const LangOptions &LangOpts,
+ const Preprocessor &PP,
unsigned indent) {
+ const SourceManager &SM = PP.getSourceManager();
+ const LangOptions &LangOpts = PP.getLangOpts();
+
Indent(o, indent) << "<dict>\n";
++indent;
@@ -175,12 +177,13 @@ static void ReportControlFlow(raw_ostrea
static void ReportEvent(raw_ostream &o, const PathDiagnosticEventPiece& P,
const FIDMap& FM,
- const SourceManager &SM,
- const LangOptions &LangOpts,
+ const Preprocessor &PP,
unsigned indent,
unsigned depth,
bool isKeyEvent = false) {
+ const SourceManager &SM = PP.getSourceManager();
+
Indent(o, indent) << "<dict>\n";
++indent;
@@ -198,7 +201,7 @@ static void ReportEvent(raw_ostream &o,
// Output the ranges (if any).
ArrayRef<SourceRange> Ranges = P.getRanges();
- EmitRanges(o, Ranges, FM, SM, LangOpts, indent);
+ EmitRanges(o, Ranges, FM, PP, indent);
// Output the call depth.
Indent(o, indent) << "<key>depth</key>";
@@ -214,8 +217,8 @@ static void ReportEvent(raw_ostream &o,
static void ReportPiece(raw_ostream &o,
const PathDiagnosticPiece &P,
- const FIDMap& FM, const SourceManager &SM,
- const LangOptions &LangOpts,
+ const FIDMap& FM,
+ const Preprocessor &PP,
unsigned indent,
unsigned depth,
bool includeControlFlow,
@@ -223,51 +226,54 @@ static void ReportPiece(raw_ostream &o,
static void ReportCall(raw_ostream &o,
const PathDiagnosticCallPiece &P,
- const FIDMap& FM, const SourceManager &SM,
- const LangOptions &LangOpts,
+ const FIDMap& FM,
+ const Preprocessor &PP,
unsigned indent,
unsigned depth) {
if (auto callEnter = P.getCallEnterEvent())
- ReportPiece(o, *callEnter, FM, SM, LangOpts, indent, depth, true,
- P.isLastInMainSourceFile());
+ ReportPiece(o, *callEnter, FM, PP, indent, depth,
+ /*includeControlFlow*/ true, P.isLastInMainSourceFile());
++depth;
if (auto callEnterWithinCaller = P.getCallEnterWithinCallerEvent())
- ReportPiece(o, *callEnterWithinCaller, FM, SM, LangOpts,
- indent, depth, true);
+ ReportPiece(o, *callEnterWithinCaller, FM, PP, indent, depth,
+ /*includeControlFlow*/ true);
for (PathPieces::const_iterator I = P.path.begin(), E = P.path.end();I!=E;++I)
- ReportPiece(o, **I, FM, SM, LangOpts, indent, depth, true);
+ ReportPiece(o, **I, FM, PP, indent, depth,
+ /*includeControlFlow*/ true);
--depth;
if (auto callExit = P.getCallExitEvent())
- ReportPiece(o, *callExit, FM, SM, LangOpts, indent, depth, true);
+ ReportPiece(o, *callExit, FM, PP, indent, depth,
+ /*includeControlFlow*/ true);
}
static void ReportMacro(raw_ostream &o,
const PathDiagnosticMacroPiece& P,
- const FIDMap& FM, const SourceManager &SM,
- const LangOptions &LangOpts,
+ const FIDMap& FM,
+ const Preprocessor &PP,
unsigned indent,
unsigned depth) {
for (PathPieces::const_iterator I = P.subPieces.begin(), E=P.subPieces.end();
I!=E; ++I) {
- ReportPiece(o, **I, FM, SM, LangOpts, indent, depth, false);
+ ReportPiece(o, **I, FM, PP, indent, depth, /*includeControlFlow*/ false);
}
}
static void ReportNote(raw_ostream &o, const PathDiagnosticNotePiece& P,
const FIDMap& FM,
- const SourceManager &SM,
- const LangOptions &LangOpts,
+ const Preprocessor &PP,
unsigned indent,
unsigned depth) {
+ const SourceManager &SM = PP.getSourceManager();
+
Indent(o, indent) << "<dict>\n";
++indent;
@@ -279,7 +285,7 @@ static void ReportNote(raw_ostream &o, c
// Output the ranges (if any).
ArrayRef<SourceRange> Ranges = P.getRanges();
- EmitRanges(o, Ranges, FM, SM, LangOpts, indent);
+ EmitRanges(o, Ranges, FM, PP, indent);
// Output the text.
EmitMessage(o, P.getString(), indent);
@@ -290,15 +296,15 @@ static void ReportNote(raw_ostream &o, c
}
static void ReportDiag(raw_ostream &o, const PathDiagnosticPiece& P,
- const FIDMap& FM, const SourceManager &SM,
- const LangOptions &LangOpts) {
- ReportPiece(o, P, FM, SM, LangOpts, 4, 0, true);
+ const FIDMap& FM, const Preprocessor &PP) {
+ ReportPiece(o, P, FM, PP, /*indent*/ 4, /*depth*/ 0,
+ /*includeControlFlow*/ true);
}
static void ReportPiece(raw_ostream &o,
const PathDiagnosticPiece &P,
- const FIDMap& FM, const SourceManager &SM,
- const LangOptions &LangOpts,
+ const FIDMap& FM,
+ const Preprocessor &PP,
unsigned indent,
unsigned depth,
bool includeControlFlow,
@@ -306,24 +312,21 @@ static void ReportPiece(raw_ostream &o,
switch (P.getKind()) {
case PathDiagnosticPiece::ControlFlow:
if (includeControlFlow)
- ReportControlFlow(o, cast<PathDiagnosticControlFlowPiece>(P), FM, SM,
- LangOpts, indent);
+ ReportControlFlow(o, cast<PathDiagnosticControlFlowPiece>(P), FM, PP,
+ indent);
break;
case PathDiagnosticPiece::Call:
- ReportCall(o, cast<PathDiagnosticCallPiece>(P), FM, SM, LangOpts,
- indent, depth);
+ ReportCall(o, cast<PathDiagnosticCallPiece>(P), FM, PP, indent, depth);
break;
case PathDiagnosticPiece::Event:
- ReportEvent(o, cast<PathDiagnosticEventPiece>(P), FM, SM, LangOpts,
- indent, depth, isKeyEvent);
+ ReportEvent(o, cast<PathDiagnosticEventPiece>(P), FM, PP, indent, depth,
+ isKeyEvent);
break;
case PathDiagnosticPiece::Macro:
- ReportMacro(o, cast<PathDiagnosticMacroPiece>(P), FM, SM, LangOpts,
- indent, depth);
+ ReportMacro(o, cast<PathDiagnosticMacroPiece>(P), FM, PP, indent, depth);
break;
case PathDiagnosticPiece::Note:
- ReportNote(o, cast<PathDiagnosticNotePiece>(P), FM, SM, LangOpts,
- indent, depth);
+ ReportNote(o, cast<PathDiagnosticNotePiece>(P), FM, PP, indent, depth);
break;
}
}
@@ -368,17 +371,15 @@ void PlistDiagnostics::FlushDiagnosticsI
// ranges of the diagnostics.
FIDMap FM;
SmallVector<FileID, 10> Fids;
- const SourceManager* SM = nullptr;
-
- if (!Diags.empty())
- SM = &Diags.front()->path.front()->getLocation().getManager();
+ const SourceManager& SM = PP.getSourceManager();
+ const LangOptions &LangOpts = PP.getLangOpts();
- auto AddPieceFID = [&FM, &Fids, SM](const PathDiagnosticPiece &Piece) {
- AddFID(FM, Fids, *SM, Piece.getLocation().asLocation());
+ auto AddPieceFID = [&FM, &Fids, &SM](const PathDiagnosticPiece &Piece) {
+ AddFID(FM, Fids, SM, Piece.getLocation().asLocation());
ArrayRef<SourceRange> Ranges = Piece.getRanges();
for (const SourceRange &Range : Ranges) {
- AddFID(FM, Fids, *SM, Range.getBegin());
- AddFID(FM, Fids, *SM, Range.getEnd());
+ AddFID(FM, Fids, SM, Range.getBegin());
+ AddFID(FM, Fids, SM, Range.getEnd());
}
};
@@ -437,27 +438,27 @@ void PlistDiagnostics::FlushDiagnosticsI
o << " <dict>\n";
const PathDiagnostic *D = *DI;
- const PathPieces &PP = D->path;
+ const PathPieces &Path = D->path;
assert(std::is_partitioned(
- PP.begin(), PP.end(),
+ Path.begin(), Path.end(),
[](const std::shared_ptr<PathDiagnosticPiece> &E)
{ return E->getKind() == PathDiagnosticPiece::Note; }) &&
"PathDiagnostic is not partitioned so that notes precede the rest");
PathPieces::const_iterator FirstNonNote = std::partition_point(
- PP.begin(), PP.end(),
+ Path.begin(), Path.end(),
[](const std::shared_ptr<PathDiagnosticPiece> &E)
{ return E->getKind() == PathDiagnosticPiece::Note; });
- PathPieces::const_iterator I = PP.begin();
+ PathPieces::const_iterator I = Path.begin();
- if (FirstNonNote != PP.begin()) {
+ if (FirstNonNote != Path.begin()) {
o << " <key>notes</key>\n"
" <array>\n";
for (; I != FirstNonNote; ++I)
- ReportDiag(o, **I, FM, *SM, LangOpts);
+ ReportDiag(o, **I, FM, PP);
o << " </array>\n";
}
@@ -466,8 +467,8 @@ void PlistDiagnostics::FlushDiagnosticsI
o << " <array>\n";
- for (PathPieces::const_iterator E = PP.end(); I != E; ++I)
- ReportDiag(o, **I, FM, *SM, LangOpts);
+ for (PathPieces::const_iterator E = Path.end(); I != E; ++I)
+ ReportDiag(o, **I, FM, PP);
o << " </array>\n";
@@ -484,12 +485,12 @@ void PlistDiagnostics::FlushDiagnosticsI
o << " <!-- This hash is experimental and going to change! -->\n";
o << " <key>issue_hash_content_of_line_in_context</key>";
PathDiagnosticLocation UPDLoc = D->getUniqueingLoc();
- FullSourceLoc L(SM->getExpansionLoc(UPDLoc.isValid()
+ FullSourceLoc L(SM.getExpansionLoc(UPDLoc.isValid()
? UPDLoc.asLocation()
: D->getLocation().asLocation()),
- *SM);
+ SM);
const Decl *DeclWithIssue = D->getDeclWithIssue();
- EmitString(o, GetIssueHash(*SM, L, D->getCheckName(), D->getBugType(),
+ EmitString(o, GetIssueHash(SM, L, D->getCheckName(), D->getBugType(),
DeclWithIssue, LangOpts))
<< '\n';
@@ -534,16 +535,16 @@ void PlistDiagnostics::FlushDiagnosticsI
// site and the end of scope (leak report location).
if (UPDLoc.isValid()) {
FullSourceLoc UFunL(
- SM->getExpansionLoc(
+ SM.getExpansionLoc(
D->getUniqueingDecl()->getBody()->getBeginLoc()),
- *SM);
+ SM);
o << " <key>issue_hash_function_offset</key><string>"
<< L.getExpansionLineNumber() - UFunL.getExpansionLineNumber()
<< "</string>\n";
// Otherwise, use the location on which the bug is reported.
} else {
- FullSourceLoc FunL(SM->getExpansionLoc(Body->getBeginLoc()), *SM);
+ FullSourceLoc FunL(SM.getExpansionLoc(Body->getBeginLoc()), SM);
o << " <key>issue_hash_function_offset</key><string>"
<< L.getExpansionLineNumber() - FunL.getExpansionLineNumber()
<< "</string>\n";
@@ -555,7 +556,7 @@ void PlistDiagnostics::FlushDiagnosticsI
// Output the location of the bug.
o << " <key>location</key>\n";
- EmitLocation(o, *SM, D->getLocation().asLocation(), FM, 2);
+ EmitLocation(o, SM, D->getLocation().asLocation(), FM, 2);
// Output the diagnostic to the sub-diagnostic client, if any.
if (!filesMade->empty()) {
@@ -590,7 +591,7 @@ void PlistDiagnostics::FlushDiagnosticsI
o << " <key>files</key>\n"
" <array>\n";
for (FileID FID : Fids)
- EmitString(o << " ", SM->getFileEntryForID(FID)->getName()) << '\n';
+ EmitString(o << " ", SM.getFileEntryForID(FID)->getName()) << '\n';
o << " </array>\n";
if (llvm::AreStatisticsEnabled() && SerializeStatistics) {
More information about the cfe-commits
mailing list