diff options
author | Eric Liu <ioeric@google.com> | 2018-07-18 15:31:14 +0000 |
---|---|---|
committer | Eric Liu <ioeric@google.com> | 2018-07-18 15:31:14 +0000 |
commit | b720ecd98c931e792e7e5f93befb4c1e47c53e68 (patch) | |
tree | 4f055f40d2bc89dbab2e6ff53fa1316464680b7e | |
parent | b33ccb9a1b0917123f4a934a7875ad788d9295d0 (diff) |
[clangd] Also get scope for RK_pattern completion results.
For exmaple, clas field candidates in constructor initializers can be
RK_Pattern, but they can still have scopes.
git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@337396 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | clangd/CodeComplete.cpp | 6 | ||||
-rw-r--r-- | unittests/clangd/CodeCompleteTests.cpp | 12 |
2 files changed, 16 insertions, 2 deletions
diff --git a/clangd/CodeComplete.cpp b/clangd/CodeComplete.cpp index f4f6c39e..c0725fa6 100644 --- a/clangd/CodeComplete.cpp +++ b/clangd/CodeComplete.cpp @@ -270,12 +270,14 @@ struct CodeCompletionBuilder { if (C.SemaResult) { Completion.Origin |= SymbolOrigin::AST; Completion.Name = llvm::StringRef(SemaCCS->getTypedText()); - if (Completion.Scope.empty()) - if (C.SemaResult->Kind == CodeCompletionResult::RK_Declaration) + if (Completion.Scope.empty()) { + if ((C.SemaResult->Kind == CodeCompletionResult::RK_Declaration) || + (C.SemaResult->Kind == CodeCompletionResult::RK_Pattern)) if (const auto *D = C.SemaResult->getDeclaration()) if (const auto *ND = llvm::dyn_cast<NamedDecl>(D)) Completion.Scope = splitQualifiedName(printQualifiedName(*ND)).first; + } Completion.Kind = toCompletionItemKind(C.SemaResult->Kind, C.SemaResult->Declaration); } diff --git a/unittests/clangd/CodeCompleteTests.cpp b/unittests/clangd/CodeCompleteTests.cpp index 86a5f415..fa6a1bae 100644 --- a/unittests/clangd/CodeCompleteTests.cpp +++ b/unittests/clangd/CodeCompleteTests.cpp @@ -1309,6 +1309,18 @@ TEST(CompletionTest, IgnoreRecoveryResults) { EXPECT_THAT(Results.Completions, UnorderedElementsAre(Named("NotRecovered"))); } +TEST(CompletionTest, ScopeOfClassFieldInConstructorInitializer) { + auto Results = completions( + R"cpp( + namespace ns { + class X { public: X(); int x_; }; + X::X() : x_^(0) {} + } + )cpp"); + EXPECT_THAT(Results.Completions, + UnorderedElementsAre(AllOf(Scope("ns::X::"), Named("x_")))); +} + } // namespace } // namespace clangd } // namespace clang |