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

2215{
2216 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2217 assert(parser!=nullptr);
2218 if (parser==nullptr) return nullptr;
2219 if (!srcFile.isEmpty())
2220 {
2221 parser->context.fileName = srcFile;
2222 parser->tokenizer.setFileName(srcFile);
2223 parser->tokenizer.setLineNr(srcLine);
2224 }
2225 return std::make_unique<DocNodeAST>(DocRef(parser,nullptr,target,context));
2226}
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 1970 of file docparser.cpp.

1977{
1978 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
1979 assert(parser!=nullptr);
1980 if (parser==nullptr) return nullptr;
1981 //printf("validatingParseDoc(%s,%s)=[%s]\n",ctx?qPrint(ctx->name()):"<none>",
1982 // md?qPrint(md->name()):"<none>",
1983 // qPrint(input));
1984 //printf("========== validating %s at line %d\n",qPrint(fileName),startLine);
1985 //printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",qPrint(input));
1986
1987 // set initial token
1988 parser->context.token = parser->tokenizer.resetToken();
1989
1990 if (ctx && ctx!=Doxygen::globalScope &&
1993 )
1994 )
1995 {
1997 }
1998 else if (ctx && ctx->definitionType()==Definition::TypePage)
1999 {
2000 const Definition *scope = (toPageDef(ctx))->getPageScope();
2001 if (scope && scope!=Doxygen::globalScope)
2002 {
2003 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2004 }
2005 }
2006 else if (ctx && ctx->definitionType()==Definition::TypeGroup)
2007 {
2008 const Definition *scope = (toGroupDef(ctx))->getGroupScope();
2009 if (scope && scope!=Doxygen::globalScope)
2010 {
2011 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2012 }
2013 }
2014 else
2015 {
2016 parser->context.context = "";
2017 }
2018 parser->context.scope = ctx;
2019 parser->context.lang = getLanguageFromFileName(fileName);
2020
2021 if (options.indexWords() && Doxygen::searchIndex.enabled())
2022 {
2023 if (md)
2024 {
2025 parser->context.searchUrl=md->getOutputFileBase();
2026 Doxygen::searchIndex.setCurrentDoc(md,md->anchor(),false);
2027 }
2028 else if (ctx)
2029 {
2030 parser->context.searchUrl=ctx->getOutputFileBase();
2031 Doxygen::searchIndex.setCurrentDoc(ctx,ctx->anchor(),false);
2032 }
2033 }
2034 else
2035 {
2036 parser->context.searchUrl="";
2037 }
2038
2039 parser->context.fileName = fileName;
2040 parser->context.relPath = (!options.linkFromIndex() && ctx) ?
2042 QCString("");
2043 //printf("ctx->name=%s relPath=%s\n",qPrint(ctx->name()),qPrint(parser->context.relPath));
2044 parser->context.memberDef = md;
2045 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2046 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2047 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2048 parser->context.inSeeBlock = FALSE;
2049 parser->context.inCodeStyle = FALSE;
2050 parser->context.xmlComment = FALSE;
2051 parser->context.insideHtmlLink = FALSE;
2052 parser->context.includeFileText = "";
2053 parser->context.includeFileOffset = 0;
2054 parser->context.includeFileLength = 0;
2055 parser->context.isExample = options.isExample();
2056 parser->context.exampleName = options.exampleName();
2057 parser->context.hasParamCommand = FALSE;
2058 parser->context.hasReturnCommand = FALSE;
2059 parser->context.retvalsFound.clear();
2060 parser->context.paramsFound.clear();
2061 parser->context.markdownSupport = options.markdownSupport();
2062 parser->context.autolinkSupport = options.autolinkSupport();
2063
2064 //printf("Starting comment block at %s:%d\n",qPrint(parser->context.fileName),startLine);
2065 parser->tokenizer.setFileName(fileName);
2066 parser->tokenizer.setLineNr(startLine);
2067 size_t ioLen = input.length();
2068 QCString inpStr = parser->processCopyDoc(input.data(),ioLen);
2069 if (inpStr.isEmpty() || inpStr.at(inpStr.length()-1)!='\n')
2070 {
2071 inpStr+='\n';
2072 }
2073 //printf("processCopyDoc(in='%s' out='%s')\n",qPrint(input),qPrint(inpStr));
2074 parser->tokenizer.init(inpStr.data(),parser->context.fileName,
2076
2077 // build abstract syntax tree
2078 auto ast = std::make_unique<DocNodeAST>(DocRoot(parser,md!=nullptr,options.singleLine()));
2079 std::get<DocRoot>(ast->root).parse();
2080
2082 {
2083 // pretty print the result
2084 std::visit(PrintDocVisitor{},ast->root);
2085 }
2086
2087 if (md && md->isFunction())
2088 {
2089 parser->checkUnOrMultipleDocumentedParams();
2090 }
2092
2093 // reset token
2094 parser->tokenizer.resetToken();
2095
2096 //printf(">>>>>> end validatingParseDoc(%s,%s)\n",ctx?qPrint(ctx->name()):"<none>",
2097 // md?qPrint(md->name()):"<none>");
2098
2099 return ast;
2100}
@ 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:1311
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:5191
QCString relativePathToRoot(const QCString &name)
Definition util.cpp:3560
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
Definition util.cpp:5897

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

2156{
2157 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2158 assert(parser!=nullptr);
2159 if (parser==nullptr) return nullptr;
2160
2161 // set initial token
2162 parser->context.token = parser->tokenizer.resetToken();
2163
2164 //printf("------------ input ---------\n%s\n"
2165 // "------------ end input -----\n",input);
2166 //parser->context.token = new TokenInfo;
2167 parser->context.context = "";
2168 parser->context.fileName = "<parseText>";
2169 parser->context.relPath = "";
2170 parser->context.memberDef = nullptr;
2171 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2172 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2173 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2174 parser->context.inSeeBlock = FALSE;
2175 parser->context.inCodeStyle = FALSE;
2176 parser->context.xmlComment = FALSE;
2177 parser->context.insideHtmlLink = FALSE;
2178 parser->context.includeFileText = "";
2179 parser->context.includeFileOffset = 0;
2180 parser->context.includeFileLength = 0;
2181 parser->context.isExample = FALSE;
2182 parser->context.exampleName = "";
2183 parser->context.hasParamCommand = FALSE;
2184 parser->context.hasReturnCommand = FALSE;
2185 parser->context.retvalsFound.clear();
2186 parser->context.paramsFound.clear();
2187 parser->context.searchUrl="";
2188 parser->context.lang = SrcLangExt::Unknown;
2189 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2190 parser->context.autolinkSupport = FALSE;
2191
2192
2193 auto ast = std::make_unique<DocNodeAST>(DocText(parser));
2194
2195 if (!input.isEmpty())
2196 {
2197 parser->tokenizer.setLineNr(1);
2198 parser->tokenizer.init(input.data(),parser->context.fileName,
2200
2201 // build abstract syntax tree
2202 std::get<DocText>(ast->root).parse();
2203
2205 {
2206 // pretty print the result
2207 std::visit(PrintDocVisitor{},ast->root);
2208 }
2209 }
2210
2211 return ast;
2212}
Root node of a text fragment.
Definition docnode.h:1302
#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 2102 of file docparser.cpp.

2103{
2104 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2105 assert(parser!=nullptr);
2106 if (parser==nullptr) return nullptr;
2107
2108 // set initial token
2109 parser->context.token = parser->tokenizer.resetToken();
2110
2111 //printf("------------ input ---------\n%s\n"
2112 // "------------ end input -----\n",input);
2113 parser->context.context = "";
2114 parser->context.fileName = fileName;
2115 parser->context.relPath = "";
2116 parser->context.memberDef = nullptr;
2117 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2118 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2119 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2120 parser->context.inSeeBlock = FALSE;
2121 parser->context.inCodeStyle = FALSE;
2122 parser->context.xmlComment = FALSE;
2123 parser->context.insideHtmlLink = FALSE;
2124 parser->context.includeFileText = "";
2125 parser->context.includeFileOffset = 0;
2126 parser->context.includeFileLength = 0;
2127 parser->context.isExample = FALSE;
2128 parser->context.exampleName = "";
2129 parser->context.hasParamCommand = FALSE;
2130 parser->context.hasReturnCommand = FALSE;
2131 parser->context.retvalsFound.clear();
2132 parser->context.paramsFound.clear();
2133 parser->context.searchUrl="";
2134 parser->context.lang = SrcLangExt::Unknown;
2135 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2136 parser->context.autolinkSupport = false;
2137
2138 auto ast = std::make_unique<DocNodeAST>(DocTitle(parser,nullptr));
2139
2140 if (!input.isEmpty())
2141 {
2142 // build abstract syntax tree from title string
2143 std::get<DocTitle>(ast->root).parseFromString(nullptr,input);
2144
2146 {
2147 // pretty print the result
2148 std::visit(PrintDocVisitor{},ast->root);
2149 }
2150 }
2151
2152 return ast;
2153}
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().