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 2250 of file docparser.cpp.

2251{
2252 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2253 assert(parser!=nullptr);
2254 if (parser==nullptr) return nullptr;
2255 if (!srcFile.isEmpty())
2256 {
2257 parser->context.fileName = srcFile;
2258 parser->tokenizer.setFileName(srcFile);
2259 parser->tokenizer.setLineNr(srcLine);
2260 }
2261 return std::make_unique<DocNodeAST>(DocRef(parser,nullptr,target,context));
2262}
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 2006 of file docparser.cpp.

2013{
2014 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2015 assert(parser!=nullptr);
2016 if (parser==nullptr) return nullptr;
2017 //printf("validatingParseDoc(%s,%s)=[%s]\n",ctx?qPrint(ctx->name()):"<none>",
2018 // md?qPrint(md->name()):"<none>",
2019 // qPrint(input));
2020 //printf("========== validating %s at line %d\n",qPrint(fileName),startLine);
2021 //printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",qPrint(input));
2022
2023 // set initial token
2024 parser->context.token = parser->tokenizer.resetToken();
2025
2026 if (ctx && ctx!=Doxygen::globalScope &&
2029 )
2030 )
2031 {
2033 }
2034 else if (ctx && ctx->definitionType()==Definition::TypePage)
2035 {
2036 const Definition *scope = (toPageDef(ctx))->getPageScope();
2037 if (scope && scope!=Doxygen::globalScope)
2038 {
2039 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2040 }
2041 }
2042 else if (ctx && ctx->definitionType()==Definition::TypeGroup)
2043 {
2044 const Definition *scope = (toGroupDef(ctx))->getGroupScope();
2045 if (scope && scope!=Doxygen::globalScope)
2046 {
2047 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2048 }
2049 }
2050 else
2051 {
2052 parser->context.context = "";
2053 }
2054 parser->context.scope = ctx;
2055 parser->context.lang = getLanguageFromFileName(fileName);
2056
2057 if (options.indexWords() && Doxygen::searchIndex.enabled())
2058 {
2059 if (md)
2060 {
2061 parser->context.searchUrl=md->getOutputFileBase();
2062 Doxygen::searchIndex.setCurrentDoc(md,md->anchor(),false);
2063 }
2064 else if (ctx)
2065 {
2066 parser->context.searchUrl=ctx->getOutputFileBase();
2067 Doxygen::searchIndex.setCurrentDoc(ctx,ctx->anchor(),false);
2068 }
2069 }
2070 else
2071 {
2072 parser->context.searchUrl="";
2073 }
2074
2075 parser->context.fileName = fileName;
2076 parser->context.relPath = (!options.linkFromIndex() && ctx) ?
2078 QCString("");
2079 //printf("ctx->name=%s relPath=%s\n",qPrint(ctx->name()),qPrint(parser->context.relPath));
2080 parser->context.memberDef = md;
2081 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2082 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2083 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2084 parser->context.inSeeBlock = FALSE;
2085 parser->context.inCodeStyle = FALSE;
2086 parser->context.xmlComment = FALSE;
2087 parser->context.insideHtmlLink = FALSE;
2088 parser->context.includeFileText = "";
2089 parser->context.includeFileOffset = 0;
2090 parser->context.includeFileLength = 0;
2091 parser->context.isExample = options.isExample();
2092 parser->context.exampleName = options.exampleName();
2093 parser->context.hasParamCommand = FALSE;
2094 parser->context.hasReturnCommand = FALSE;
2095 parser->context.retvalsFound.clear();
2096 parser->context.paramsFound.clear();
2097 parser->context.markdownSupport = options.markdownSupport();
2098 parser->context.autolinkSupport = options.autolinkSupport();
2099
2100 //printf("Starting comment block at %s:%d\n",qPrint(parser->context.fileName),startLine);
2101 parser->tokenizer.setFileName(fileName);
2102 parser->tokenizer.setLineNr(startLine);
2103 size_t ioLen = input.length();
2104 QCString inpStr = parser->processCopyDoc(input.data(),ioLen);
2105 if (inpStr.isEmpty() || inpStr.at(inpStr.length()-1)!='\n')
2106 {
2107 inpStr+='\n';
2108 }
2109 //printf("processCopyDoc(in='%s' out='%s')\n",qPrint(input),qPrint(inpStr));
2110 parser->tokenizer.init(inpStr.data(),parser->context.fileName,
2112
2113 // build abstract syntax tree
2114 auto ast = std::make_unique<DocNodeAST>(DocRoot(parser,md!=nullptr,options.singleLine()));
2115 std::get<DocRoot>(ast->root).parse();
2116
2118 {
2119 // pretty print the result
2120 std::visit(PrintDocVisitor{},ast->root);
2121 }
2122
2123 if (md && md->isFunction())
2124 {
2125 parser->checkUnOrMultipleDocumentedParams();
2126 }
2128
2129 // reset token
2130 parser->tokenizer.resetToken();
2131
2132 //printf(">>>>>> end validatingParseDoc(%s,%s)\n",ctx?qPrint(ctx->name()):"<none>",
2133 // md?qPrint(md->name()):"<none>");
2134
2135 return ast;
2136}
@ 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 bool isFunction() const =0
virtual void detectUndocumentedParams(bool hasParamCommand, bool hasReturnCommand) 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
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:88
DocNodeStack nodeStack
Definition docparser_p.h:67
StringMultiSet paramsFound
Definition docparser_p.h:77
QCString exampleName
Definition docparser_p.h:80
const Definition * scope
Definition docparser_p.h:61
QCString includeFileText
Definition docparser_p.h:86
TokenInfo * token
Definition docparser_p.h:93
DocStyleChangeStack initialStyleStack
Definition docparser_p.h:69
SrcLangExt lang
Definition docparser_p.h:83
QCString searchUrl
Definition docparser_p.h:81
size_t includeFileOffset
Definition docparser_p.h:87
const MemberDef * memberDef
Definition docparser_p.h:78
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5193
QCString relativePathToRoot(const QCString &name)
Definition util.cpp:3562
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
Definition util.cpp:5899

References Definition::anchor(), QCString::at(), DocOptions::autolinkSupport(), DocParserContext::autolinkSupport, DocParser::checkUnOrMultipleDocumentedParams(), DocParser::context, DocParserContext::context, QCString::data(), 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, 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::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(), 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 2191 of file docparser.cpp.

2192{
2193 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2194 assert(parser!=nullptr);
2195 if (parser==nullptr) return nullptr;
2196
2197 // set initial token
2198 parser->context.token = parser->tokenizer.resetToken();
2199
2200 //printf("------------ input ---------\n%s\n"
2201 // "------------ end input -----\n",input);
2202 //parser->context.token = new TokenInfo;
2203 parser->context.context = "";
2204 parser->context.fileName = "<parseText>";
2205 parser->context.relPath = "";
2206 parser->context.memberDef = nullptr;
2207 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2208 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2209 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2210 parser->context.inSeeBlock = FALSE;
2211 parser->context.inCodeStyle = FALSE;
2212 parser->context.xmlComment = FALSE;
2213 parser->context.insideHtmlLink = FALSE;
2214 parser->context.includeFileText = "";
2215 parser->context.includeFileOffset = 0;
2216 parser->context.includeFileLength = 0;
2217 parser->context.isExample = FALSE;
2218 parser->context.exampleName = "";
2219 parser->context.hasParamCommand = FALSE;
2220 parser->context.hasReturnCommand = FALSE;
2221 parser->context.retvalsFound.clear();
2222 parser->context.paramsFound.clear();
2223 parser->context.searchUrl="";
2224 parser->context.lang = SrcLangExt::Unknown;
2225 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2226 parser->context.autolinkSupport = FALSE;
2227
2228
2229 auto ast = std::make_unique<DocNodeAST>(DocText(parser));
2230
2231 if (!input.isEmpty())
2232 {
2233 parser->tokenizer.setLineNr(1);
2234 parser->tokenizer.init(input.data(),parser->context.fileName,
2236
2237 // build abstract syntax tree
2238 std::get<DocText>(ast->root).parse();
2239
2241 {
2242 // pretty print the result
2243 std::visit(PrintDocVisitor{},ast->root);
2244 }
2245 }
2246
2247 return ast;
2248}
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 2138 of file docparser.cpp.

2139{
2140 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2141 assert(parser!=nullptr);
2142 if (parser==nullptr) return nullptr;
2143
2144 // set initial token
2145 parser->context.token = parser->tokenizer.resetToken();
2146
2147 //printf("------------ input ---------\n%s\n"
2148 // "------------ end input -----\n",input);
2149 parser->context.context = "";
2150 parser->context.fileName = fileName;
2151 parser->context.relPath = "";
2152 parser->context.memberDef = nullptr;
2153 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2154 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2155 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2156 parser->context.inSeeBlock = FALSE;
2157 parser->context.inCodeStyle = FALSE;
2158 parser->context.xmlComment = FALSE;
2159 parser->context.insideHtmlLink = FALSE;
2160 parser->context.includeFileText = "";
2161 parser->context.includeFileOffset = 0;
2162 parser->context.includeFileLength = 0;
2163 parser->context.isExample = FALSE;
2164 parser->context.exampleName = "";
2165 parser->context.hasParamCommand = FALSE;
2166 parser->context.hasReturnCommand = FALSE;
2167 parser->context.retvalsFound.clear();
2168 parser->context.paramsFound.clear();
2169 parser->context.searchUrl="";
2170 parser->context.lang = SrcLangExt::Unknown;
2171 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2172 parser->context.autolinkSupport = false;
2173
2174 auto ast = std::make_unique<DocNodeAST>(DocTitle(parser,nullptr));
2175
2176 if (!input.isEmpty())
2177 {
2178 // build abstract syntax tree from title string
2179 std::get<DocTitle>(ast->root).parseFromString(nullptr,input);
2180
2182 {
2183 // pretty print the result
2184 std::visit(PrintDocVisitor{},ast->root);
2185 }
2186 }
2187
2188 return ast;
2189}
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().