summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp')
-rw-r--r--clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp117
1 files changed, 62 insertions, 55 deletions
diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
index e90124ceb43..2f846e9c837 100644
--- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
+++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
@@ -967,19 +967,37 @@ SignatureHelp signatures(llvm::StringRef Text,
return signatures(Test.code(), Test.point(), std::move(IndexSymbols));
}
+struct ExpectedParameter {
+ std::string Text;
+ std::pair<unsigned, unsigned> Offsets;
+};
MATCHER_P(ParamsAre, P, "") {
if (P.size() != arg.parameters.size())
return false;
- for (unsigned I = 0; I < P.size(); ++I)
- if (P[I] != arg.parameters[I].label)
+ for (unsigned I = 0; I < P.size(); ++I) {
+ if (P[I].Text != arg.parameters[I].labelString ||
+ P[I].Offsets != arg.parameters[I].labelOffsets)
return false;
+ }
return true;
}
MATCHER_P(SigDoc, Doc, "") { return arg.documentation == Doc; }
-Matcher<SignatureInformation> Sig(std::string Label,
- std::vector<std::string> Params) {
- return AllOf(SigHelpLabeled(Label), ParamsAre(Params));
+/// \p AnnotatedLabel is a signature label with ranges marking parameters, e.g.
+/// foo([[int p1]], [[double p2]]) -> void
+Matcher<SignatureInformation> Sig(llvm::StringRef AnnotatedLabel) {
+ llvm::Annotations A(AnnotatedLabel);
+ std::string Label = A.code();
+ std::vector<ExpectedParameter> Parameters;
+ for (auto Range : A.ranges()) {
+ Parameters.emplace_back();
+
+ ExpectedParameter &P = Parameters.back();
+ P.Text = Label.substr(Range.Begin, Range.End - Range.Begin);
+ P.Offsets.first = lspLength(llvm::StringRef(Label).substr(0, Range.Begin));
+ P.Offsets.second = lspLength(llvm::StringRef(Label).substr(1, Range.End));
+ }
+ return AllOf(SigHelpLabeled(Label), ParamsAre(Parameters));
}
TEST(SignatureHelpTest, Overloads) {
@@ -992,11 +1010,10 @@ TEST(SignatureHelpTest, Overloads) {
int main() { foo(^); }
)cpp");
EXPECT_THAT(Results.signatures,
- UnorderedElementsAre(
- Sig("foo(float x, float y) -> void", {"float x", "float y"}),
- Sig("foo(float x, int y) -> void", {"float x", "int y"}),
- Sig("foo(int x, float y) -> void", {"int x", "float y"}),
- Sig("foo(int x, int y) -> void", {"int x", "int y"})));
+ UnorderedElementsAre(Sig("foo([[float x]], [[float y]]) -> void"),
+ Sig("foo([[float x]], [[int y]]) -> void"),
+ Sig("foo([[int x]], [[float y]]) -> void"),
+ Sig("foo([[int x]], [[int y]]) -> void")));
// We always prefer the first signature.
EXPECT_EQ(0, Results.activeSignature);
EXPECT_EQ(0, Results.activeParameter);
@@ -1010,9 +1027,8 @@ TEST(SignatureHelpTest, DefaultArgs) {
)cpp");
EXPECT_THAT(Results.signatures,
UnorderedElementsAre(
- Sig("bar(int x, int y = 0) -> void", {"int x", "int y = 0"}),
- Sig("bar(float x = 0, int y = 42) -> void",
- {"float x = 0", "int y = 42"})));
+ Sig("bar([[int x]], [[int y = 0]]) -> void"),
+ Sig("bar([[float x = 0]], [[int y = 42]]) -> void")));
EXPECT_EQ(0, Results.activeSignature);
EXPECT_EQ(0, Results.activeParameter);
}
@@ -1023,8 +1039,7 @@ TEST(SignatureHelpTest, ActiveArg) {
int main() { baz(baz(1,2,3), ^); }
)cpp");
EXPECT_THAT(Results.signatures,
- ElementsAre(Sig("baz(int a, int b, int c) -> int",
- {"int a", "int b", "int c"})));
+ ElementsAre(Sig("baz([[int a]], [[int b]], [[int c]]) -> int")));
EXPECT_EQ(0, Results.activeSignature);
EXPECT_EQ(1, Results.activeParameter);
}
@@ -1761,14 +1776,12 @@ TEST(SignatureHelpTest, OverloadsOrdering) {
void foo(int x, int y = 0);
int main() { foo(^); }
)cpp");
- EXPECT_THAT(
- Results.signatures,
- ElementsAre(
- Sig("foo(int x) -> void", {"int x"}),
- Sig("foo(int x, int y = 0) -> void", {"int x", "int y = 0"}),
- Sig("foo(float x, int y) -> void", {"float x", "int y"}),
- Sig("foo(int x, float y) -> void", {"int x", "float y"}),
- Sig("foo(float x, float y) -> void", {"float x", "float y"})));
+ EXPECT_THAT(Results.signatures,
+ ElementsAre(Sig("foo([[int x]]) -> void"),
+ Sig("foo([[int x]], [[int y = 0]]) -> void"),
+ Sig("foo([[float x]], [[int y]]) -> void"),
+ Sig("foo([[int x]], [[float y]]) -> void"),
+ Sig("foo([[float x]], [[float y]]) -> void")));
// We always prefer the first signature.
EXPECT_EQ(0, Results.activeSignature);
EXPECT_EQ(0, Results.activeParameter);
@@ -1785,7 +1798,7 @@ TEST(SignatureHelpTest, InstantiatedSignatures) {
)cpp";
EXPECT_THAT(signatures(Sig0).signatures,
- ElementsAre(Sig("foo(T, T, T) -> void", {"T", "T", "T"})));
+ ElementsAre(Sig("foo([[T]], [[T]], [[T]]) -> void")));
StringRef Sig1 = R"cpp(
template <class T>
@@ -1796,7 +1809,7 @@ TEST(SignatureHelpTest, InstantiatedSignatures) {
})cpp";
EXPECT_THAT(signatures(Sig1).signatures,
- ElementsAre(Sig("foo(T, T, T) -> void", {"T", "T", "T"})));
+ ElementsAre(Sig("foo([[T]], [[T]], [[T]]) -> void")));
StringRef Sig2 = R"cpp(
template <class ...T>
@@ -1808,7 +1821,7 @@ TEST(SignatureHelpTest, InstantiatedSignatures) {
)cpp";
EXPECT_THAT(signatures(Sig2).signatures,
- ElementsAre(Sig("foo(T...) -> void", {"T..."})));
+ ElementsAre(Sig("foo([[T...]]) -> void")));
// It is debatable whether we should substitute the outer template parameter
// ('T') in that case. Currently we don't substitute it in signature help, but
@@ -1828,7 +1841,7 @@ TEST(SignatureHelpTest, InstantiatedSignatures) {
)cpp";
EXPECT_THAT(signatures(Sig3).signatures,
- ElementsAre(Sig("foo(T, U) -> void", {"T", "U"})));
+ ElementsAre(Sig("foo([[T]], [[U]]) -> void")));
}
TEST(SignatureHelpTest, IndexDocumentation) {
@@ -1849,8 +1862,8 @@ TEST(SignatureHelpTest, IndexDocumentation) {
EXPECT_THAT(
signatures(Sig0, {Foo0}).signatures,
- ElementsAre(AllOf(Sig("foo() -> int", {}), SigDoc("Doc from the index")),
- AllOf(Sig("foo(double) -> int", {"double"}), SigDoc(""))));
+ ElementsAre(AllOf(Sig("foo() -> int"), SigDoc("Doc from the index")),
+ AllOf(Sig("foo([[double]]) -> int"), SigDoc(""))));
StringRef Sig1 = R"cpp(
int foo();
@@ -1866,11 +1879,10 @@ TEST(SignatureHelpTest, IndexDocumentation) {
EXPECT_THAT(
signatures(Sig1, {Foo0, Foo1, Foo2}).signatures,
- ElementsAre(AllOf(Sig("foo() -> int", {}), SigDoc("Doc from the index")),
- AllOf(Sig("foo(int) -> int", {"int"}),
- SigDoc("Overriden doc from sema")),
- AllOf(Sig("foo(int, int) -> int", {"int", "int"}),
- SigDoc("Doc from sema"))));
+ ElementsAre(
+ AllOf(Sig("foo() -> int"), SigDoc("Doc from the index")),
+ AllOf(Sig("foo([[int]]) -> int"), SigDoc("Overriden doc from sema")),
+ AllOf(Sig("foo([[int]], [[int]]) -> int"), SigDoc("Doc from sema"))));
}
TEST(SignatureHelpTest, DynamicIndexDocumentation) {
@@ -1901,7 +1913,7 @@ TEST(SignatureHelpTest, DynamicIndexDocumentation) {
EXPECT_THAT(
llvm::cantFail(runSignatureHelp(Server, File, FileContent.point()))
.signatures,
- ElementsAre(AllOf(Sig("foo() -> int", {}), SigDoc("Member doc"))));
+ ElementsAre(AllOf(Sig("foo() -> int"), SigDoc("Member doc"))));
}
TEST(CompletionTest, CompletionFunctionArgsDisabled) {
@@ -2179,10 +2191,9 @@ TEST(SignatureHelpTest, InsideArgument) {
void foo(int x, int y);
int main() { foo(1+^); }
)cpp");
- EXPECT_THAT(
- Results.signatures,
- ElementsAre(Sig("foo(int x) -> void", {"int x"}),
- Sig("foo(int x, int y) -> void", {"int x", "int y"})));
+ EXPECT_THAT(Results.signatures,
+ ElementsAre(Sig("foo([[int x]]) -> void"),
+ Sig("foo([[int x]], [[int y]]) -> void")));
EXPECT_EQ(0, Results.activeParameter);
}
{
@@ -2191,10 +2202,9 @@ TEST(SignatureHelpTest, InsideArgument) {
void foo(int x, int y);
int main() { foo(1^); }
)cpp");
- EXPECT_THAT(
- Results.signatures,
- ElementsAre(Sig("foo(int x) -> void", {"int x"}),
- Sig("foo(int x, int y) -> void", {"int x", "int y"})));
+ EXPECT_THAT(Results.signatures,
+ ElementsAre(Sig("foo([[int x]]) -> void"),
+ Sig("foo([[int x]], [[int y]]) -> void")));
EXPECT_EQ(0, Results.activeParameter);
}
{
@@ -2203,10 +2213,9 @@ TEST(SignatureHelpTest, InsideArgument) {
void foo(int x, int y);
int main() { foo(1^0); }
)cpp");
- EXPECT_THAT(
- Results.signatures,
- ElementsAre(Sig("foo(int x) -> void", {"int x"}),
- Sig("foo(int x, int y) -> void", {"int x", "int y"})));
+ EXPECT_THAT(Results.signatures,
+ ElementsAre(Sig("foo([[int x]]) -> void"),
+ Sig("foo([[int x]], [[int y]]) -> void")));
EXPECT_EQ(0, Results.activeParameter);
}
{
@@ -2216,8 +2225,8 @@ TEST(SignatureHelpTest, InsideArgument) {
int bar(int x, int y);
int main() { bar(foo(2, 3^)); }
)cpp");
- EXPECT_THAT(Results.signatures, ElementsAre(Sig("foo(int x, int y) -> void",
- {"int x", "int y"})));
+ EXPECT_THAT(Results.signatures,
+ ElementsAre(Sig("foo([[int x]], [[int y]]) -> void")));
EXPECT_EQ(1, Results.activeParameter);
}
}
@@ -2234,9 +2243,8 @@ TEST(SignatureHelpTest, ConstructorInitializeFields) {
};
)cpp");
EXPECT_THAT(Results.signatures,
- UnorderedElementsAre(Sig("A(int)", {"int"}),
- Sig("A(A &&)", {"A &&"}),
- Sig("A(const A &)", {"const A &"})));
+ UnorderedElementsAre(Sig("A([[int]])"), Sig("A([[A &&]])"),
+ Sig("A([[const A &]])")));
}
{
const auto Results = signatures(R"cpp(
@@ -2253,9 +2261,8 @@ TEST(SignatureHelpTest, ConstructorInitializeFields) {
};
)cpp");
EXPECT_THAT(Results.signatures,
- UnorderedElementsAre(Sig("A(int)", {"int"}),
- Sig("A(A &&)", {"A &&"}),
- Sig("A(const A &)", {"const A &"})));
+ UnorderedElementsAre(Sig("A([[int]])"), Sig("A([[A &&]])"),
+ Sig("A([[const A &]])")));
}
}
OpenPOWER on IntegriCloud