10 #include "clang/AST/ASTContext.h" 11 #include "clang/AST/DeclObjC.h" 12 #include "clang/AST/RawCommentList.h" 13 #include "clang/Basic/SourceManager.h" 14 #include "clang/Sema/CodeCompleteConsumer.h" 22 bool isInformativeQualifierChunk(CodeCompletionString::Chunk
const &Chunk) {
23 return Chunk.Kind == CodeCompletionString::CK_Informative &&
24 llvm::StringRef(Chunk.Text).endswith(
"::");
27 void appendEscapeSnippet(
const llvm::StringRef Text, std::string *Out) {
28 for (
const auto Character : Text) {
29 if (Character ==
'$' || Character ==
'}' || Character ==
'\\')
31 Out->push_back(Character);
35 bool looksLikeDocComment(llvm::StringRef CommentText) {
41 return CommentText.find_first_not_of(
"/*-= \t\r\n") != llvm::StringRef::npos;
47 const CodeCompletionResult &
Result,
48 bool CommentsFromHeaders) {
52 if (Result.Kind != CodeCompletionResult::RK_Declaration)
54 return Result.getDeclaration() ?
getDeclComment(Ctx, *Result.getDeclaration())
59 if (isa<NamespaceDecl>(Decl)) {
66 const RawComment *RC = getCompletionComment(Ctx, &Decl);
71 assert(!Ctx.getSourceManager().isLoadedSourceLocation(RC->getBeginLoc()));
73 RC->getFormattedText(Ctx.getSourceManager(), Ctx.getDiagnostics());
74 return looksLikeDocComment(Doc) ? Doc :
"";
78 std::string *Snippet, std::string *RequiredQualifiers,
79 bool CompletingPattern) {
82 unsigned CursorSnippetArg = std::numeric_limits<unsigned>::max();
83 if (CompletingPattern) {
90 llvm::count_if(CCS, [](
const CodeCompletionString::Chunk &C) {
91 return C.Kind == CodeCompletionString::CK_Placeholder;
94 unsigned SnippetArg = 0;
95 bool HadObjCArguments =
false;
96 for (
const auto &Chunk : CCS) {
99 if (isInformativeQualifierChunk(Chunk))
102 switch (Chunk.Kind) {
103 case CodeCompletionString::CK_TypedText:
115 if (!llvm::StringRef(Chunk.Text).endswith(
":")) {
116 if (RequiredQualifiers)
117 *RequiredQualifiers = std::move(*Signature);
127 if (!HadObjCArguments) {
128 HadObjCArguments =
true;
131 *Signature += Chunk.Text;
132 *Snippet += Chunk.Text;
136 case CodeCompletionString::CK_Text:
137 *Signature += Chunk.Text;
138 *Snippet += Chunk.Text;
140 case CodeCompletionString::CK_Optional:
142 case CodeCompletionString::CK_Placeholder:
143 *Signature += Chunk.Text;
147 std::to_string(SnippetArg == CursorSnippetArg ? 0 : SnippetArg) +
':';
148 appendEscapeSnippet(Chunk.Text, Snippet);
151 case CodeCompletionString::CK_Informative:
154 *Signature += Chunk.Text;
157 case CodeCompletionString::CK_ResultType:
160 case CodeCompletionString::CK_CurrentParameter:
163 llvm_unreachable(
"Unexpected CK_CurrentParameter while collecting " 166 case CodeCompletionString::CK_LeftParen:
167 case CodeCompletionString::CK_RightParen:
168 case CodeCompletionString::CK_LeftBracket:
169 case CodeCompletionString::CK_RightBracket:
170 case CodeCompletionString::CK_LeftBrace:
171 case CodeCompletionString::CK_RightBrace:
172 case CodeCompletionString::CK_LeftAngle:
173 case CodeCompletionString::CK_RightAngle:
174 case CodeCompletionString::CK_Comma:
175 case CodeCompletionString::CK_Colon:
176 case CodeCompletionString::CK_SemiColon:
177 case CodeCompletionString::CK_Equal:
178 case CodeCompletionString::CK_HorizontalSpace:
179 *Signature += Chunk.Text;
180 *Snippet += Chunk.Text;
182 case CodeCompletionString::CK_VerticalSpace:
183 *Snippet += Chunk.Text;
191 llvm::StringRef DocComment) {
195 const unsigned AnnotationCount = CCS.getAnnotationCount();
196 if (AnnotationCount > 0) {
197 Result +=
"Annotation";
198 if (AnnotationCount == 1) {
203 for (
unsigned I = 0; I < AnnotationCount; ++I) {
204 Result += CCS.getAnnotation(I);
205 Result.push_back(I == AnnotationCount - 1 ?
'\n' :
' ');
209 if (!DocComment.empty()) {
210 if (!Result.empty()) {
213 Result.push_back(
'\n');
215 Result += DocComment;
221 for (
const auto &Chunk : CCS)
222 if (Chunk.Kind == CodeCompletionString::CK_ResultType)
std::string getDocComment(const ASTContext &Ctx, const CodeCompletionResult &Result, bool CommentsFromHeaders)
Gets a minimally formatted documentation comment of Result, with comment markers stripped.
std::string getReturnType(const CodeCompletionString &CCS)
Gets detail to be used as the detail field in an LSP completion item.
std::string formatDocumentation(const CodeCompletionString &CCS, llvm::StringRef DocComment)
Assembles formatted documentation for a completion result.
std::string getDeclComment(const ASTContext &Ctx, const NamedDecl &Decl)
Similar to getDocComment, but returns the comment for a NamedDecl.
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
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.
llvm::Optional< llvm::Expected< tooling::AtomicChanges > > Result