11 #include "clang/AST/ASTContext.h" 12 #include "clang/AST/DeclObjC.h" 13 #include "clang/AST/RawCommentList.h" 14 #include "clang/Basic/SourceManager.h" 21 bool isInformativeQualifierChunk(CodeCompletionString::Chunk
const &Chunk) {
22 return Chunk.Kind == CodeCompletionString::CK_Informative &&
23 llvm::StringRef(Chunk.Text).endswith(
"::");
26 void appendEscapeSnippet(
const llvm::StringRef Text, std::string *Out) {
27 for (
const auto Character : Text) {
28 if (Character ==
'$' || Character ==
'}' || Character ==
'\\')
30 Out->push_back(Character);
34 bool looksLikeDocComment(llvm::StringRef CommentText) {
40 return CommentText.find_first_not_of(
"/*-= \t\r\n") != llvm::StringRef::npos;
46 const CodeCompletionResult &
Result,
47 bool CommentsFromHeaders) {
51 if (Result.Kind != CodeCompletionResult::RK_Declaration)
53 return Result.getDeclaration() ?
getDeclComment(Ctx, *Result.getDeclaration())
58 if (isa<NamespaceDecl>(Decl)) {
65 const RawComment *RC = getCompletionComment(Ctx, &Decl);
70 assert(!Ctx.getSourceManager().isLoadedSourceLocation(RC->getBeginLoc()));
72 RC->getFormattedText(Ctx.getSourceManager(), Ctx.getDiagnostics());
73 return looksLikeDocComment(Doc) ? Doc :
"";
77 std::string *Snippet, std::string *RequiredQualifiers) {
78 unsigned ArgCount = 0;
79 bool HadObjCArguments =
false;
80 for (
const auto &Chunk : CCS) {
83 if (isInformativeQualifierChunk(Chunk))
87 case CodeCompletionString::CK_TypedText:
99 if (!llvm::StringRef(Chunk.Text).endswith(
":")) {
100 if (RequiredQualifiers)
101 *RequiredQualifiers = std::move(*Signature);
111 if (!HadObjCArguments) {
112 HadObjCArguments =
true;
115 *Signature += Chunk.Text;
116 *Snippet += Chunk.Text;
120 case CodeCompletionString::CK_Text:
121 *Signature += Chunk.Text;
122 *Snippet += Chunk.Text;
124 case CodeCompletionString::CK_Optional:
126 case CodeCompletionString::CK_Placeholder:
127 *Signature += Chunk.Text;
129 *Snippet +=
"${" + std::to_string(ArgCount) +
':';
130 appendEscapeSnippet(Chunk.Text, Snippet);
133 case CodeCompletionString::CK_Informative:
136 *Signature += Chunk.Text;
139 case CodeCompletionString::CK_ResultType:
142 case CodeCompletionString::CK_CurrentParameter:
145 llvm_unreachable(
"Unexpected CK_CurrentParameter while collecting " 148 case CodeCompletionString::CK_LeftParen:
149 case CodeCompletionString::CK_RightParen:
150 case CodeCompletionString::CK_LeftBracket:
151 case CodeCompletionString::CK_RightBracket:
152 case CodeCompletionString::CK_LeftBrace:
153 case CodeCompletionString::CK_RightBrace:
154 case CodeCompletionString::CK_LeftAngle:
155 case CodeCompletionString::CK_RightAngle:
156 case CodeCompletionString::CK_Comma:
157 case CodeCompletionString::CK_Colon:
158 case CodeCompletionString::CK_SemiColon:
159 case CodeCompletionString::CK_Equal:
160 case CodeCompletionString::CK_HorizontalSpace:
161 *Signature += Chunk.Text;
162 *Snippet += Chunk.Text;
164 case CodeCompletionString::CK_VerticalSpace:
165 *Snippet += Chunk.Text;
173 llvm::StringRef DocComment) {
177 const unsigned AnnotationCount = CCS.getAnnotationCount();
178 if (AnnotationCount > 0) {
179 Result +=
"Annotation";
180 if (AnnotationCount == 1) {
185 for (
unsigned I = 0; I < AnnotationCount; ++I) {
186 Result += CCS.getAnnotation(I);
187 Result.push_back(I == AnnotationCount - 1 ?
'\n' :
' ');
191 if (!DocComment.empty()) {
192 if (!Result.empty()) {
195 Result.push_back(
'\n');
197 Result += DocComment;
203 for (
const auto &Chunk : CCS)
204 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.
llvm::Optional< llvm::Expected< tooling::AtomicChanges > > Result
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.
void getSignature(const CodeCompletionString &CCS, std::string *Signature, std::string *Snippet, std::string *RequiredQualifiers)
Formats the signature for an item, as a display string and snippet.
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//