[clangd] Also get scope for RK_pattern completion results.
authorEric Liu <ioeric@google.com>
Wed, 18 Jul 2018 15:31:14 +0000 (15:31 +0000)
committerEric Liu <ioeric@google.com>
Wed, 18 Jul 2018 15:31:14 +0000 (15:31 +0000)
For exmaple, clas field candidates in constructor initializers can be
RK_Pattern, but they can still have scopes.

llvm-svn: 337396

clang-tools-extra/clangd/CodeComplete.cpp
clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp

index f4f6c39..c0725fa 100644 (file)
@@ -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);
     }
index 86a5f41..fa6a1ba 100644 (file)
@@ -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