Skip to content

Commit da5ded4

Browse files
committed
[clangd] Populate ranges and symbol origin for paramname completions
Differential Revision: https://reviews.llvm.org/D136951
1 parent 1258747 commit da5ded4

File tree

2 files changed

+52
-16
lines changed

2 files changed

+52
-16
lines changed

clang-tools-extra/clangd/CodeComplete.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2014,14 +2014,23 @@ CodeCompleteResult codeCompleteComment(PathRef FileName, unsigned Offset,
20142014
return CodeCompleteResult();
20152015

20162016
CodeCompleteResult Result;
2017+
Range CompletionRange;
2018+
// Skip /*
2019+
Offset += 2;
2020+
CompletionRange.start = offsetToPosition(ParseInput.Contents, Offset);
2021+
CompletionRange.end =
2022+
offsetToPosition(ParseInput.Contents, Offset + Prefix.size());
2023+
Result.CompletionRange = CompletionRange;
20172024
Result.Context = CodeCompletionContext::CCC_NaturalLanguage;
20182025
for (llvm::StringRef Name : ParamNames) {
20192026
if (!Name.startswith(Prefix))
20202027
continue;
20212028
CodeCompletion Item;
2022-
Item.Name = Name.str() + "=";
2029+
Item.Name = Name.str() + "=*/";
20232030
Item.FilterText = Item.Name;
20242031
Item.Kind = CompletionItemKind::Text;
2032+
Item.CompletionTokenRange = CompletionRange;
2033+
Item.Origin = SymbolOrigin::AST;
20252034
Result.Completions.push_back(Item);
20262035
}
20272036

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

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "TestTU.h"
2222
#include "index/Index.h"
2323
#include "index/MemIndex.h"
24+
#include "index/SymbolOrigin.h"
2425
#include "support/Threading.h"
2526
#include "clang/Sema/CodeCompleteConsumer.h"
2627
#include "clang/Tooling/CompilationDatabase.h"
@@ -29,6 +30,7 @@
2930
#include "llvm/Support/Path.h"
3031
#include "llvm/Testing/Support/Annotations.h"
3132
#include "llvm/Testing/Support/Error.h"
33+
#include "llvm/Testing/Support/SupportHelpers.h"
3234
#include "gmock/gmock.h"
3335
#include "gtest/gtest.h"
3436
#include <condition_variable>
@@ -83,6 +85,9 @@ MATCHER(insertInclude, "") {
8385
MATCHER_P(snippetSuffix, Text, "") { return arg.SnippetSuffix == Text; }
8486
MATCHER_P(origin, OriginSet, "") { return arg.Origin == OriginSet; }
8587
MATCHER_P(signature, S, "") { return arg.Signature == S; }
88+
MATCHER_P(replacesRange, Range, "") {
89+
return arg.CompletionTokenRange == Range;
90+
}
8691

8792
// Shorthand for Contains(named(Name)).
8893
Matcher<const std::vector<CodeCompletion> &> has(std::string Name) {
@@ -3713,7 +3718,6 @@ TEST(CompletionTest, PreambleCodeComplete) {
37133718
}
37143719

37153720
TEST(CompletionTest, CommentParamName) {
3716-
clangd::CodeCompleteOptions Opts;
37173721
const std::string Code = R"cpp(
37183722
void fun(int foo, int bar);
37193723
void overloaded(int param_int);
@@ -3722,23 +3726,46 @@ TEST(CompletionTest, CommentParamName) {
37223726
int main() {
37233727
)cpp";
37243728

3725-
EXPECT_THAT(completions(Code + "fun(/*^", {}, Opts).Completions,
3726-
UnorderedElementsAre(labeled("foo=")));
3727-
EXPECT_THAT(completions(Code + "fun(1, /*^", {}, Opts).Completions,
3728-
UnorderedElementsAre(labeled("bar=")));
3729-
EXPECT_THAT(completions(Code + "/*^", {}, Opts).Completions, IsEmpty());
3729+
EXPECT_THAT(completions(Code + "fun(/*^").Completions,
3730+
UnorderedElementsAre(labeled("foo=*/")));
3731+
EXPECT_THAT(completions(Code + "fun(1, /*^").Completions,
3732+
UnorderedElementsAre(labeled("bar=*/")));
3733+
EXPECT_THAT(completions(Code + "/*^").Completions, IsEmpty());
37303734
// Test de-duplication.
37313735
EXPECT_THAT(
3732-
completions(Code + "overloaded(/*^", {}, Opts).Completions,
3733-
UnorderedElementsAre(labeled("param_int="), labeled("param_char=")));
3736+
completions(Code + "overloaded(/*^").Completions,
3737+
UnorderedElementsAre(labeled("param_int=*/"), labeled("param_char=*/")));
37343738
// Comment already has some text in it.
3735-
EXPECT_THAT(completions(Code + "fun(/* ^", {}, Opts).Completions,
3736-
UnorderedElementsAre(labeled("foo=")));
3737-
EXPECT_THAT(completions(Code + "fun(/* f^", {}, Opts).Completions,
3738-
UnorderedElementsAre(labeled("foo=")));
3739-
EXPECT_THAT(completions(Code + "fun(/* x^", {}, Opts).Completions, IsEmpty());
3740-
EXPECT_THAT(completions(Code + "fun(/* f ^", {}, Opts).Completions,
3741-
IsEmpty());
3739+
EXPECT_THAT(completions(Code + "fun(/* ^").Completions,
3740+
UnorderedElementsAre(labeled("foo=*/")));
3741+
EXPECT_THAT(completions(Code + "fun(/* f^").Completions,
3742+
UnorderedElementsAre(labeled("foo=*/")));
3743+
EXPECT_THAT(completions(Code + "fun(/* x^").Completions, IsEmpty());
3744+
EXPECT_THAT(completions(Code + "fun(/* f ^").Completions, IsEmpty());
3745+
3746+
// Test ranges
3747+
{
3748+
std::string CompletionRangeTest(Code + "fun(/*[[^]]");
3749+
auto Results = completions(CompletionRangeTest);
3750+
EXPECT_THAT(Results.CompletionRange,
3751+
llvm::ValueIs(Annotations(CompletionRangeTest).range()));
3752+
EXPECT_THAT(
3753+
Results.Completions,
3754+
testing::Each(
3755+
AllOf(replacesRange(Annotations(CompletionRangeTest).range()),
3756+
origin(SymbolOrigin::AST), kind(CompletionItemKind::Text))));
3757+
}
3758+
{
3759+
std::string CompletionRangeTest(Code + "fun(/*[[fo^]]");
3760+
auto Results = completions(CompletionRangeTest);
3761+
EXPECT_THAT(Results.CompletionRange,
3762+
llvm::ValueIs(Annotations(CompletionRangeTest).range()));
3763+
EXPECT_THAT(
3764+
Results.Completions,
3765+
testing::Each(
3766+
AllOf(replacesRange(Annotations(CompletionRangeTest).range()),
3767+
origin(SymbolOrigin::AST), kind(CompletionItemKind::Text))));
3768+
}
37423769
}
37433770

37443771
TEST(CompletionTest, Concepts) {

0 commit comments

Comments
 (0)