[PATCH] D122315: [clangd] Retain main file fixes attached to diags from preamble
Kadir Cetinkaya via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 24 03:38:05 PDT 2022
kadircet updated this revision to Diff 417873.
kadircet marked 2 inline comments as done.
kadircet added a comment.
- Get rid of redundant local variable
- Update comment around assumptions about main file-ness inside toLSPDiag.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D122315/new/
https://reviews.llvm.org/D122315
Files:
clang-tools-extra/clangd/Diagnostics.cpp
clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
Index: clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
+++ clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
@@ -22,6 +22,7 @@
#include "support/Path.h"
#include "clang/Basic/Diagnostic.h"
#include "clang/Basic/DiagnosticSema.h"
+#include "llvm/ADT/StringRef.h"
#include "llvm/Support/ScopedPrinter.h"
#include "llvm/Support/TargetSelect.h"
#include "gmock/gmock.h"
@@ -1658,6 +1659,28 @@
EXPECT_THAT(*TU.build().getDiagnostics(), IsEmpty());
}
+TEST(DiagnosticsTest, FixItFromHeader) {
+ llvm::StringLiteral Header(R"cpp(
+ void foo(int *);
+ void foo(int *, int);)cpp");
+ Annotations Source(R"cpp(
+ /*error-ok*/
+ void bar() {
+ int x;
+ $diag[[foo]]($fix[[]]x, 1);
+ })cpp");
+ TestTU TU;
+ TU.Code = Source.code().str();
+ TU.HeaderCode = Header.str();
+ EXPECT_THAT(
+ *TU.build().getDiagnostics(),
+ UnorderedElementsAre(AllOf(
+ Diag(Source.range("diag"), "no matching function for call to 'foo'"),
+ withFix(Fix(Source.range("fix"), "&",
+ "candidate function not viable: no known conversion from "
+ "'int' to 'int *' for 1st argument; take the address of "
+ "the argument with &")))));
+}
} // namespace
} // namespace clangd
} // namespace clang
Index: clang-tools-extra/clangd/Diagnostics.cpp
===================================================================
--- clang-tools-extra/clangd/Diagnostics.cpp
+++ clang-tools-extra/clangd/Diagnostics.cpp
@@ -31,6 +31,7 @@
#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
+#include <cassert>
#include <cstddef>
#include <vector>
@@ -463,7 +464,8 @@
// Main diagnostic should always refer to a range inside main file. If a
// diagnostic made it so for, it means either itself or one of its notes is
- // inside main file.
+ // inside main file. It's also possible that there's a fix in the main file,
+ // but we preserve fixes iff primary diagnostic is in the main file.
if (D.InsideMainFile) {
Main.range = D.Range;
} else {
@@ -701,13 +703,12 @@
return;
}
- bool InsideMainFile = isInsideMainFile(Info);
SourceManager &SM = Info.getSourceManager();
auto FillDiagBase = [&](DiagBase &D) {
fillNonLocationData(DiagLevel, Info, D);
- D.InsideMainFile = InsideMainFile;
+ D.InsideMainFile = isInsideMainFile(Info);
D.Range = diagnosticRange(Info, *LangOpts);
D.File = std::string(SM.getFilename(Info.getLocation()));
D.AbsFile = getCanonicalPath(
@@ -719,9 +720,9 @@
auto AddFix = [&](bool SyntheticMessage) -> bool {
assert(!Info.getFixItHints().empty() &&
"diagnostic does not have attached fix-its");
- if (!InsideMainFile)
+ // No point in generating fixes, if the diagnostic is for a different file.
+ if (!LastDiag->InsideMainFile)
return false;
-
// Copy as we may modify the ranges.
auto FixIts = Info.getFixItHints().vec();
llvm::SmallVector<TextEdit, 1> Edits;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D122315.417873.patch
Type: text/x-patch
Size: 3175 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220324/3d95ce7b/attachment.bin>
More information about the cfe-commits
mailing list