static Optional<DocComment *> getAnyBaseClassDocComment(swift::markup::MarkupContext &MC, const ClassDecl *CD, const Decl *D) { RawComment RC; if (const auto *VD = dyn_cast<ValueDecl>(D)) { const auto *BaseDecl = VD->getOverriddenDecl(); while (BaseDecl) { RC = BaseDecl->getRawComment(); if (!RC.isEmpty()) { swift::markup::LineList LL = MC.getLineList(RC); auto *Doc = swift::markup::parseDocument(MC, LL); auto Parts = extractCommentParts(MC, Doc); SmallString<48> RawCascadeText; llvm::raw_svector_ostream OS(RawCascadeText); OS << "This documentation comment was inherited from "; auto *Text = swift::markup::Text::create(MC, MC.allocateCopy(OS.str())); auto BaseClass = BaseDecl->getDeclContext()->getAsClassOrClassExtensionContext(); auto *BaseClassMonospace = swift::markup::Code::create(MC, MC.allocateCopy(BaseClass->getNameStr())); auto *Period = swift::markup::Text::create(MC, "."); auto *Para = swift::markup::Paragraph::create(MC, { Text, BaseClassMonospace, Period }); auto CascadeNote = swift::markup::NoteField::create(MC, {Para}); SmallVector<const swift::markup::MarkupASTNode *, 8> BodyNodes { Parts.BodyNodes.begin(), Parts.BodyNodes.end() }; BodyNodes.push_back(CascadeNote); Parts.BodyNodes = MC.allocateCopy(llvm::makeArrayRef(BodyNodes)); return new (MC) DocComment(D, Doc, Parts); } BaseDecl = BaseDecl->getOverriddenDecl(); } } return None; }
Optional<DocComment *> swift::getSingleDocComment(swift::markup::MarkupContext &MC, const Decl *D) { PrettyStackTraceDecl StackTrace("parsing comment for", D); auto RC = D->getRawComment(); if (RC.isEmpty()) return None; swift::markup::LineList LL = MC.getLineList(RC); auto *Doc = swift::markup::parseDocument(MC, LL); auto Parts = extractCommentParts(MC, Doc); return new (MC) DocComment(D, Doc, Parts); }
static LineList getLineListFromComment(SourceManager &SourceMgr, swift::markup::MarkupContext &MC, const StringRef Text) { LangOptions LangOpts; auto Tokens = swift::tokenize(LangOpts, SourceMgr, SourceMgr.addMemBufferCopy(Text)); std::vector<SingleRawComment> Comments; Comments.reserve(Tokens.size()); for (auto &Tok : Tokens) { if (Tok.is(tok::comment)) { Comments.push_back(SingleRawComment(Tok.getText(), 0)); } } if (Comments.empty()) return {}; RawComment Comment(Comments); return MC.getLineList(Comment); }