Index: clangd/CodeComplete.cpp =================================================================== --- clangd/CodeComplete.cpp +++ clangd/CodeComplete.cpp @@ -470,6 +470,8 @@ // (s.^ completes ~string, but s.~st^ is an error). if (dyn_cast_or_null(Result.Declaration)) continue; + // We choose to never append '::' to completion results in clangd. + Result.StartsNestedNameSpecifier = false; Results.push_back(Result); } ResultsCallback(); Index: test/clangd/protocol.test =================================================================== --- test/clangd/protocol.test +++ test/clangd/protocol.test @@ -38,7 +38,7 @@ # CHECK-NEXT: "insertText": "fake", # CHECK-NEXT: "insertTextFormat": 1, # CHECK-NEXT: "kind": 7, -# CHECK-NEXT: "label": "fake::", +# CHECK-NEXT: "label": "fake", # CHECK-NEXT: "sortText": "{{.*}}" # CHECK: ] # CHECK-NEXT: } @@ -67,7 +67,7 @@ # CHECK-NEXT: "insertText": "fake", # CHECK-NEXT: "insertTextFormat": 1, # CHECK-NEXT: "kind": 7, -# CHECK-NEXT: "label": "fake::", +# CHECK-NEXT: "label": "fake", # CHECK-NEXT: "sortText": "{{.*}}" # CHECK: ] # CHECK-NEXT: } @@ -96,7 +96,7 @@ # CHECK-NEXT: "insertText": "fake", # CHECK-NEXT: "insertTextFormat": 1, # CHECK-NEXT: "kind": 7, -# CHECK-NEXT: "label": "fake::", +# CHECK-NEXT: "label": "fake", # CHECK-NEXT: "sortText": "{{.*}}" # CHECK: ] # CHECK-NEXT: } Index: unittests/clangd/CodeCompleteTests.cpp =================================================================== --- unittests/clangd/CodeCompleteTests.cpp +++ unittests/clangd/CodeCompleteTests.cpp @@ -595,6 +595,18 @@ EXPECT_TRUE(Results.items.empty()); } +TEST(CodeCompleteTest, NoColonColonAtTheEnd) { + auto Results = completions(R"cpp( + namespace clang { } + void f() { + clan^ + } + )cpp"); + + EXPECT_THAT(Results.items, Contains(Labeled("clang"))); + EXPECT_THAT(Results.items, Not(Contains(Labeled("clang::")))); +} + SignatureHelp signatures(StringRef Text) { MockFSProvider FS; MockCompilationDatabase CDB;