101 if (isa<NamespaceDecl>(Decl)) {
109 const RawComment *RC =
nullptr;
115 isa<ParmVarDecl, TemplateTypeParmDecl>(Decl)) {
118 const NamedDecl *ND = dyn_cast<NamedDecl>(Decl.getDeclContext());
122 RC = getCompletionComment(Ctx, ND);
128 assert(!Ctx.getSourceManager().isLoadedSourceLocation(RC->getBeginLoc()));
130 std::string DeclDoc =
131 RC->getFormattedText(Ctx.getSourceManager(), Ctx.getDiagnostics());
132 if (!looksLikeDocComment(DeclDoc))
137 llvm::raw_string_ostream OS(RawDoc);
139 if (
auto *PVD = dyn_cast<ParmVarDecl>(&Decl))
143 cast<TemplateTypeParmDecl>(&Decl)->getName(), OS);
145 Doc = StringRef(RawDoc).trim().str();
147 RC = getCompletionComment(Ctx, &Decl);
152 assert(!Ctx.getSourceManager().isLoadedSourceLocation(RC->getBeginLoc()));
153 Doc = RC->getFormattedText(Ctx.getSourceManager(), Ctx.getDiagnostics());
154 if (!looksLikeDocComment(Doc))
159 if (!llvm::json::isUTF8(Doc))
160 Doc = llvm::json::fixUTF8(Doc);
164void getSignature(
const CodeCompletionString &CCS, std::string *Signature,
166 CodeCompletionResult::ResultKind ResultKind,
167 CXCursorKind CursorKind,
bool IncludeFunctionArguments,
168 std::string *RequiredQualifiers) {
171 unsigned CursorSnippetArg = std::numeric_limits<unsigned>::max();
179 if (shouldPatchPlaceholder0(ResultKind, CursorKind)) {
181 llvm::count_if(CCS, [](
const CodeCompletionString::Chunk &C) {
182 return C.Kind == CodeCompletionString::CK_Placeholder;
185 unsigned SnippetArg = 0;
186 bool HadObjCArguments =
false;
187 bool HadInformativeChunks =
false;
189 std::optional<unsigned> TruncateSnippetAt;
190 for (
const auto &Chunk : CCS) {
193 if (isInformativeQualifierChunk(Chunk))
196 switch (Chunk.Kind) {
197 case CodeCompletionString::CK_TypedText:
213 if (!llvm::StringRef(Chunk.Text).ends_with(
":")) {
214 if (RequiredQualifiers)
215 *RequiredQualifiers = std::move(*Signature);
225 if (!HadObjCArguments) {
226 HadObjCArguments =
true;
244 if (!HadInformativeChunks) {
245 if (RequiredQualifiers)
246 *RequiredQualifiers = std::move(*Signature);
251 *Signature += Chunk.Text;
256 case CodeCompletionString::CK_Text:
257 *Signature += Chunk.Text;
260 case CodeCompletionString::CK_Optional:
261 assert(Chunk.Optional);
263 appendOptionalChunk(*Chunk.Optional, Signature);
265 case CodeCompletionString::CK_Placeholder:
266 *Signature += Chunk.Text;
268 if (SnippetArg == CursorSnippetArg) {
273 *
Snippet +=
"${" + std::to_string(SnippetArg) +
':';
274 appendEscapeSnippet(Chunk.Text,
Snippet);
278 case CodeCompletionString::CK_Informative:
279 HadInformativeChunks =
true;
282 *Signature += Chunk.Text;
285 case CodeCompletionString::CK_ResultType:
288 case CodeCompletionString::CK_CurrentParameter:
291 llvm_unreachable(
"Unexpected CK_CurrentParameter while collecting "
294 case CodeCompletionString::CK_LeftParen:
298 if (!IncludeFunctionArguments &&
299 ResultKind == CodeCompletionResult::RK_Declaration)
300 TruncateSnippetAt.emplace(
Snippet->size());
302 case CodeCompletionString::CK_RightParen:
303 case CodeCompletionString::CK_LeftBracket:
304 case CodeCompletionString::CK_RightBracket:
305 case CodeCompletionString::CK_LeftBrace:
306 case CodeCompletionString::CK_RightBrace:
307 case CodeCompletionString::CK_LeftAngle:
308 case CodeCompletionString::CK_RightAngle:
309 case CodeCompletionString::CK_Comma:
310 case CodeCompletionString::CK_Colon:
311 case CodeCompletionString::CK_SemiColon:
312 case CodeCompletionString::CK_Equal:
313 case CodeCompletionString::CK_HorizontalSpace:
314 *Signature += Chunk.Text;
317 case CodeCompletionString::CK_VerticalSpace:
323 if (TruncateSnippetAt)
void getSignature(const CodeCompletionString &CCS, std::string *Signature, std::string *Snippet, CodeCompletionResult::ResultKind ResultKind, CXCursorKind CursorKind, bool IncludeFunctionArguments, std::string *RequiredQualifiers)
Formats the signature for an item, as a display string and snippet.