[clang-tools-extra] 2330cee - [clangd] Prefer the left character if the character on the right of the cursor is semicolon.
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 28 04:16:53 PST 2019
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.
More information about the cfe-commits
mailing list