Skip to content

Commit 7856a3d

Browse files
authored
Merge pull request #7966 from haoNoQ/static-analyzer-cherrypicks-2024-01
🍒 [analyzer] NFC: Don't regenerate duplicate HTML reports.
2 parents e93674e + 9777b31 commit 7856a3d

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class HTMLDiagnostics : public PathDiagnosticConsumer {
6868
bool noDir = false;
6969
const Preprocessor &PP;
7070
const bool SupportsCrossFileDiagnostics;
71+
llvm::StringSet<> EmittedHashes;
7172

7273
public:
7374
HTMLDiagnostics(PathDiagnosticConsumerOptions DiagOpts,
@@ -301,6 +302,17 @@ void HTMLDiagnostics::ReportDiag(const PathDiagnostic& D,
301302
}
302303
}
303304

305+
SmallString<32> IssueHash = getIssueHash(D, PP);
306+
auto [It, IsNew] = EmittedHashes.insert(IssueHash);
307+
if (!IsNew) {
308+
// We've already emitted a duplicate issue. It'll get overwritten anyway.
309+
return;
310+
}
311+
312+
// FIXME: This causes each file to be re-parsed and syntax-highlighted
313+
// and macro-expanded separately for each report. We could cache such rewrites
314+
// across all reports and only re-do the part that's actually different:
315+
// the warning/note bubbles.
304316
std::string report = GenerateHTML(D, R, SMgr, path, declName.c_str());
305317
if (report.empty()) {
306318
llvm::errs() << "warning: no diagnostics generated for main file.\n";
@@ -332,7 +344,7 @@ void HTMLDiagnostics::ReportDiag(const PathDiagnostic& D,
332344
<< declName.c_str() << "-" << offsetDecl << "-";
333345
}
334346

335-
FileName << StringRef(getIssueHash(D, PP)).substr(0, 6).str() << ".html";
347+
FileName << StringRef(IssueHash).substr(0, 6).str() << ".html";
336348

337349
SmallString<128> ResultPath;
338350
llvm::sys::path::append(ResultPath, Directory, FileName.str());

0 commit comments

Comments
 (0)