10 #include "clang/Sema/CodeCompleteConsumer.h" 11 #include "gmock/gmock.h" 12 #include "gtest/gtest.h" 18 class CompletionStringTest :
public ::testing::Test {
20 CompletionStringTest()
21 :
Allocator(std::make_shared<
clang::GlobalCodeCompletionAllocator>()),
25 void computeSignature(
const CodeCompletionString &CCS,
26 bool CompletingPattern =
false) {
33 std::shared_ptr<clang::GlobalCodeCompletionAllocator>
Allocator;
41 Builder.AddResultTypeChunk(
"result");
42 Builder.AddResultTypeChunk(
"redundant result no no");
46 TEST_F(CompletionStringTest, Documentation) {
47 Builder.addBriefComment(
"This is ignored");
52 TEST_F(CompletionStringTest, DocumentationWithAnnotation) {
53 Builder.addBriefComment(
"This is ignored");
56 "Annotation: Ano\n\nIs this brief?");
59 TEST_F(CompletionStringTest, MultipleAnnotations) {
65 "Annotations: Ano1 Ano2 Ano3\n");
68 TEST_F(CompletionStringTest, EmptySignature) {
70 Builder.AddResultTypeChunk(
"result no no");
71 computeSignature(*
Builder.TakeString());
77 Builder.AddResultTypeChunk(
"result no no");
78 Builder.addBriefComment(
"This comment is ignored");
79 Builder.AddTypedTextChunk(
"Foo");
80 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
81 Builder.AddPlaceholderChunk(
"p1");
82 Builder.AddChunk(CodeCompletionString::CK_Comma);
83 Builder.AddPlaceholderChunk(
"p2");
84 Builder.AddChunk(CodeCompletionString::CK_RightParen);
86 auto *CCS =
Builder.TakeString();
87 computeSignature(*CCS);
89 EXPECT_EQ(
Snippet,
"(${1:p1}, ${2:p2})");
93 TEST_F(CompletionStringTest, FunctionWithDefaultParams) {
95 Builder.AddChunk(CodeCompletionString::CK_Comma);
96 Builder.AddTypedTextChunk(
"p3 = 0");
97 auto *DefaultParam2 =
Builder.TakeString();
99 Builder.AddChunk(CodeCompletionString::CK_Comma);
100 Builder.AddTypedTextChunk(
"p2 = 0");
101 Builder.AddOptionalChunk(DefaultParam2);
102 auto *DefaultParam1 =
Builder.TakeString();
104 Builder.AddResultTypeChunk(
"return_type");
105 Builder.AddTypedTextChunk(
"Foo");
106 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
107 Builder.AddPlaceholderChunk(
"p1");
108 Builder.AddOptionalChunk(DefaultParam1);
109 Builder.AddChunk(CodeCompletionString::CK_RightParen);
111 auto *CCS =
Builder.TakeString();
112 computeSignature(*CCS);
113 EXPECT_EQ(
Signature,
"(p1, p2 = 0, p3 = 0)");
114 EXPECT_EQ(
Snippet,
"(${1:p1})");
117 TEST_F(CompletionStringTest, EscapeSnippet) {
118 Builder.AddTypedTextChunk(
"Foo");
119 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
120 Builder.AddPlaceholderChunk(
"$p}1\\");
121 Builder.AddChunk(CodeCompletionString::CK_RightParen);
123 computeSignature(*
Builder.TakeString());
125 EXPECT_EQ(
Snippet,
"(${1:\\$p\\}1\\\\})");
128 TEST_F(CompletionStringTest, SnippetsInPatterns) {
129 auto MakeCCS = [
this]() ->
const CodeCompletionString & {
131 Builder.AddTypedTextChunk(
"namespace");
132 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
133 Builder.AddPlaceholderChunk(
"name");
134 Builder.AddChunk(CodeCompletionString::CK_Equal);
135 Builder.AddPlaceholderChunk(
"target");
136 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
137 return *Builder.TakeString();
139 computeSignature(MakeCCS(),
false);
140 EXPECT_EQ(
Snippet,
" ${1:name} = ${2:target};");
143 computeSignature(MakeCCS(),
true);
144 EXPECT_EQ(
Snippet,
" ${1:name} = ${0:target};");
147 TEST_F(CompletionStringTest, IgnoreInformativeQualifier) {
148 Builder.AddTypedTextChunk(
"X");
149 Builder.AddInformativeChunk(
"info ok");
150 Builder.AddInformativeChunk(
"info no no::");
151 computeSignature(*
Builder.TakeString());
156 TEST_F(CompletionStringTest, ObjectiveCMethodNoArguments) {
157 Builder.AddResultTypeChunk(
"void");
158 Builder.AddTypedTextChunk(
"methodName");
160 auto *CCS =
Builder.TakeString();
161 computeSignature(*CCS);
166 TEST_F(CompletionStringTest, ObjectiveCMethodOneArgument) {
167 Builder.AddResultTypeChunk(
"void");
168 Builder.AddTypedTextChunk(
"methodWithArg:");
169 Builder.AddPlaceholderChunk(
"(type)");
171 auto *CCS =
Builder.TakeString();
172 computeSignature(*CCS);
174 EXPECT_EQ(
Snippet,
"${1:(type)}");
177 TEST_F(CompletionStringTest, ObjectiveCMethodTwoArgumentsFromBeginning) {
178 Builder.AddResultTypeChunk(
"int");
179 Builder.AddTypedTextChunk(
"withFoo:");
180 Builder.AddPlaceholderChunk(
"(type)");
181 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
182 Builder.AddTypedTextChunk(
"bar:");
183 Builder.AddPlaceholderChunk(
"(type2)");
185 auto *CCS =
Builder.TakeString();
186 computeSignature(*CCS);
187 EXPECT_EQ(
Signature,
"(type) bar:(type2)");
188 EXPECT_EQ(
Snippet,
"${1:(type)} bar:${2:(type2)}");
191 TEST_F(CompletionStringTest, ObjectiveCMethodTwoArgumentsFromMiddle) {
192 Builder.AddResultTypeChunk(
"int");
193 Builder.AddInformativeChunk(
"withFoo:");
194 Builder.AddTypedTextChunk(
"bar:");
195 Builder.AddPlaceholderChunk(
"(type2)");
197 auto *CCS =
Builder.TakeString();
198 computeSignature(*CCS);
200 EXPECT_EQ(
Snippet,
"${1:(type2)}");
std::shared_ptr< clang::GlobalCodeCompletionAllocator > Allocator
std::string getReturnType(const CodeCompletionString &CCS)
Gets detail to be used as the detail field in an LSP completion item.
TEST_F(BackgroundIndexTest, NoCrashOnErrorFile)
std::string formatDocumentation(const CodeCompletionString &CCS, llvm::StringRef DocComment)
Assembles formatted documentation for a completion result.
CodeCompletionBuilder Builder
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
CodeCompletionTUInfo CCTUInfo
void getSignature(const CodeCompletionString &CCS, std::string *Signature, std::string *Snippet, std::string *RequiredQualifiers, bool CompletingPattern)
Formats the signature for an item, as a display string and snippet.