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 comments::FullComment *FC = RC->parse(Ctx,
nullptr, ND);
136 llvm::raw_string_ostream OS(RawDoc);
138 if (
auto *PVD = dyn_cast<ParmVarDecl>(&Decl))
142 cast<TemplateTypeParmDecl>(&Decl)->getName(), OS);
144 Doc = StringRef(RawDoc).trim().str();
146 RC = getCompletionComment(Ctx, &Decl);
151 assert(!Ctx.getSourceManager().isLoadedSourceLocation(RC->getBeginLoc()));
152 Doc = RC->getFormattedText(Ctx.getSourceManager(), Ctx.getDiagnostics());
153 if (!looksLikeDocComment(Doc))
158 if (!llvm::json::isUTF8(Doc))
159 Doc = llvm::json::fixUTF8(Doc);
163void getSignature(
const CodeCompletionString &CCS, std::string *Signature,
165 CodeCompletionResult::ResultKind ResultKind,
166 CXCursorKind CursorKind,
bool IncludeFunctionArguments,
167 std::string *RequiredQualifiers) {
170 unsigned CursorSnippetArg = std::numeric_limits<unsigned>::max();
178 if (shouldPatchPlaceholder0(ResultKind, CursorKind)) {
180 llvm::count_if(CCS, [](
const CodeCompletionString::Chunk &C) {
181 return C.Kind == CodeCompletionString::CK_Placeholder;
184 unsigned SnippetArg = 0;
185 bool HadObjCArguments =
false;
186 bool HadInformativeChunks =
false;
188 std::optional<unsigned> TruncateSnippetAt;
189 for (
const auto &Chunk : CCS) {
192 if (isInformativeQualifierChunk(Chunk))
195 switch (Chunk.Kind) {
196 case CodeCompletionString::CK_TypedText:
212 if (!llvm::StringRef(Chunk.Text).ends_with(
":")) {
213 if (RequiredQualifiers)
214 *RequiredQualifiers = std::move(*Signature);
224 if (!HadObjCArguments) {
225 HadObjCArguments =
true;
243 if (!HadInformativeChunks) {
244 if (RequiredQualifiers)
245 *RequiredQualifiers = std::move(*Signature);
250 *Signature += Chunk.Text;
255 case CodeCompletionString::CK_Text:
256 *Signature += Chunk.Text;
259 case CodeCompletionString::CK_Optional:
260 assert(Chunk.Optional);
262 appendOptionalChunk(*Chunk.Optional, Signature);
264 case CodeCompletionString::CK_Placeholder:
265 *Signature += Chunk.Text;
267 if (SnippetArg == CursorSnippetArg) {
272 *
Snippet +=
"${" + std::to_string(SnippetArg) +
':';
273 appendEscapeSnippet(Chunk.Text,
Snippet);
277 case CodeCompletionString::CK_Informative:
278 HadInformativeChunks =
true;
281 *Signature += Chunk.Text;
284 case CodeCompletionString::CK_ResultType:
287 case CodeCompletionString::CK_CurrentParameter:
290 llvm_unreachable(
"Unexpected CK_CurrentParameter while collecting "
293 case CodeCompletionString::CK_LeftParen:
297 if (!IncludeFunctionArguments &&
298 ResultKind == CodeCompletionResult::RK_Declaration)
299 TruncateSnippetAt.emplace(
Snippet->size());
301 case CodeCompletionString::CK_RightParen:
302 case CodeCompletionString::CK_LeftBracket:
303 case CodeCompletionString::CK_RightBracket:
304 case CodeCompletionString::CK_LeftBrace:
305 case CodeCompletionString::CK_RightBrace:
306 case CodeCompletionString::CK_LeftAngle:
307 case CodeCompletionString::CK_RightAngle:
308 case CodeCompletionString::CK_Comma:
309 case CodeCompletionString::CK_Colon:
310 case CodeCompletionString::CK_SemiColon:
311 case CodeCompletionString::CK_Equal:
312 case CodeCompletionString::CK_HorizontalSpace:
313 *Signature += Chunk.Text;
316 case CodeCompletionString::CK_VerticalSpace:
322 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.