Skip to content

Commit

Permalink
[analyzer][NFC] Refactor functions in PlistDiagnostics to take Analyz…
Browse files Browse the repository at this point in the history
…erOptions as parameter

I intend to add a new flag macro-expnasions-as-events, and unfortunately
I'll only be able to convert the macro piece into an event one once I'm
about to emit it, due to the lack of an avaible Preprocessor object in
the BugReporter.

Differential Revision: https://reviews.llvm.org/D52787

llvm-svn: 343620
  • Loading branch information
Szelethus committed Oct 2, 2018
1 parent 8bb8a92 commit 40271e4
Showing 1 changed file with 34 additions and 23 deletions.
57 changes: 34 additions & 23 deletions clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
Expand Up @@ -32,8 +32,8 @@ namespace {
class PlistDiagnostics : public PathDiagnosticConsumer {
const std::string OutputFile;
const Preprocessor &PP;
AnalyzerOptions &AnOpts;
const bool SupportsCrossFileDiagnostics;
const bool SerializeStatistics;
public:
PlistDiagnostics(AnalyzerOptions &AnalyzerOpts,
const std::string& prefix,
Expand Down Expand Up @@ -63,22 +63,23 @@ PlistDiagnostics::PlistDiagnostics(AnalyzerOptions &AnalyzerOpts,
const std::string& output,
const Preprocessor &PP,
bool supportsMultipleFiles)
: OutputFile(output), PP(PP),
SupportsCrossFileDiagnostics(supportsMultipleFiles),
SerializeStatistics(AnalyzerOpts.shouldSerializeStats()) {}
: OutputFile(output), PP(PP), AnOpts(AnalyzerOpts),
SupportsCrossFileDiagnostics(supportsMultipleFiles) {}

void ento::createPlistDiagnosticConsumer(AnalyzerOptions &AnalyzerOpts,
PathDiagnosticConsumers &C,
const std::string& s,
const Preprocessor &PP) {
C.push_back(new PlistDiagnostics(AnalyzerOpts, s, PP, false));
C.push_back(new PlistDiagnostics(AnalyzerOpts, s, PP,
/*supportsMultipleFiles*/ false));
}

void ento::createPlistMultiFileDiagnosticConsumer(AnalyzerOptions &AnalyzerOpts,
PathDiagnosticConsumers &C,
const std::string &s,
const Preprocessor &PP) {
C.push_back(new PlistDiagnostics(AnalyzerOpts, s, PP, true));
C.push_back(new PlistDiagnostics(AnalyzerOpts, s, PP,
/*supportsMultipleFiles*/ true));
}

static void EmitRanges(raw_ostream &o,
Expand Down Expand Up @@ -175,7 +176,8 @@ static void ReportControlFlow(raw_ostream &o,
Indent(o, indent) << "</dict>\n";
}

static void ReportEvent(raw_ostream &o, const PathDiagnosticEventPiece& P,
static void ReportEvent(raw_ostream &o,
const PathDiagnosticEventPiece& P,
const FIDMap& FM,
const Preprocessor &PP,
unsigned indent,
Expand Down Expand Up @@ -219,6 +221,7 @@ static void ReportPiece(raw_ostream &o,
const PathDiagnosticPiece &P,
const FIDMap& FM,
const Preprocessor &PP,
AnalyzerOptions &AnOpts,
unsigned indent,
unsigned depth,
bool includeControlFlow,
Expand All @@ -228,49 +231,51 @@ static void ReportCall(raw_ostream &o,
const PathDiagnosticCallPiece &P,
const FIDMap& FM,
const Preprocessor &PP,
AnalyzerOptions &AnOpts,
unsigned indent,
unsigned depth) {

if (auto callEnter = P.getCallEnterEvent())
ReportPiece(o, *callEnter, FM, PP, indent, depth,
ReportPiece(o, *callEnter, FM, PP, AnOpts, indent, depth,
/*includeControlFlow*/ true, P.isLastInMainSourceFile());


++depth;

if (auto callEnterWithinCaller = P.getCallEnterWithinCallerEvent())
ReportPiece(o, *callEnterWithinCaller, FM, PP, indent, depth,
ReportPiece(o, *callEnterWithinCaller, FM, PP, AnOpts, indent, depth,
/*includeControlFlow*/ true);

for (PathPieces::const_iterator I = P.path.begin(), E = P.path.end();I!=E;++I)
ReportPiece(o, **I, FM, PP, indent, depth,
ReportPiece(o, **I, FM, PP, AnOpts, indent, depth,
/*includeControlFlow*/ true);

--depth;

if (auto callExit = P.getCallExitEvent())
ReportPiece(o, *callExit, FM, PP, indent, depth,
ReportPiece(o, *callExit, FM, PP, AnOpts, indent, depth,
/*includeControlFlow*/ true);
}

static void ReportMacro(raw_ostream &o,
const PathDiagnosticMacroPiece& P,
const FIDMap& FM,
const Preprocessor &PP,
AnalyzerOptions &AnOpts,
unsigned indent,
unsigned depth) {

for (PathPieces::const_iterator I = P.subPieces.begin(), E=P.subPieces.end();
I!=E; ++I) {
ReportPiece(o, **I, FM, PP, indent, depth, /*includeControlFlow*/ false);
ReportPiece(o, **I, FM, PP, AnOpts, indent, depth,
/*includeControlFlow*/ false);
}
}

static void ReportNote(raw_ostream &o, const PathDiagnosticNotePiece& P,
const FIDMap& FM,
const Preprocessor &PP,
unsigned indent,
unsigned depth) {
unsigned indent) {

const SourceManager &SM = PP.getSourceManager();

Expand All @@ -295,16 +300,20 @@ static void ReportNote(raw_ostream &o, const PathDiagnosticNotePiece& P,
Indent(o, indent); o << "</dict>\n";
}

static void ReportDiag(raw_ostream &o, const PathDiagnosticPiece& P,
const FIDMap& FM, const Preprocessor &PP) {
ReportPiece(o, P, FM, PP, /*indent*/ 4, /*depth*/ 0,
static void ReportDiag(raw_ostream &o,
const PathDiagnosticPiece& P,
const FIDMap& FM,
const Preprocessor &PP,
AnalyzerOptions &AnOpts) {
ReportPiece(o, P, FM, PP, AnOpts, /*indent*/ 4, /*depth*/ 0,
/*includeControlFlow*/ true);
}

static void ReportPiece(raw_ostream &o,
const PathDiagnosticPiece &P,
const FIDMap& FM,
const Preprocessor &PP,
AnalyzerOptions &AnOpts,
unsigned indent,
unsigned depth,
bool includeControlFlow,
Expand All @@ -316,17 +325,19 @@ static void ReportPiece(raw_ostream &o,
indent);
break;
case PathDiagnosticPiece::Call:
ReportCall(o, cast<PathDiagnosticCallPiece>(P), FM, PP, indent, depth);
ReportCall(o, cast<PathDiagnosticCallPiece>(P), FM, PP, AnOpts, indent,
depth);
break;
case PathDiagnosticPiece::Event:
ReportEvent(o, cast<PathDiagnosticEventPiece>(P), FM, PP, indent, depth,
isKeyEvent);
break;
case PathDiagnosticPiece::Macro:
ReportMacro(o, cast<PathDiagnosticMacroPiece>(P), FM, PP, indent, depth);
ReportMacro(o, cast<PathDiagnosticMacroPiece>(P), FM, PP, AnOpts, indent,
depth);
break;
case PathDiagnosticPiece::Note:
ReportNote(o, cast<PathDiagnosticNotePiece>(P), FM, PP, indent, depth);
ReportNote(o, cast<PathDiagnosticNotePiece>(P), FM, PP, indent);
break;
}
}
Expand Down Expand Up @@ -458,7 +469,7 @@ void PlistDiagnostics::FlushDiagnosticsImpl(
" <array>\n";

for (; I != FirstNonNote; ++I)
ReportDiag(o, **I, FM, PP);
ReportDiag(o, **I, FM, PP, AnOpts);

o << " </array>\n";
}
Expand All @@ -468,7 +479,7 @@ void PlistDiagnostics::FlushDiagnosticsImpl(
o << " <array>\n";

for (PathPieces::const_iterator E = Path.end(); I != E; ++I)
ReportDiag(o, **I, FM, PP);
ReportDiag(o, **I, FM, PP, AnOpts);

o << " </array>\n";

Expand Down Expand Up @@ -594,7 +605,7 @@ void PlistDiagnostics::FlushDiagnosticsImpl(
EmitString(o << " ", SM.getFileEntryForID(FID)->getName()) << '\n';
o << " </array>\n";

if (llvm::AreStatisticsEnabled() && SerializeStatistics) {
if (llvm::AreStatisticsEnabled() && AnOpts.shouldSerializeStats()) {
o << " <key>statistics</key>\n";
std::string stats;
llvm::raw_string_ostream os(stats);
Expand Down

0 comments on commit 40271e4

Please sign in to comment.