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, EscapeSnippet) {
94 Builder.AddTypedTextChunk(
"Foo");
95 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
96 Builder.AddPlaceholderChunk(
"$p}1\\");
97 Builder.AddChunk(CodeCompletionString::CK_RightParen);
99 computeSignature(*
Builder.TakeString());
101 EXPECT_EQ(
Snippet,
"(${1:\\$p\\}1\\\\})");
104 TEST_F(CompletionStringTest, SnippetsInPatterns) {
105 auto MakeCCS = [
this]() ->
const CodeCompletionString & {
107 Builder.AddTypedTextChunk(
"namespace");
108 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
109 Builder.AddPlaceholderChunk(
"name");
110 Builder.AddChunk(CodeCompletionString::CK_Equal);
111 Builder.AddPlaceholderChunk(
"target");
112 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
113 return *Builder.TakeString();
115 computeSignature(MakeCCS(),
false);
116 EXPECT_EQ(
Snippet,
" ${1:name} = ${2:target};");
119 computeSignature(MakeCCS(),
true);
120 EXPECT_EQ(
Snippet,
" ${1:name} = ${0:target};");
123 TEST_F(CompletionStringTest, IgnoreInformativeQualifier) {
124 Builder.AddTypedTextChunk(
"X");
125 Builder.AddInformativeChunk(
"info ok");
126 Builder.AddInformativeChunk(
"info no no::");
127 computeSignature(*
Builder.TakeString());
132 TEST_F(CompletionStringTest, ObjectiveCMethodNoArguments) {
133 Builder.AddResultTypeChunk(
"void");
134 Builder.AddTypedTextChunk(
"methodName");
136 auto *CCS =
Builder.TakeString();
137 computeSignature(*CCS);
142 TEST_F(CompletionStringTest, ObjectiveCMethodOneArgument) {
143 Builder.AddResultTypeChunk(
"void");
144 Builder.AddTypedTextChunk(
"methodWithArg:");
145 Builder.AddPlaceholderChunk(
"(type)");
147 auto *CCS =
Builder.TakeString();
148 computeSignature(*CCS);
150 EXPECT_EQ(
Snippet,
"${1:(type)}");
153 TEST_F(CompletionStringTest, ObjectiveCMethodTwoArgumentsFromBeginning) {
154 Builder.AddResultTypeChunk(
"int");
155 Builder.AddTypedTextChunk(
"withFoo:");
156 Builder.AddPlaceholderChunk(
"(type)");
157 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
158 Builder.AddTypedTextChunk(
"bar:");
159 Builder.AddPlaceholderChunk(
"(type2)");
161 auto *CCS =
Builder.TakeString();
162 computeSignature(*CCS);
163 EXPECT_EQ(
Signature,
"(type) bar:(type2)");
164 EXPECT_EQ(
Snippet,
"${1:(type)} bar:${2:(type2)}");
167 TEST_F(CompletionStringTest, ObjectiveCMethodTwoArgumentsFromMiddle) {
168 Builder.AddResultTypeChunk(
"int");
169 Builder.AddInformativeChunk(
"withFoo:");
170 Builder.AddTypedTextChunk(
"bar:");
171 Builder.AddPlaceholderChunk(
"(type2)");
173 auto *CCS =
Builder.TakeString();
174 computeSignature(*CCS);
176 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.