[clang-tools-extra] r363253 - [Clangd] Fixed clangd diagnostics priority
Kadir Cetinkaya via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 13 05:31:36 PDT 2019
Author: kadircet
Date: Thu Jun 13 05:31:36 2019
New Revision: 363253
URL: http://llvm.org/viewvc/llvm-project?rev=363253&view=rev
Log:
[Clangd] Fixed clangd diagnostics priority
Summary:
- Fixed diagnostics where zero width inserted ranges were being used instead of the whole token
- Added unit tests
Patch by @SureYeaah !
Reviewers: sammccall, kadircet
Reviewed By: kadircet
Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, cfe-commits
Tags: #clang-tools-extra, #clang
Differential Revision: https://reviews.llvm.org/D63222
Modified:
clang-tools-extra/trunk/clangd/Diagnostics.cpp
clang-tools-extra/trunk/clangd/unittests/DiagnosticsTests.cpp
Modified: clang-tools-extra/trunk/clangd/Diagnostics.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Diagnostics.cpp?rev=363253&r1=363252&r2=363253&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/Diagnostics.cpp (original)
+++ clang-tools-extra/trunk/clangd/Diagnostics.cpp Thu Jun 13 05:31:36 2019
@@ -18,6 +18,7 @@
#include "clang/Basic/FileManager.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Lex/Lexer.h"
+#include "clang/Lex/Token.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
@@ -90,24 +91,19 @@ Range diagnosticRange(const clang::Diagn
if (locationInRange(Loc, R, M))
return halfOpenToRange(M, R);
}
- llvm::Optional<Range> FallbackRange;
// The range may be given as a fixit hint instead.
for (const auto &F : D.getFixItHints()) {
auto R = Lexer::makeFileCharRange(F.RemoveRange, M, L);
if (locationInRange(Loc, R, M))
return halfOpenToRange(M, R);
- // If there's a fixit that performs insertion, it has zero-width. Therefore
- // it can't contain the location of the diag, but it might be possible that
- // this should be reported as range. For example missing semicolon.
- if (R.getBegin() == R.getEnd() && Loc == R.getBegin())
- FallbackRange = halfOpenToRange(M, R);
}
- if (FallbackRange)
- return *FallbackRange;
- // If no suitable range is found, just use the token at the location.
- auto R = Lexer::makeFileCharRange(CharSourceRange::getTokenRange(Loc), M, L);
- if (!R.isValid()) // Fall back to location only, let the editor deal with it.
- R = CharSourceRange::getCharRange(Loc);
+ // If the token at the location is not a comment, we use the token.
+ // If we can't get the token at the location, fall back to using the location
+ auto R = CharSourceRange::getCharRange(Loc);
+ Token Tok;
+ if (!Lexer::getRawToken(Loc, Tok, M, L, true) && Tok.isNot(tok::comment)) {
+ R = CharSourceRange::getTokenRange(Tok.getLocation(), Tok.getEndLoc());
+ }
return halfOpenToRange(M, R);
}
Modified: clang-tools-extra/trunk/clangd/unittests/DiagnosticsTests.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/unittests/DiagnosticsTests.cpp?rev=363253&r1=363252&r2=363253&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/unittests/DiagnosticsTests.cpp (original)
+++ clang-tools-extra/trunk/clangd/unittests/DiagnosticsTests.cpp Thu Jun 13 05:31:36 2019
@@ -101,6 +101,7 @@ TEST(DiagnosticsTest, DiagnosticRanges)
Annotations Test(R"cpp(
namespace test{};
void $decl[[foo]]();
+ class T{$explicit[[]]$constructor[[T]](int a);};
int main() {
$typo[[go\
o]]();
@@ -112,8 +113,10 @@ o]]();
test::$nomembernamespace[[test]];
}
)cpp");
+ auto TU = TestTU::withCode(Test.code());
+ TU.ClangTidyChecks = "-*,google-explicit-constructor";
EXPECT_THAT(
- TestTU::withCode(Test.code()).build().getDiagnostics(),
+ TU.build().getDiagnostics(),
ElementsAre(
// This range spans lines.
AllOf(Diag(Test.range("typo"),
@@ -135,7 +138,13 @@ o]]();
"of type 'const char [4]'"),
Diag(Test.range("nomember"), "no member named 'y' in 'Foo'"),
Diag(Test.range("nomembernamespace"),
- "no member named 'test' in namespace 'test'")));
+ "no member named 'test' in namespace 'test'"),
+ // We make sure here that the entire token is highlighted
+ AllOf(Diag(Test.range("constructor"),
+ "single-argument constructors must be marked explicit to "
+ "avoid unintentional implicit conversions"),
+ WithFix(Fix(Test.range("explicit"), "explicit ",
+ "insert 'explicit '")))));
}
TEST(DiagnosticsTest, FlagsMatter) {
More information about the cfe-commits
mailing list