Author: Kadir Cetinkaya Date: 2021-10-28T17:39:35+02:00 New Revision: 3d735480bd2a720af2126c80da58371690e6a02e
URL: https://github.com/llvm/llvm-project/commit/3d735480bd2a720af2126c80da58371690e6a02e DIFF: https://github.com/llvm/llvm-project/commit/3d735480bd2a720af2126c80da58371690e6a02e.diff LOG: [clangd] SelectionTree should prefer lexical declcontext This is important especially for code that tries to traverse scopes as written in code, which is the contract SelectionTree tries to satisfy. Differential Revision: https://reviews.llvm.org/D112712 Added: Modified: clang-tools-extra/clangd/Selection.cpp clang-tools-extra/clangd/Selection.h clang-tools-extra/clangd/unittests/SelectionTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/Selection.cpp b/clang-tools-extra/clangd/Selection.cpp index a53673e074804..88ab1c5d058ee 100644 --- a/clang-tools-extra/clangd/Selection.cpp +++ b/clang-tools-extra/clangd/Selection.cpp @@ -897,7 +897,7 @@ const DeclContext &SelectionTree::Node::getDeclContext() const { if (CurrentNode != this) if (auto *DC = dyn_cast<DeclContext>(Current)) return *DC; - return *Current->getDeclContext(); + return *Current->getLexicalDeclContext(); } } llvm_unreachable("A tree must always be rooted at TranslationUnitDecl."); diff --git a/clang-tools-extra/clangd/Selection.h b/clang-tools-extra/clangd/Selection.h index 775006f40f6cc..f80ee83c4b94c 100644 --- a/clang-tools-extra/clangd/Selection.h +++ b/clang-tools-extra/clangd/Selection.h @@ -128,8 +128,8 @@ class SelectionTree { DynTypedNode ASTNode; // The extent to which this node is covered by the selection. Selection Selected; - // Walk up the AST to get the DeclContext of this Node, - // which is not the node itself. + // Walk up the AST to get the lexical DeclContext of this Node, which is not + // the node itself. const DeclContext &getDeclContext() const; // Printable node kind, like "CXXRecordDecl" or "AutoTypeLoc". std::string kind() const; diff --git a/clang-tools-extra/clangd/unittests/SelectionTests.cpp b/clang-tools-extra/clangd/unittests/SelectionTests.cpp index 1c3bc20958486..6c6782a097db5 100644 --- a/clang-tools-extra/clangd/unittests/SelectionTests.cpp +++ b/clang-tools-extra/clangd/unittests/SelectionTests.cpp @@ -739,6 +739,21 @@ TEST(SelectionTest, CreateAll) { EXPECT_EQ(1u, Seen) << "one tree for nontrivial selection"; } +TEST(SelectionTest, DeclContextIsLexical) { + llvm::Annotations Test("namespace a { void $1^foo(); } void a::$2^foo();"); + auto AST = TestTU::withCode(Test.code()).build(); + { + auto ST = SelectionTree::createRight(AST.getASTContext(), AST.getTokens(), + Test.point("1"), Test.point("1")); + EXPECT_FALSE(ST.commonAncestor()->getDeclContext().isTranslationUnit()); + } + { + auto ST = SelectionTree::createRight(AST.getASTContext(), AST.getTokens(), + Test.point("2"), Test.point("2")); + EXPECT_TRUE(ST.commonAncestor()->getDeclContext().isTranslationUnit()); + } +} + } // namespace } // namespace clangd } // namespace clang _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits