Doxygen
Loading...
Searching...
No Matches
docparser.h File Reference
#include <stdio.h>
#include <memory>
#include "qcstring.h"
#include "growvector.h"
#include "construct.h"
#include "types.h"
#include "docoptions.h"
Include dependency graph for docparser.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  IDocParser
 opaque parser interface More...
class  IDocNodeAST
 opaque representation of the abstract syntax tree (AST) More...

Typedefs

using IDocParserPtr = std::unique_ptr<IDocParser>
 pointer to parser interface
using IDocNodeASTPtr = std::unique_ptr<IDocNodeAST>

Functions

IDocParserPtr createDocParser ()
 factory function to create a parser
IDocNodeASTPtr validatingParseDoc (IDocParser &parserIntf, const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &input, const DocOptions &options)
IDocNodeASTPtr validatingParseText (IDocParser &parser, const QCString &input)
IDocNodeASTPtr validatingParseTitle (IDocParser &parserIntf, const QCString &fileName, int lineNr, const QCString &input)
IDocNodeASTPtr createRef (IDocParser &parser, const QCString &target, const QCString &context, const QCString &srcFile="", int srcLine=-1)
void docFindSections (const QCString &input, const Definition *d, const QCString &fileName)

Typedef Documentation

◆ IDocNodeASTPtr

using IDocNodeASTPtr = std::unique_ptr<IDocNodeAST>

Definition at line 57 of file docparser.h.

◆ IDocParserPtr

using IDocParserPtr = std::unique_ptr<IDocParser>

pointer to parser interface

Definition at line 41 of file docparser.h.

Function Documentation

◆ createDocParser()

◆ createRef()

IDocNodeASTPtr createRef ( IDocParser & parser,
const QCString & target,
const QCString & context,
const QCString & srcFile = "",
int srcLine = -1 )

Definition at line 2305 of file docparser.cpp.

2306{
2307 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2308 assert(parser!=nullptr);
2309 if (parser==nullptr) return nullptr;
2310 if (!srcFile.isEmpty())
2311 {
2312 parser->context.fileName = srcFile;
2313 parser->tokenizer.setFileName(srcFile);
2314 parser->tokenizer.setLineNr(srcLine);
2315 }
2316 return std::make_unique<DocNodeAST>(DocRef(parser,nullptr,target,context));
2317}
DocTokenizer tokenizer
DocParserContext context
Node representing a reference to some item.
Definition docnode.h:778
void setLineNr(int lineno)
void setFileName(const QCString &fileName)
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
QCString fileName
Definition docparser_p.h:71

References DocParser::context, DocParserContext::fileName, QCString::isEmpty(), DocTokenizer::setFileName(), DocTokenizer::setLineNr(), and DocParser::tokenizer.

Referenced by convertMapFile(), replaceRef(), and LayoutNavEntry::url().

◆ docFindSections()

void docFindSections ( const QCString & input,
const Definition * d,
const QCString & fileName )

◆ validatingParseDoc()

IDocNodeASTPtr validatingParseDoc ( IDocParser & parserIntf,
const QCString & fileName,
int startLine,
const Definition * ctx,
const MemberDef * md,
const QCString & input,
const DocOptions & options )

Main entry point for the comment block parser.

Parameters
parserIntfThe parser object created via createDocParser()
fileNameFile in which the documentation block is found (or the name of the example file in case isExample is TRUE).
startLineLine at which the documentation block is found.
ctxClass or namespace to which this block belongs.
mdMember definition to which the documentation belongs. Can be 0.
inputString representation of the documentation block.
optionsOptional parameters.
Returns
An object representing the abstract syntax tree. Ownership of the pointer is handed over to the caller.

Definition at line 2051 of file docparser.cpp.

2058{
2059 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2060 assert(parser!=nullptr);
2061 if (parser==nullptr) return nullptr;
2062 //printf("validatingParseDoc(%s,%s)=[%s]\n",ctx?qPrint(ctx->name()):"<none>",
2063 // md?qPrint(md->name()):"<none>",
2064 // qPrint(input));
2065 //printf("========== validating %s at line %d\n",qPrint(fileName),startLine);
2066 //printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",qPrint(input));
2067
2068 // set initial token
2069 parser->context.token = parser->tokenizer.resetToken();
2070
2071 if (ctx && ctx!=Doxygen::globalScope &&
2074 )
2075 )
2076 {
2078 }
2079 else if (ctx && ctx->definitionType()==Definition::TypePage)
2080 {
2081 const Definition *scope = (toPageDef(ctx))->getPageScope();
2082 if (scope && scope!=Doxygen::globalScope)
2083 {
2084 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2085 }
2086 }
2087 else if (ctx && ctx->definitionType()==Definition::TypeGroup)
2088 {
2089 const Definition *scope = (toGroupDef(ctx))->getGroupScope();
2090 if (scope && scope!=Doxygen::globalScope)
2091 {
2092 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2093 }
2094 }
2095 else
2096 {
2097 parser->context.context = "";
2098 }
2099 parser->context.scope = ctx;
2100 parser->context.lang = getLanguageFromFileName(fileName);
2101
2102 if (options.indexWords() && Doxygen::searchIndex.enabled())
2103 {
2104 if (md)
2105 {
2106 parser->context.searchUrl=md->getOutputFileBase();
2107 Doxygen::searchIndex.setCurrentDoc(md,md->anchor(),false);
2108 }
2109 else if (ctx)
2110 {
2111 parser->context.searchUrl=ctx->getOutputFileBase();
2112 Doxygen::searchIndex.setCurrentDoc(ctx,ctx->anchor(),false);
2113 }
2114 }
2115 else
2116 {
2117 parser->context.searchUrl="";
2118 }
2119
2120 parser->context.fileName = fileName;
2121 parser->context.relPath = (!options.linkFromIndex() && ctx) ?
2123 QCString("");
2124 //printf("ctx->name=%s relPath=%s\n",qPrint(ctx->name()),qPrint(parser->context.relPath));
2125 parser->context.memberDef = md;
2126 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2127 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2128 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2129 parser->context.inSeeBlock = FALSE;
2130 parser->context.inCodeStyle = FALSE;
2131 parser->context.xmlComment = FALSE;
2132 parser->context.insideHtmlLink = FALSE;
2133 parser->context.includeFileText = "";
2134 parser->context.includeFileOffset = 0;
2135 parser->context.includeFileLength = 0;
2136 parser->context.isExample = options.isExample();
2137 parser->context.exampleName = options.exampleName();
2138 parser->context.hasParamCommand = FALSE;
2139 parser->context.hasReturnCommand = FALSE;
2140 parser->context.retvalsFound.clear();
2141 parser->context.paramsFound.clear();
2142 parser->context.markdownSupport = options.markdownSupport();
2143 parser->context.autolinkSupport = options.autolinkSupport();
2144 if (md)
2145 {
2146 const ArgumentList &al=md->isDocsForDefinition() ? md->argumentList() : md->declArgumentList();
2147 parser->context.numParameters = static_cast<int>(al.size());
2148 }
2149 else
2150 {
2151 parser->context.numParameters = 0;
2152 }
2153 parser->context.paramPosition = 1;
2154
2155 //printf("Starting comment block at %s:%d\n",qPrint(parser->context.fileName),startLine);
2156 parser->tokenizer.setFileName(fileName);
2157 parser->tokenizer.setLineNr(startLine);
2158 size_t ioLen = input.length();
2159 QCString inpStr = parser->processCopyDoc(input.data(),ioLen);
2160 if (inpStr.isEmpty() || inpStr.at(inpStr.length()-1)!='\n')
2161 {
2162 inpStr+='\n';
2163 }
2164 //printf("processCopyDoc(in='%s' out='%s')\n",qPrint(input),qPrint(inpStr));
2165 parser->tokenizer.init(inpStr.data(),parser->context.fileName,
2167
2168 // build abstract syntax tree
2169 auto ast = std::make_unique<DocNodeAST>(DocRoot(parser,md!=nullptr,options.singleLine()));
2170 std::get<DocRoot>(ast->root).parse();
2171
2173 {
2174 // pretty print the result
2175 std::visit(PrintDocVisitor{},ast->root);
2176 }
2177
2178 if (md && md->isFunction())
2179 {
2180 parser->checkUnOrMultipleDocumentedParams();
2181 }
2183
2184 // reset token
2185 parser->tokenizer.resetToken();
2186
2187 //printf(">>>>>> end validatingParseDoc(%s,%s)\n",ctx?qPrint(ctx->name()):"<none>",
2188 // md?qPrint(md->name()):"<none>");
2189
2190 return ast;
2191}
This class represents an function or template argument list.
Definition arguments.h:65
size_t size() const
Definition arguments.h:100
@ PrintTree
Definition debug.h:34
static bool isFlagSet(const DebugMask mask)
Definition debug.cpp:132
The common base class of all entity definitions found in the sources.
Definition definition.h:77
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual DefType definitionType() const =0
virtual QCString anchor() const =0
virtual QCString qualifiedName() const =0
virtual QCString getOutputFileBase() const =0
virtual const QCString & name() const =0
QCString processCopyDoc(const char *data, size_t &len)
Root node of documentation tree.
Definition docnode.h:1310
void init(const char *input, const QCString &fileName, bool markdownSupport, bool insideHtmlLink)
TokenInfo * resetToken()
static NamespaceDefMutable * globalScope
Definition doxygen.h:120
static SearchIndexIntf searchIndex
Definition doxygen.h:123
virtual const ArgumentList & argumentList() const =0
virtual bool isFunction() const =0
virtual bool isDocsForDefinition() const =0
virtual void detectUndocumentedParams(bool hasParamCommand, bool hasReturnCommand) const =0
virtual const ArgumentList & declArgumentList() const =0
This is an alternative implementation of QCString.
Definition qcstring.h:101
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:166
char & at(size_t i)
Returns a reference to the character at index i.
Definition qcstring.h:593
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition qcstring.h:172
GroupDef * toGroupDef(Definition *d)
PageDef * toPageDef(Definition *d)
Definition pagedef.cpp:502
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
Definition qcstring.cpp:571
#define FALSE
Definition qcstring.h:34
bool autolinkSupport() const
Definition docoptions.h:32
bool linkFromIndex() const
Definition docoptions.h:30
bool markdownSupport() const
Definition docoptions.h:31
QCString exampleName() const
Definition docoptions.h:28
bool indexWords() const
Definition docoptions.h:26
bool singleLine() const
Definition docoptions.h:29
bool isExample() const
Definition docoptions.h:27
StringMultiSet retvalsFound
Definition docparser_p.h:76
DocStyleChangeStack styleStack
Definition docparser_p.h:68
size_t includeFileLength
Definition docparser_p.h:90
DocNodeStack nodeStack
Definition docparser_p.h:67
StringMultiSet paramsFound
Definition docparser_p.h:77
QCString exampleName
Definition docparser_p.h:82
const Definition * scope
Definition docparser_p.h:61
QCString includeFileText
Definition docparser_p.h:88
TokenInfo * token
Definition docparser_p.h:95
DocStyleChangeStack initialStyleStack
Definition docparser_p.h:69
SrcLangExt lang
Definition docparser_p.h:85
QCString searchUrl
Definition docparser_p.h:83
size_t includeFileOffset
Definition docparser_p.h:89
const MemberDef * memberDef
Definition docparser_p.h:80
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5214
QCString relativePathToRoot(const QCString &name)
Definition util.cpp:3583
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
Definition util.cpp:5920

References Definition::anchor(), MemberDef::argumentList(), QCString::at(), DocOptions::autolinkSupport(), DocParserContext::autolinkSupport, DocParser::checkUnOrMultipleDocumentedParams(), DocParser::context, DocParserContext::context, QCString::data(), MemberDef::declArgumentList(), Definition::definitionType(), MemberDef::detectUndocumentedParams(), DocOptions::exampleName(), DocParserContext::exampleName, FALSE, DocParserContext::fileName, Definition::getLanguage(), getLanguageFromFileName(), getLanguageSpecificSeparator(), Definition::getOutputFileBase(), Doxygen::globalScope, DocParserContext::hasParamCommand, DocParserContext::hasReturnCommand, DocParserContext::includeFileLength, DocParserContext::includeFileOffset, DocParserContext::includeFileText, DocParserContext::inCodeStyle, DocOptions::indexWords(), DocTokenizer::init(), DocParserContext::initialStyleStack, DocParserContext::inSeeBlock, DocParserContext::insideHtmlLink, MemberDef::isDocsForDefinition(), QCString::isEmpty(), DocOptions::isExample(), DocParserContext::isExample, Debug::isFlagSet(), MemberDef::isFunction(), DocParserContext::lang, QCString::length(), DocOptions::linkFromIndex(), DocOptions::markdownSupport(), DocParserContext::markdownSupport, DocParserContext::memberDef, Definition::name(), DocParserContext::nodeStack, DocParserContext::numParameters, DocParserContext::paramPosition, DocParserContext::paramsFound, Debug::PrintTree, DocParser::processCopyDoc(), Definition::qualifiedName(), relativePathToRoot(), DocParserContext::relPath, DocTokenizer::resetToken(), DocParserContext::retvalsFound, DocParserContext::scope, Doxygen::searchIndex, DocParserContext::searchUrl, DocTokenizer::setFileName(), DocTokenizer::setLineNr(), DocOptions::singleLine(), ArgumentList::size(), DocParserContext::styleStack, substitute(), toGroupDef(), DocParserContext::token, DocParser::tokenizer, toPageDef(), Definition::TypeClass, Definition::TypeGroup, Definition::TypeNamespace, Definition::TypePage, and DocParserContext::xmlComment.

Referenced by addPerlModDocBlock(), generateBriefDoc(), OutputList::generateDoc(), generateHtmlOutput(), getSQLDocBlock(), parseCommentAsText(), ConceptDefImpl::writeBriefDescription(), DirDefImpl::writeBriefDescription(), FileDefImpl::writeBriefDescription(), GroupDefImpl::writeBriefDescription(), ModuleDefImpl::writeBriefDescription(), NamespaceDefImpl::writeBriefDescription(), MemberDefImpl::writeDeclaration(), ClassDefImpl::writeDeclarationLink(), ConceptDefImpl::writeDeclarationLink(), ModuleDefImpl::writeDeclarationLink(), MemberList::writePlainDeclarations(), and writeXMLDocBlock().

◆ validatingParseText()

IDocNodeASTPtr validatingParseText ( IDocParser & parser,
const QCString & input )

Main entry point for parsing simple text fragments. These fragments are limited to words, whitespace and symbols.

Definition at line 2246 of file docparser.cpp.

2247{
2248 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2249 assert(parser!=nullptr);
2250 if (parser==nullptr) return nullptr;
2251
2252 // set initial token
2253 parser->context.token = parser->tokenizer.resetToken();
2254
2255 //printf("------------ input ---------\n%s\n"
2256 // "------------ end input -----\n",input);
2257 //parser->context.token = new TokenInfo;
2258 parser->context.context = "";
2259 parser->context.fileName = "<parseText>";
2260 parser->context.relPath = "";
2261 parser->context.memberDef = nullptr;
2262 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2263 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2264 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2265 parser->context.inSeeBlock = FALSE;
2266 parser->context.inCodeStyle = FALSE;
2267 parser->context.xmlComment = FALSE;
2268 parser->context.insideHtmlLink = FALSE;
2269 parser->context.includeFileText = "";
2270 parser->context.includeFileOffset = 0;
2271 parser->context.includeFileLength = 0;
2272 parser->context.isExample = FALSE;
2273 parser->context.exampleName = "";
2274 parser->context.hasParamCommand = FALSE;
2275 parser->context.hasReturnCommand = FALSE;
2276 parser->context.retvalsFound.clear();
2277 parser->context.paramsFound.clear();
2278 parser->context.searchUrl="";
2279 parser->context.lang = SrcLangExt::Unknown;
2280 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2281 parser->context.autolinkSupport = FALSE;
2282
2283
2284 auto ast = std::make_unique<DocNodeAST>(DocText(parser));
2285
2286 if (!input.isEmpty())
2287 {
2288 parser->tokenizer.setLineNr(1);
2289 parser->tokenizer.init(input.data(),parser->context.fileName,
2291
2292 // build abstract syntax tree
2293 std::get<DocText>(ast->root).parse();
2294
2296 {
2297 // pretty print the result
2298 std::visit(PrintDocVisitor{},ast->root);
2299 }
2300 }
2301
2302 return ast;
2303}
Root node of a text fragment.
Definition docnode.h:1301
#define Config_getBool(name)
Definition config.h:33

References DocParserContext::autolinkSupport, Config_getBool, DocParser::context, DocParserContext::context, QCString::data(), DocParserContext::exampleName, FALSE, DocParserContext::fileName, DocParserContext::hasParamCommand, DocParserContext::hasReturnCommand, DocParserContext::includeFileLength, DocParserContext::includeFileOffset, DocParserContext::includeFileText, DocParserContext::inCodeStyle, DocTokenizer::init(), DocParserContext::initialStyleStack, DocParserContext::inSeeBlock, DocParserContext::insideHtmlLink, QCString::isEmpty(), DocParserContext::isExample, Debug::isFlagSet(), DocParserContext::lang, DocParserContext::markdownSupport, DocParserContext::memberDef, DocParserContext::nodeStack, DocParserContext::paramsFound, Debug::PrintTree, DocParserContext::relPath, DocTokenizer::resetToken(), DocParserContext::retvalsFound, DocParserContext::searchUrl, DocTokenizer::setLineNr(), DocParserContext::styleStack, DocParserContext::token, DocParser::tokenizer, and DocParserContext::xmlComment.

Referenced by RTFGenerator::endIndexSection(), and OutputList::parseText().

◆ validatingParseTitle()

IDocNodeASTPtr validatingParseTitle ( IDocParser & parserIntf,
const QCString & fileName,
int lineNr,
const QCString & input )

Main entry point for parsing titles. These allow limited markup commands

Definition at line 2193 of file docparser.cpp.

2194{
2195 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2196 assert(parser!=nullptr);
2197 if (parser==nullptr) return nullptr;
2198
2199 // set initial token
2200 parser->context.token = parser->tokenizer.resetToken();
2201
2202 //printf("------------ input ---------\n%s\n"
2203 // "------------ end input -----\n",input);
2204 parser->context.context = "";
2205 parser->context.fileName = fileName;
2206 parser->context.relPath = "";
2207 parser->context.memberDef = nullptr;
2208 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2209 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2210 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2211 parser->context.inSeeBlock = FALSE;
2212 parser->context.inCodeStyle = FALSE;
2213 parser->context.xmlComment = FALSE;
2214 parser->context.insideHtmlLink = FALSE;
2215 parser->context.includeFileText = "";
2216 parser->context.includeFileOffset = 0;
2217 parser->context.includeFileLength = 0;
2218 parser->context.isExample = FALSE;
2219 parser->context.exampleName = "";
2220 parser->context.hasParamCommand = FALSE;
2221 parser->context.hasReturnCommand = FALSE;
2222 parser->context.retvalsFound.clear();
2223 parser->context.paramsFound.clear();
2224 parser->context.searchUrl="";
2225 parser->context.lang = SrcLangExt::Unknown;
2226 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2227 parser->context.autolinkSupport = false;
2228
2229 auto ast = std::make_unique<DocNodeAST>(DocTitle(parser,nullptr));
2230
2231 if (!input.isEmpty())
2232 {
2233 // build abstract syntax tree from title string
2234 std::get<DocTitle>(ast->root).parseFromString(nullptr,input);
2235
2237 {
2238 // pretty print the result
2239 std::visit(PrintDocVisitor{},ast->root);
2240 }
2241 }
2242
2243 return ast;
2244}
Node representing a simple section title.
Definition docnode.h:608

References DocParserContext::autolinkSupport, Config_getBool, DocParser::context, DocParserContext::context, DocParserContext::exampleName, FALSE, DocParserContext::fileName, DocParserContext::hasParamCommand, DocParserContext::hasReturnCommand, DocParserContext::includeFileLength, DocParserContext::includeFileOffset, DocParserContext::includeFileText, DocParserContext::inCodeStyle, DocParserContext::initialStyleStack, DocParserContext::inSeeBlock, DocParserContext::insideHtmlLink, QCString::isEmpty(), DocParserContext::isExample, Debug::isFlagSet(), DocParserContext::lang, DocParserContext::markdownSupport, DocParserContext::memberDef, DocParserContext::nodeStack, DocParserContext::paramsFound, Debug::PrintTree, DocParserContext::relPath, DocTokenizer::resetToken(), DocParserContext::retvalsFound, DocParserContext::searchUrl, DocParserContext::styleStack, DocParserContext::token, DocParser::tokenizer, and DocParserContext::xmlComment.

Referenced by parseCommentAsHtml().