aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Liu <ioeric@google.com>2018-07-18 15:31:14 +0000
committerEric Liu <ioeric@google.com>2018-07-18 15:31:14 +0000
commitb720ecd98c931e792e7e5f93befb4c1e47c53e68 (patch)
tree4f055f40d2bc89dbab2e6ff53fa1316464680b7e
parentb33ccb9a1b0917123f4a934a7875ad788d9295d0 (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.cpp6
-rw-r--r--unittests/clangd/CodeCompleteTests.cpp12
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