Author: Haojian Wu Date: 2019-11-28T13:15:10+01:00 New Revision: 2330cee82f0aa06e8063189fe7a68db3e51f3054
URL: https://github.com/llvm/llvm-project/commit/2330cee82f0aa06e8063189fe7a68db3e51f3054 DIFF: https://github.com/llvm/llvm-project/commit/2330cee82f0aa06e8063189fe7a68db3e51f3054.diff LOG: [clangd] Prefer the left character if the character on the right of the cursor is semicolon. Summary: This would make go-to-def works on the cases like int A = abc^; Reviewers: sammccall Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D70807 Added: Modified: clang-tools-extra/clangd/Selection.cpp clang-tools-extra/clangd/unittests/SelectionTests.cpp clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/Selection.cpp b/clang-tools-extra/clangd/Selection.cpp index c91cd24e2f25..5b29b916b33c 100644 --- a/clang-tools-extra/clangd/Selection.cpp +++ b/clang-tools-extra/clangd/Selection.cpp @@ -513,8 +513,9 @@ static std::pair<unsigned, unsigned> pointBounds(unsigned Offset, FileID FID, return {Offset - 1, Offset}; // We could choose either this byte or the previous. Usually we prefer the // character on the right of the cursor (or under a block cursor). - // But if that's whitespace, we likely want the token on the left. - if (isWhitespace(Buf[Offset]) && !isWhitespace(Buf[Offset - 1])) + // But if that's whitespace/semicolon, we likely want the token on the left. + auto IsIgnoredChar = [](char C) { return isWhitespace(C) || C == ';'; }; + if (IsIgnoredChar(Buf[Offset]) && !IsIgnoredChar(Buf[Offset - 1])) return {Offset - 1, Offset}; return {Offset, Offset + 1}; } diff --git a/clang-tools-extra/clangd/unittests/SelectionTests.cpp b/clang-tools-extra/clangd/unittests/SelectionTests.cpp index 2803aaaca1c5..6f4ccd88b978 100644 --- a/clang-tools-extra/clangd/unittests/SelectionTests.cpp +++ b/clang-tools-extra/clangd/unittests/SelectionTests.cpp @@ -234,6 +234,7 @@ TEST(SelectionTest, CommonAncestor) { {"void foo() { [[foo^()]]; }", "CallExpr"}, {"void foo() { [[foo^]] (); }", "DeclRefExpr"}, {"int bar; void foo() [[{ foo (); }]]^", "CompoundStmt"}, + {"int x = [[42]]^;", "IntegerLiteral"}, // Ignores whitespace, comments, and semicolons in the selection. {"void foo() { [[foo^()]]; /*comment*/^}", "CallExpr"}, @@ -271,7 +272,6 @@ TEST(SelectionTest, CommonAncestor) { // FIXME: Ideally we'd get a declstmt or the VarDecl itself here. // This doesn't happen now; the RAV doesn't traverse a node containing ;. {"int x = 42;^", nullptr}, - {"int x = 42^;", nullptr}, // Common ancestor is logically TUDecl, but we never return that. {"^int x; int y;^", nullptr}, diff --git a/clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp b/clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp index b9ca0273a823..f518fea67292 100644 --- a/clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp +++ b/clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp @@ -88,11 +88,8 @@ TEST(SemanticSelection, All) { R"cpp( // Single statement in TU. [[int v = [[1^00]]]]; )cpp", - // FIXME: No node found associated to the position. R"cpp( // Cursor at end of VarDecl. - void func() { - int v = 100 + 100^; - } + [[int v = [[100]]^]]; )cpp", // FIXME: No node found associated to the position. R"cpp( // Cursor in between spaces. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits