[PATCH] D60953: [clangd] Respect clang-tidy suppression comments
Sam McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon May 13 00:42:57 PDT 2019
sammccall added a comment.
Thanks, this looks nice. Main ideas here:
- it'd be nice to get rid of the subclassing in the diag consumer if we can
- i'm not sure the logic around LastErrorWasIgnored is completely accurate
- can we add a unit test for this? The existing clang-tidy diag tests are in `unittests/DiagnosticsTests.cpp`
================
Comment at: clang-tools-extra/clangd/ClangdUnit.cpp:243
+// future).
+class ClangdDiagnosticConsumer : public StoreDiags {
+public:
----------------
Thanks, this is much cleaner.
I think we don't need the subclass at all though - just a filter function here, and call setFilter after setting up clang-tidy?
================
Comment at: clang-tools-extra/clangd/ClangdUnit.cpp:338
Check->registerMatchers(&CTFinder);
}
}
----------------
I believe you can just call setFilter at the end of this block
================
Comment at: clang-tools-extra/clangd/Diagnostics.cpp:309
if (!LangOpts || !Info.hasSourceManager()) {
IgnoreDiagnostics::log(DiagLevel, Info);
----------------
do we need to set LastErrorWasIgnored here (in the case that it's not a note)?
I guess it's pretty unlikely that e.g. a problem with the command-line will get a note that has a source location...
================
Comment at: clang-tools-extra/clangd/Diagnostics.cpp:314
+ if (LastErrorWasIgnored && DiagLevel == DiagnosticsEngine::Note)
+ return;
----------------
Can you add a comment here, about notes attached to suppressed errors? This code is under-commented (sorry), but I think it would aid understanding.
================
Comment at: clang-tools-extra/clangd/Diagnostics.cpp:319
+ if (Filter && !Filter(DiagLevel, Info, InsideMainFile)) {
+ LastErrorWasIgnored = true;
----------------
If I read the code right, we're now applying the filter to a note (whose primary diagnostic was ignored), which we shouldn't. We're also updating the LastErrorWasIgnored flag, which we shouldn't for notes.
I think we might prefer to merge the new logic with the bit below the lambdas, which already looks at note/non-note status.
e.g.
```
if (!isNote(...)) {
flushLastDiag();
LastErrorWasIgnored = !Filter(...);
if (LastErrorWasIgnored)
return;
...
} else {
// Handle a note...
if (LastErrorWasIgnored)
return;
...
}
================
Comment at: clang-tools-extra/clangd/Diagnostics.h:118
+ std::function<bool(DiagnosticsEngine::Level, const clang::Diagnostic &,
+ bool IsInsideMainFile)>;
/// If set, possibly adds fixes for diagnostics using \p Fixer.
----------------
nit: IsInsideMainFile is information already inside the diagnostic.
Diagnostics.cpp does compute this information (in an unneccesarily verbose way IMO) but I'd prefer not to expose that in this public interface - the filter function can recompute.
================
Comment at: clang-tools-extra/clangd/Diagnostics.h:122
+ /// If set, ignore diagnostics for which \p Filter returns false.
+ void filterDiagnostics(DiagFilter Filter) { this->Filter = Filter; }
----------------
I know I suggested this name, but just an idea...
The difficulty with `filter` is it's unclear whether `true` means "this passes the filter" or "this is filtered out". It may be clearer to invert the sense and call this `suppress`.
Anyway, totally up to you, can definitely live with filter.
================
Comment at: clang-tools-extra/clangd/Diagnostics.h:132
llvm::Optional<Diag> LastDiag;
+ bool LastErrorWasIgnored = false;
};
----------------
I think we're talking about last non-note diagnostic, right? Warnings count here I think.
At the risk of being verbose, maybe `LastPrimaryDiagnosticWasIgnored`?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D60953/new/
https://reviews.llvm.org/D60953
More information about the cfe-commits
mailing list