11#include "clang/Sema/CodeCompleteConsumer.h"
12#include "gmock/gmock.h"
13#include "gtest/gtest.h"
19class CompletionStringTest :
public ::testing::Test {
21 CompletionStringTest()
22 : Allocator(std::make_shared<
clang::GlobalCodeCompletionAllocator>()),
23 CCTUInfo(Allocator),
Builder(*Allocator, CCTUInfo) {}
26 void computeSignature(
const CodeCompletionString &CCS,
27 CodeCompletionResult::ResultKind ResultKind =
28 CodeCompletionResult::ResultKind::RK_Declaration) {
32 CXCursorKind::CXCursor_NotImplemented,
36 std::shared_ptr<clang::GlobalCodeCompletionAllocator> Allocator;
37 CodeCompletionTUInfo CCTUInfo;
44 Builder.AddResultTypeChunk(
"result");
45 Builder.AddResultTypeChunk(
"redundant result no no");
49TEST_F(CompletionStringTest, Documentation) {
50 Builder.addBriefComment(
"This is ignored");
55TEST_F(CompletionStringTest, DocumentationWithAnnotation) {
56 Builder.addBriefComment(
"This is ignored");
59 "Annotation: Ano\n\nIs this brief?");
62TEST_F(CompletionStringTest, GetDeclCommentBadUTF8) {
65 auto AST = TU.build();
66 EXPECT_EQ(
"x\xef\xbf\xbdy",
70TEST_F(CompletionStringTest, MultipleAnnotations) {
76 "Annotations: Ano1 Ano2 Ano3\n");
79TEST_F(CompletionStringTest, EmptySignature) {
81 Builder.AddResultTypeChunk(
"result no no");
82 computeSignature(*
Builder.TakeString());
88 Builder.AddResultTypeChunk(
"result no no");
89 Builder.addBriefComment(
"This comment is ignored");
90 Builder.AddTypedTextChunk(
"Foo");
91 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
92 Builder.AddPlaceholderChunk(
"p1");
93 Builder.AddChunk(CodeCompletionString::CK_Comma);
94 Builder.AddPlaceholderChunk(
"p2");
95 Builder.AddChunk(CodeCompletionString::CK_RightParen);
97 auto *CCS =
Builder.TakeString();
98 computeSignature(*CCS);
100 EXPECT_EQ(
Snippet,
"(${1:p1}, ${2:p2})");
104TEST_F(CompletionStringTest, FunctionWithDefaultParams) {
106 Builder.AddChunk(CodeCompletionString::CK_Comma);
107 Builder.AddTypedTextChunk(
"p3 = 0");
108 auto *DefaultParam2 =
Builder.TakeString();
110 Builder.AddChunk(CodeCompletionString::CK_Comma);
111 Builder.AddTypedTextChunk(
"p2 = 0");
112 Builder.AddOptionalChunk(DefaultParam2);
113 auto *DefaultParam1 =
Builder.TakeString();
115 Builder.AddResultTypeChunk(
"return_type");
116 Builder.AddTypedTextChunk(
"Foo");
117 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
118 Builder.AddPlaceholderChunk(
"p1");
119 Builder.AddOptionalChunk(DefaultParam1);
120 Builder.AddChunk(CodeCompletionString::CK_RightParen);
122 auto *CCS =
Builder.TakeString();
123 computeSignature(*CCS);
124 EXPECT_EQ(
Signature,
"(p1, p2 = 0, p3 = 0)");
125 EXPECT_EQ(
Snippet,
"(${1:p1})");
128TEST_F(CompletionStringTest, EscapeSnippet) {
129 Builder.AddTypedTextChunk(
"Foo");
130 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
131 Builder.AddPlaceholderChunk(
"$p}1\\");
132 Builder.AddChunk(CodeCompletionString::CK_RightParen);
134 computeSignature(*
Builder.TakeString());
136 EXPECT_EQ(
Snippet,
"(${1:\\$p\\}1\\\\})");
139TEST_F(CompletionStringTest, SnippetsInPatterns) {
140 auto MakeCCS = [
this]() ->
const CodeCompletionString & {
141 CodeCompletionBuilder
Builder(*Allocator, CCTUInfo);
142 Builder.AddTypedTextChunk(
"namespace");
143 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
144 Builder.AddPlaceholderChunk(
"name");
145 Builder.AddChunk(CodeCompletionString::CK_Equal);
146 Builder.AddPlaceholderChunk(
"target");
147 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
150 computeSignature(MakeCCS());
151 EXPECT_EQ(
Snippet,
" ${1:name} = ${2:target};");
154 computeSignature(MakeCCS(),
155 CodeCompletionResult::ResultKind::RK_Pattern);
156 EXPECT_EQ(
Snippet,
" ${1:name} = $0;");
159TEST_F(CompletionStringTest, IgnoreInformativeQualifier) {
160 Builder.AddTypedTextChunk(
"X");
161 Builder.AddInformativeChunk(
"info ok");
162 Builder.AddInformativeChunk(
"info no no::");
163 computeSignature(*
Builder.TakeString());
168TEST_F(CompletionStringTest, ObjectiveCMethodNoArguments) {
169 Builder.AddResultTypeChunk(
"void");
170 Builder.AddTypedTextChunk(
"methodName");
172 auto *CCS =
Builder.TakeString();
173 computeSignature(*CCS);
178TEST_F(CompletionStringTest, ObjectiveCMethodOneArgument) {
179 Builder.AddResultTypeChunk(
"void");
180 Builder.AddTypedTextChunk(
"methodWithArg:");
181 Builder.AddPlaceholderChunk(
"(type)");
183 auto *CCS =
Builder.TakeString();
184 computeSignature(*CCS);
186 EXPECT_EQ(
Snippet,
"${1:(type)}");
189TEST_F(CompletionStringTest, ObjectiveCMethodTwoArgumentsFromBeginning) {
190 Builder.AddResultTypeChunk(
"int");
191 Builder.AddTypedTextChunk(
"withFoo:");
192 Builder.AddPlaceholderChunk(
"(type)");
193 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
194 Builder.AddTypedTextChunk(
"bar:");
195 Builder.AddPlaceholderChunk(
"(type2)");
197 auto *CCS =
Builder.TakeString();
198 computeSignature(*CCS);
199 EXPECT_EQ(
Signature,
"(type) bar:(type2)");
200 EXPECT_EQ(
Snippet,
"${1:(type)} bar:${2:(type2)}");
203TEST_F(CompletionStringTest, ObjectiveCMethodTwoArgumentsFromMiddle) {
204 Builder.AddResultTypeChunk(
"int");
205 Builder.AddInformativeChunk(
"withFoo:");
206 Builder.AddTypedTextChunk(
"bar:");
207 Builder.AddPlaceholderChunk(
"(type2)");
209 auto *CCS =
Builder.TakeString();
210 computeSignature(*CCS);
212 EXPECT_EQ(
Snippet,
"${1:(type2)}");
CodeCompletionBuilder Builder
std::string formatDocumentation(const CodeCompletionString &CCS, llvm::StringRef DocComment)
Assembles formatted documentation for a completion result.
TEST_F(BackgroundIndexTest, NoCrashOnErrorFile)
const NamedDecl & findDecl(ParsedAST &AST, llvm::StringRef QName)
std::string getDeclComment(const ASTContext &Ctx, const NamedDecl &Decl)
Similar to getDocComment, but returns the comment for a NamedDecl.
std::string getReturnType(const CodeCompletionString &CCS)
Gets detail to be used as the detail field in an LSP completion item.
void getSignature(const CodeCompletionString &CCS, std::string *Signature, std::string *Snippet, CodeCompletionResult::ResultKind ResultKind, CXCursorKind CursorKind, std::string *RequiredQualifiers)
Formats the signature for an item, as a display string and snippet.
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
static TestTU withCode(llvm::StringRef Code)