[clang-tools-extra] da5ded4 - [clangd] Populate ranges and symbol origin for paramname completions
Kadir Cetinkaya via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 31 03:39:43 PDT 2022
Author: Kadir Cetinkaya
Date: 2022-10-31T11:34:06+01:00
New Revision: da5ded4fc9d8c8edfd4a79fa0e75c2ac9165fa7b
URL: https://github.com/llvm/llvm-project/commit/da5ded4fc9d8c8edfd4a79fa0e75c2ac9165fa7b
DIFF: https://github.com/llvm/llvm-project/commit/da5ded4fc9d8c8edfd4a79fa0e75c2ac9165fa7b.diff
LOG: [clangd] Populate ranges and symbol origin for paramname completions
Differential Revision: https://reviews.llvm.org/D136951
Added:
Modified:
clang-tools-extra/clangd/CodeComplete.cpp
clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/CodeComplete.cpp b/clang-tools-extra/clangd/CodeComplete.cpp
index 5616f5e49dd2..5612fc599fb5 100644
--- a/clang-tools-extra/clangd/CodeComplete.cpp
+++ b/clang-tools-extra/clangd/CodeComplete.cpp
@@ -2014,14 +2014,23 @@ CodeCompleteResult codeCompleteComment(PathRef FileName, unsigned Offset,
return CodeCompleteResult();
CodeCompleteResult Result;
+ Range CompletionRange;
+ // Skip /*
+ Offset += 2;
+ CompletionRange.start = offsetToPosition(ParseInput.Contents, Offset);
+ CompletionRange.end =
+ offsetToPosition(ParseInput.Contents, Offset + Prefix.size());
+ Result.CompletionRange = CompletionRange;
Result.Context = CodeCompletionContext::CCC_NaturalLanguage;
for (llvm::StringRef Name : ParamNames) {
if (!Name.startswith(Prefix))
continue;
CodeCompletion Item;
- Item.Name = Name.str() + "=";
+ Item.Name = Name.str() + "=*/";
Item.FilterText = Item.Name;
Item.Kind = CompletionItemKind::Text;
+ Item.CompletionTokenRange = CompletionRange;
+ Item.Origin = SymbolOrigin::AST;
Result.Completions.push_back(Item);
}
diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
index 0166bea7d7e7..db700556e1d2 100644
--- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
+++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
@@ -21,6 +21,7 @@
#include "TestTU.h"
#include "index/Index.h"
#include "index/MemIndex.h"
+#include "index/SymbolOrigin.h"
#include "support/Threading.h"
#include "clang/Sema/CodeCompleteConsumer.h"
#include "clang/Tooling/CompilationDatabase.h"
@@ -29,6 +30,7 @@
#include "llvm/Support/Path.h"
#include "llvm/Testing/Support/Annotations.h"
#include "llvm/Testing/Support/Error.h"
+#include "llvm/Testing/Support/SupportHelpers.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include <condition_variable>
@@ -83,6 +85,9 @@ MATCHER(insertInclude, "") {
MATCHER_P(snippetSuffix, Text, "") { return arg.SnippetSuffix == Text; }
MATCHER_P(origin, OriginSet, "") { return arg.Origin == OriginSet; }
MATCHER_P(signature, S, "") { return arg.Signature == S; }
+MATCHER_P(replacesRange, Range, "") {
+ return arg.CompletionTokenRange == Range;
+}
// Shorthand for Contains(named(Name)).
Matcher<const std::vector<CodeCompletion> &> has(std::string Name) {
@@ -3713,7 +3718,6 @@ TEST(CompletionTest, PreambleCodeComplete) {
}
TEST(CompletionTest, CommentParamName) {
- clangd::CodeCompleteOptions Opts;
const std::string Code = R"cpp(
void fun(int foo, int bar);
void overloaded(int param_int);
@@ -3722,23 +3726,46 @@ TEST(CompletionTest, CommentParamName) {
int main() {
)cpp";
- EXPECT_THAT(completions(Code + "fun(/*^", {}, Opts).Completions,
- UnorderedElementsAre(labeled("foo=")));
- EXPECT_THAT(completions(Code + "fun(1, /*^", {}, Opts).Completions,
- UnorderedElementsAre(labeled("bar=")));
- EXPECT_THAT(completions(Code + "/*^", {}, Opts).Completions, IsEmpty());
+ EXPECT_THAT(completions(Code + "fun(/*^").Completions,
+ UnorderedElementsAre(labeled("foo=*/")));
+ EXPECT_THAT(completions(Code + "fun(1, /*^").Completions,
+ UnorderedElementsAre(labeled("bar=*/")));
+ EXPECT_THAT(completions(Code + "/*^").Completions, IsEmpty());
// Test de-duplication.
EXPECT_THAT(
- completions(Code + "overloaded(/*^", {}, Opts).Completions,
- UnorderedElementsAre(labeled("param_int="), labeled("param_char=")));
+ completions(Code + "overloaded(/*^").Completions,
+ UnorderedElementsAre(labeled("param_int=*/"), labeled("param_char=*/")));
// Comment already has some text in it.
- EXPECT_THAT(completions(Code + "fun(/* ^", {}, Opts).Completions,
- UnorderedElementsAre(labeled("foo=")));
- EXPECT_THAT(completions(Code + "fun(/* f^", {}, Opts).Completions,
- UnorderedElementsAre(labeled("foo=")));
- EXPECT_THAT(completions(Code + "fun(/* x^", {}, Opts).Completions, IsEmpty());
- EXPECT_THAT(completions(Code + "fun(/* f ^", {}, Opts).Completions,
- IsEmpty());
+ EXPECT_THAT(completions(Code + "fun(/* ^").Completions,
+ UnorderedElementsAre(labeled("foo=*/")));
+ EXPECT_THAT(completions(Code + "fun(/* f^").Completions,
+ UnorderedElementsAre(labeled("foo=*/")));
+ EXPECT_THAT(completions(Code + "fun(/* x^").Completions, IsEmpty());
+ EXPECT_THAT(completions(Code + "fun(/* f ^").Completions, IsEmpty());
+
+ // Test ranges
+ {
+ std::string CompletionRangeTest(Code + "fun(/*[[^]]");
+ auto Results = completions(CompletionRangeTest);
+ EXPECT_THAT(Results.CompletionRange,
+ llvm::ValueIs(Annotations(CompletionRangeTest).range()));
+ EXPECT_THAT(
+ Results.Completions,
+ testing::Each(
+ AllOf(replacesRange(Annotations(CompletionRangeTest).range()),
+ origin(SymbolOrigin::AST), kind(CompletionItemKind::Text))));
+ }
+ {
+ std::string CompletionRangeTest(Code + "fun(/*[[fo^]]");
+ auto Results = completions(CompletionRangeTest);
+ EXPECT_THAT(Results.CompletionRange,
+ llvm::ValueIs(Annotations(CompletionRangeTest).range()));
+ EXPECT_THAT(
+ Results.Completions,
+ testing::Each(
+ AllOf(replacesRange(Annotations(CompletionRangeTest).range()),
+ origin(SymbolOrigin::AST), kind(CompletionItemKind::Text))));
+ }
}
TEST(CompletionTest, Concepts) {
More information about the cfe-commits
mailing list