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 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, bool indexWords, bool isExample, const QCString &exampleName, bool singleLine, bool linkFromIndex, bool markdownSupport)
 
IDocNodeASTPtr validatingParseText (IDocParser &parser, 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 56 of file docparser.h.

◆ IDocParserPtr

using IDocParserPtr = std::unique_ptr<IDocParser>

pointer to parser interface

Definition at line 40 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 2106 of file docparser.cpp.

2107{
2108 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2109 assert(parser!=nullptr);
2110 if (parser==nullptr) return nullptr;
2111 if (!srcFile.isEmpty())
2112 {
2113 parser->context.fileName = srcFile;
2114 parser->tokenizer.setLineNr(srcLine);
2115 }
2116 return std::make_unique<DocNodeAST>(DocRef(parser,nullptr,target,context));
2117}
DocTokenizer tokenizer
DocParserContext context
Node representing a reference to some item.
Definition docnode.h:772
void setLineNr(int lineno)
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:150
QCString fileName
Definition docparser_p.h:70

References DocParser::context, DocParserContext::fileName, QCString::isEmpty(), 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,
bool indexWords,
bool isExample,
const QCString & exampleName,
bool singleLine,
bool linkFromIndex,
bool markdownSupport )

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.
indexWordsIndicates whether or not words should be put in the search index.
isExampleTRUE if the documentation belongs to an example.
exampleNameBase name of the example file (0 if isExample is FALSE).
singleLineOutput should be presented on a single line, so without starting a new paragraph at the end.
linkFromIndexTRUE if the documentation is generated from an index page. In this case context is not used to determine the relative path when making a link.
markdownSupportTRUE if the input needs to take markdown markup into account.
Returns
An object representing the abstract syntax tree. Ownership of the pointer is handed over to the caller.

Definition at line 1920 of file docparser.cpp.

1927{
1928 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
1929 assert(parser!=nullptr);
1930 if (parser==nullptr) return nullptr;
1931 //printf("validatingParseDoc(%s,%s)=[%s]\n",ctx?qPrint(ctx->name()):"<none>",
1932 // md?qPrint(md->name()):"<none>",
1933 // input);
1934 //printf("========== validating %s at line %d\n",qPrint(fileName),startLine);
1935 //printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",qPrint(input));
1936
1937 // set initial token
1938 parser->context.token = parser->tokenizer.resetToken();
1939
1940 if (ctx && ctx!=Doxygen::globalScope &&
1943 )
1944 )
1945 {
1947 }
1948 else if (ctx && ctx->definitionType()==Definition::TypePage)
1949 {
1950 const Definition *scope = (toPageDef(ctx))->getPageScope();
1951 if (scope && scope!=Doxygen::globalScope)
1952 {
1953 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
1954 }
1955 }
1956 else if (ctx && ctx->definitionType()==Definition::TypeGroup)
1957 {
1958 const Definition *scope = (toGroupDef(ctx))->getGroupScope();
1959 if (scope && scope!=Doxygen::globalScope)
1960 {
1961 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
1962 }
1963 }
1964 else
1965 {
1966 parser->context.context = "";
1967 }
1968 parser->context.scope = ctx;
1969 parser->context.lang = getLanguageFromFileName(fileName);
1970
1971 if (indexWords && Doxygen::searchIndex.enabled())
1972 {
1973 if (md)
1974 {
1975 parser->context.searchUrl=md->getOutputFileBase();
1976 Doxygen::searchIndex.setCurrentDoc(md,md->anchor(),false);
1977 }
1978 else if (ctx)
1979 {
1980 parser->context.searchUrl=ctx->getOutputFileBase();
1981 Doxygen::searchIndex.setCurrentDoc(ctx,ctx->anchor(),false);
1982 }
1983 }
1984 else
1985 {
1986 parser->context.searchUrl="";
1987 }
1988
1989 parser->context.fileName = fileName;
1990 parser->context.relPath = (!linkFromIndex && ctx) ?
1992 QCString("");
1993 //printf("ctx->name=%s relPath=%s\n",qPrint(ctx->name()),qPrint(parser->context.relPath));
1994 parser->context.memberDef = md;
1995 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
1996 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
1997 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
1998 parser->context.inSeeBlock = FALSE;
1999 parser->context.xmlComment = FALSE;
2000 parser->context.insideHtmlLink = FALSE;
2001 parser->context.includeFileText = "";
2002 parser->context.includeFileOffset = 0;
2003 parser->context.includeFileLength = 0;
2004 parser->context.isExample = isExample;
2005 parser->context.exampleName = exampleName;
2006 parser->context.hasParamCommand = FALSE;
2007 parser->context.hasReturnCommand = FALSE;
2008 parser->context.retvalsFound.clear();
2009 parser->context.paramsFound.clear();
2010 parser->context.markdownSupport = markdownSupport;
2011
2012 //printf("Starting comment block at %s:%d\n",qPrint(parser->context.fileName),startLine);
2013 parser->tokenizer.setLineNr(startLine);
2014 size_t ioLen = input.length();
2015 QCString inpStr = parser->processCopyDoc(input.data(),ioLen);
2016 if (inpStr.isEmpty() || inpStr.at(inpStr.length()-1)!='\n')
2017 {
2018 inpStr+='\n';
2019 }
2020 //printf("processCopyDoc(in='%s' out='%s')\n",input,qPrint(inpStr));
2021 parser->tokenizer.init(inpStr.data(),parser->context.fileName,
2023
2024 // build abstract syntax tree
2025 auto ast = std::make_unique<DocNodeAST>(DocRoot(parser,md!=nullptr,singleLine));
2026 std::get<DocRoot>(ast->root).parse();
2027
2029 {
2030 // pretty print the result
2031 std::visit(PrintDocVisitor{},ast->root);
2032 }
2033
2034 if (md && md->isFunction())
2035 {
2037 }
2039
2040 // reset token
2041 parser->tokenizer.resetToken();
2042
2043 //printf(">>>>>> end validatingParseDoc(%s,%s)\n",ctx?qPrint(ctx->name()):"<none>",
2044 // md?qPrint(md->name()):"<none>");
2045
2046 return ast;
2047}
@ 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:76
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)
void checkUnOrMultipleDocumentedParams()
Root node of documentation tree.
Definition docnode.h:1307
void init(const char *input, const QCString &fileName, bool markdownSupport, bool insideHtmlLink)
TokenInfo * resetToken()
static NamespaceDefMutable * globalScope
Definition doxygen.h:121
static SearchIndexIntf searchIndex
Definition doxygen.h:124
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:153
char & at(size_t i)
Returns a reference to the character at index i.
Definition qcstring.h:578
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:159
GroupDef * toGroupDef(Definition *d)
PageDef * toPageDef(Definition *d)
Definition pagedef.cpp:467
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
Definition qcstring.cpp:477
#define FALSE
Definition qcstring.h:34
StringMultiSet retvalsFound
Definition docparser_p.h:75
DocStyleChangeStack styleStack
Definition docparser_p.h:67
size_t includeFileLength
Definition docparser_p.h:87
DocNodeStack nodeStack
Definition docparser_p.h:66
StringMultiSet paramsFound
Definition docparser_p.h:76
QCString exampleName
Definition docparser_p.h:79
const Definition * scope
Definition docparser_p.h:61
QCString includeFileText
Definition docparser_p.h:85
TokenInfo * token
Definition docparser_p.h:92
DocStyleChangeStack initialStyleStack
Definition docparser_p.h:68
SrcLangExt lang
Definition docparser_p.h:82
QCString searchUrl
Definition docparser_p.h:80
size_t includeFileOffset
Definition docparser_p.h:86
const MemberDef * memberDef
Definition docparser_p.h:77
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5705
QCString relativePathToRoot(const QCString &name)
Definition util.cpp:4079
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
Definition util.cpp:6386

References Definition::anchor(), QCString::at(), DocParser::checkUnOrMultipleDocumentedParams(), DocParser::context, DocParserContext::context, QCString::data(), Definition::definitionType(), MemberDef::detectUndocumentedParams(), DocParserContext::exampleName, FALSE, DocParserContext::fileName, Definition::getLanguage(), getLanguageFromFileName(), getLanguageSpecificSeparator(), Definition::getOutputFileBase(), Doxygen::globalScope, DocParserContext::hasParamCommand, DocParserContext::hasReturnCommand, DocParserContext::includeFileLength, DocParserContext::includeFileOffset, DocParserContext::includeFileText, DocTokenizer::init(), DocParserContext::initialStyleStack, DocParserContext::inSeeBlock, DocParserContext::insideHtmlLink, QCString::isEmpty(), DocParserContext::isExample, Debug::isFlagSet(), MemberDef::isFunction(), DocParserContext::lang, QCString::length(), 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::setLineNr(), 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 2049 of file docparser.cpp.

2050{
2051 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2052 assert(parser!=nullptr);
2053 if (parser==nullptr) return nullptr;
2054
2055 // set initial token
2056 parser->context.token = parser->tokenizer.resetToken();
2057
2058 //printf("------------ input ---------\n%s\n"
2059 // "------------ end input -----\n",input);
2060 //parser->context.token = new TokenInfo;
2061 parser->context.context = "";
2062 parser->context.fileName = "<parseText>";
2063 parser->context.relPath = "";
2064 parser->context.memberDef = nullptr;
2065 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2066 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2067 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2068 parser->context.inSeeBlock = FALSE;
2069 parser->context.xmlComment = FALSE;
2070 parser->context.insideHtmlLink = FALSE;
2071 parser->context.includeFileText = "";
2072 parser->context.includeFileOffset = 0;
2073 parser->context.includeFileLength = 0;
2074 parser->context.isExample = FALSE;
2075 parser->context.exampleName = "";
2076 parser->context.hasParamCommand = FALSE;
2077 parser->context.hasReturnCommand = FALSE;
2078 parser->context.retvalsFound.clear();
2079 parser->context.paramsFound.clear();
2080 parser->context.searchUrl="";
2082 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2083
2084
2085 auto ast = std::make_unique<DocNodeAST>(DocText(parser));
2086
2087 if (!input.isEmpty())
2088 {
2089 parser->tokenizer.setLineNr(1);
2090 parser->tokenizer.init(input.data(),parser->context.fileName,
2092
2093 // build abstract syntax tree
2094 std::get<DocText>(ast->root).parse();
2095
2097 {
2098 // pretty print the result
2099 std::visit(PrintDocVisitor{},ast->root);
2100 }
2101 }
2102
2103 return ast;
2104}
Root node of a text fragment.
Definition docnode.h:1298
#define Config_getBool(name)
Definition config.h:33
@ Unknown
Definition types.h:43

References Config_getBool, DocParser::context, DocParserContext::context, QCString::data(), DocParserContext::exampleName, FALSE, DocParserContext::fileName, DocParserContext::hasParamCommand, DocParserContext::hasReturnCommand, DocParserContext::includeFileLength, DocParserContext::includeFileOffset, DocParserContext::includeFileText, 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, Unknown, and DocParserContext::xmlComment.

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