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

2222{
2223 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2224 assert(parser!=nullptr);
2225 if (parser==nullptr) return nullptr;
2226 if (!srcFile.isEmpty())
2227 {
2228 parser->context.fileName = srcFile;
2229 parser->tokenizer.setFileName(srcFile);
2230 parser->tokenizer.setLineNr(srcLine);
2231 }
2232 return std::make_unique<DocNodeAST>(DocRef(parser,nullptr,target,context));
2233}
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 1977 of file docparser.cpp.

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

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

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