11 #include "clang/AST/ASTContext.h" 12 #include "clang/AST/DeclObjC.h" 13 #include "clang/AST/RawCommentList.h" 14 #include "clang/Basic/SourceManager.h" 22 bool isInformativeQualifierChunk(CodeCompletionString::Chunk
const &Chunk) {
23 return Chunk.Kind == CodeCompletionString::CK_Informative &&
24 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 auto *Decl = Result.getDeclaration();
55 if (!Decl || llvm::isa<NamespaceDecl>(Decl)) {
62 const RawComment *RC = getCompletionComment(Ctx, Decl);
68 assert(!Ctx.getSourceManager().isLoadedSourceLocation(RC->getLocStart()));
69 std::string Doc = RC->getFormattedText(Ctx.getSourceManager(), Ctx.getDiagnostics());
70 if (!looksLikeDocComment(Doc))
77 const CodeCompleteConsumer::OverloadCandidate &Result,
78 unsigned ArgIndex,
bool CommentsFromHeaders) {
79 auto *Func = Result.getFunction();
82 const RawComment *RC = getParameterComment(Ctx, Result, ArgIndex);
87 assert(!Ctx.getSourceManager().isLoadedSourceLocation(RC->getLocStart()));
88 std::string Doc = RC->getFormattedText(Ctx.getSourceManager(), Ctx.getDiagnostics());
89 if (!looksLikeDocComment(Doc))
95 std::string *Snippet, std::string *RequiredQualifiers) {
96 unsigned ArgCount = 0;
97 for (
const auto &Chunk : CCS) {
100 if (isInformativeQualifierChunk(Chunk))
103 switch (Chunk.Kind) {
104 case CodeCompletionString::CK_TypedText:
109 if (RequiredQualifiers)
110 *RequiredQualifiers = std::move(*Signature);
114 case CodeCompletionString::CK_Text:
115 *Signature += Chunk.Text;
116 *Snippet += Chunk.Text;
118 case CodeCompletionString::CK_Optional:
120 case CodeCompletionString::CK_Placeholder:
121 *Signature += Chunk.Text;
123 *Snippet +=
"${" + std::to_string(ArgCount) +
':';
124 appendEscapeSnippet(Chunk.Text, Snippet);
127 case CodeCompletionString::CK_Informative:
130 *Signature += Chunk.Text;
133 case CodeCompletionString::CK_ResultType:
136 case CodeCompletionString::CK_CurrentParameter:
139 llvm_unreachable(
"Unexpected CK_CurrentParameter while collecting " 142 case CodeCompletionString::CK_LeftParen:
143 case CodeCompletionString::CK_RightParen:
144 case CodeCompletionString::CK_LeftBracket:
145 case CodeCompletionString::CK_RightBracket:
146 case CodeCompletionString::CK_LeftBrace:
147 case CodeCompletionString::CK_RightBrace:
148 case CodeCompletionString::CK_LeftAngle:
149 case CodeCompletionString::CK_RightAngle:
150 case CodeCompletionString::CK_Comma:
151 case CodeCompletionString::CK_Colon:
152 case CodeCompletionString::CK_SemiColon:
153 case CodeCompletionString::CK_Equal:
154 case CodeCompletionString::CK_HorizontalSpace:
155 *Signature += Chunk.Text;
156 *Snippet += Chunk.Text;
158 case CodeCompletionString::CK_VerticalSpace:
159 *Snippet += Chunk.Text;
167 llvm::StringRef DocComment) {
171 const unsigned AnnotationCount = CCS.getAnnotationCount();
172 if (AnnotationCount > 0) {
173 Result +=
"Annotation";
174 if (AnnotationCount == 1) {
179 for (
unsigned I = 0; I < AnnotationCount; ++I) {
180 Result += CCS.getAnnotation(I);
181 Result.push_back(I == AnnotationCount - 1 ?
'\n' :
' ');
185 if (!DocComment.empty()) {
186 if (!Result.empty()) {
189 Result.push_back(
'\n');
191 Result += DocComment;
197 for (
const auto &Chunk : CCS)
198 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.
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++ -*-===//
tooling::ExecutionContext * Ctx
std::string getParameterDocComment(const ASTContext &Ctx, const CodeCompleteConsumer::OverloadCandidate &Result, unsigned ArgIndex, bool CommentsFromHeaders)
Gets a minimally formatted documentation for parameter of Result, corresponding to argument number Ar...