Doxygen
Loading...
Searching...
No Matches
CommentScanner Class Reference

#include <src/commentscan.h>

Classes

struct  Private

Public Member Functions

 CommentScanner ()
 ~CommentScanner ()
bool parseCommentBlock (OutlineParserInterface *parser, Entry *curEntry, const QCString &comment, const QCString &fileName, int &lineNr, bool isBrief, bool isJavadocStyle, bool isInbody, Protection &prot, int &position, bool &newEntryNeeded, bool markdownEnabled, GuardedSectionStack *guards)
 Invokes the comment block parser with the request to parse a single comment block.
void initGroupInfo (Entry *entry)
void enterFile (const QCString &fileName, int lineNr)
void leaveFile (const QCString &fileName, int lineNr)
void enterCompound (const QCString &fileName, int line, const QCString &name)
void leaveCompound (const QCString &fileName, int line, const QCString &name)
void open (Entry *e, const QCString &fileName, int line, bool implicit=false)
void close (Entry *e, const QCString &fileName, int line, bool foundInline, bool implicit=false)

Static Public Member Functions

static bool isCommand (const QCString &cmdName)

Private Attributes

std::unique_ptr< Privatep

Detailed Description

Definition at line 53 of file commentscan.h.

Constructor & Destructor Documentation

◆ CommentScanner()

CommentScanner::CommentScanner ( )

Definition at line 4958 of file commentscan.l.

4958 : p(std::make_unique<Private>())
4959{
4960 commentscanYYlex_init_extra(&p->extra,&p->yyscanner);
4961#ifdef FLEX_DEBUG
4962 commentscanYYset_debug(Debug::isFlagSet(Debug::Lex_commentscan)?1:0,p->yyscanner);
4963#endif
4964}
std::unique_ptr< Private > p
@ Lex_commentscan
Definition debug.h:55
static bool isFlagSet(const DebugMask mask)
Definition debug.cpp:133

References Debug::isFlagSet(), Debug::Lex_commentscan, and p.

◆ ~CommentScanner()

CommentScanner::~CommentScanner ( )

Definition at line 4966 of file commentscan.l.

4967{
4968 commentscanYYlex_destroy(p->yyscanner);
4969}

References p.

Member Function Documentation

◆ close()

void CommentScanner::close ( Entry * e,
const QCString & fileName,
int line,
bool foundInline,
bool implicit = false )

Definition at line 5189 of file commentscan.l.

5190{
5191 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
5192 yyextra->docGroup.close(e,fileName,lineNr,foundInline,implicit);
5193}

References p.

◆ enterCompound()

void CommentScanner::enterCompound ( const QCString & fileName,
int line,
const QCString & name )

Definition at line 5171 of file commentscan.l.

5172{
5173 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
5174 yyextra->docGroup.enterCompound(fileName,lineNr,name);
5175}

References p.

◆ enterFile()

void CommentScanner::enterFile ( const QCString & fileName,
int lineNr )

Definition at line 5159 of file commentscan.l.

5160{
5161 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
5162 yyextra->docGroup.enterFile(fileName,lineNr);
5163}

References p.

Referenced by generateHtmlForComment().

◆ initGroupInfo()

void CommentScanner::initGroupInfo ( Entry * entry)

Definition at line 5153 of file commentscan.l.

5154{
5155 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
5156 yyextra->docGroup.initGroupInfo(entry);
5157}

References p.

◆ isCommand()

bool CommentScanner::isCommand ( const QCString & cmdName)
static

Definition at line 5195 of file commentscan.l.

5196{
5197 return (docCmdMap.find(cmdName.str()) != docCmdMap.end());
5198}
const std::string & str() const
Definition qcstring.h:556
static const std::unordered_map< std::string, DocCmdMap > docCmdMap

References docCmdMap, and QCString::str().

Referenced by Markdown::Private::processLink().

◆ leaveCompound()

void CommentScanner::leaveCompound ( const QCString & fileName,
int line,
const QCString & name )

Definition at line 5177 of file commentscan.l.

5178{
5179 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
5180 yyextra->docGroup.leaveCompound(fileName,lineNr,name);
5181}

References p.

◆ leaveFile()

void CommentScanner::leaveFile ( const QCString & fileName,
int lineNr )

Definition at line 5165 of file commentscan.l.

5166{
5167 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
5168 yyextra->docGroup.leaveFile(fileName,lineNr);
5169}

References p.

Referenced by generateHtmlForComment().

◆ open()

void CommentScanner::open ( Entry * e,
const QCString & fileName,
int line,
bool implicit = false )

Definition at line 5183 of file commentscan.l.

5184{
5185 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
5186 yyextra->docGroup.open(e,fileName,lineNr,implicit);
5187}

References p.

◆ parseCommentBlock()

bool CommentScanner::parseCommentBlock ( OutlineParserInterface * parser,
Entry * curEntry,
const QCString & comment,
const QCString & fileName,
int & lineNr,
bool isBrief,
bool isJavadocStyle,
bool isInbody,
Protection & prot,
int & position,
bool & newEntryNeeded,
bool markdownEnabled,
GuardedSectionStack * guards )

Invokes the comment block parser with the request to parse a single comment block.

Parameters
[in]parserThe language parse that invoked this function. The comment block parse may invoke ParserInterface::parsePrototype() in order to parse the argument of a @fn command.
[in]curEntryThe Entry to which the comment block belongs. Any information (like documentation) that is found in the comment block will be stored in this entry.
[in]commentA string representing the actual comment block. Note that leading *'s are already stripped from the comment block.
[in]fileNameThe name of the file in which the comment is found. Mainly used for producing warnings.
[in,out]lineNrThe line number at which the comment block was found. When the function returns it will be set to the last line parsed.
[in]isBriefTRUE iff this comment block represents a brief description.
[in]isJavadocStyleTRUE iff this comment block is in "Javadoc" style. This means that it starts as a brief description until the end of the sentences is found and then proceeds as a detailed description.
[in]isInbodyTRUE iff this comment block is located in the body of a function.
[in,out]protThe protection level in which this comment block was found. Commands in the comment block may override this.
[in,out]positionThe character position within comment where the comment block starts. Typically used in case the comment block contains multiple structural commands.
[out]newEntryNeededBoolean that is TRUE if the comment block parser finds that a the comment block finishes the entry and a new one needs to be started.
[in]markdownEnabledIndicates if markdown specific processing should be done.
[in,out]guardsTracks nested conditional sections (if,ifnot,..)
Returns
TRUE if the comment requires further processing. The parameter newEntryNeeded will typically be true in this case and position will indicate the offset inside the comment string where to proceed parsing. FALSE indicates no further processing is needed.

Definition at line 4971 of file commentscan.l.

4985{
4986 AUTO_TRACE("comment='{}' fileName={} lineNr={} isBrief={} isAutoBriefOn={} inInbody={}"
4987 " prot={} markdownSupport={}",Trace::trunc(comment),fileName,lineNr,isBrief,
4988 isAutoBriefOn,isInbody,prot,markdownSupport);
4989 yyscan_t yyscanner = p->yyscanner;
4990 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
4991
4992 initParser(yyscanner);
4993 yyextra->guards = guards;
4994 yyextra->langParser = parser;
4995 yyextra->current = curEntry;
4996 yyextra->current->docLine = (lineNr > 1 ? lineNr : 1);
4997 if (comment.isEmpty()) return FALSE; // avoid empty strings
4998 yyextra->inputString = comment;
4999 yyextra->inputString.append(" ");
5000 yyextra->inputPosition = position;
5001 yyextra->lineNr = lineNr;
5002 yyextra->fileName = fileName;
5003 yyextra->protection = prot;
5004 yyextra->needNewEntry = FALSE;
5005 yyextra->xrefKind = XRef_None;
5006 yyextra->xrefAppendFlag = FALSE;
5007 yyextra->insidePre = FALSE;
5008 yyextra->parseMore = FALSE;
5009 yyextra->inBody = isInbody;
5010 yyextra->markdownSupport= markdownSupport;
5011 yyextra->outputXRef.clear();
5012 if (!isBrief && !isAutoBriefOn && !yyextra->current->doc.isEmpty())
5013 { // add newline separator between detailed comment blocks
5014 yyextra->current->doc += '\n';
5015 }
5016 setOutput(yyscanner, isBrief || isAutoBriefOn ? OutputBrief : OutputDoc );
5017 yyextra->briefEndsAtDot = isAutoBriefOn;
5018 yyextra->condCount = 0;
5019 yyextra->sectionLevel = 0;
5020 yyextra->spaceBeforeCmd.clear();
5021 yyextra->spaceBeforeIf.clear();
5022 yyextra->htmlContextStack.clear();
5023
5024 DebugLex debugLex(Debug::Lex_commentscan, __FILE__, !fileName.isEmpty() ? qPrint(fileName): nullptr);
5025 if (!yyextra->current->inbodyDocs.isEmpty() && isInbody) // separate in body fragments
5026 {
5027 char cmd[30];
5028 qsnprintf(cmd,30,"\n\n\\iline %d \\ilinebr ",lineNr);
5029 yyextra->current->inbodyDocs+=cmd;
5030 }
5031
5032 Debug::print(Debug::CommentScan,0,"-----------\nCommentScanner: {}:{}\n"
5033 "input=[\n{}]\n",fileName,lineNr,yyextra->inputString
5034 );
5035
5036 commentscanYYrestart( nullptr, yyscanner );
5037 BEGIN( Comment );
5038 commentscanYYlex(yyscanner);
5039 setOutput(yyscanner, OutputDoc );
5040
5041 if (YY_START==OverloadParam) // comment ended with \overload
5042 {
5043 addOutput(yyscanner,getOverloadDocs());
5044 }
5045
5046 if (yyextra->insideParBlock)
5047 {
5048 warn(yyextra->fileName,yyextra->lineNr,
5049 "Documentation block ended while inside a \\parblock. Missing \\endparblock");
5050 }
5051
5052 yyextra->current->doc=stripLeadingAndTrailingEmptyLines(yyextra->current->doc,yyextra->current->docLine);
5053 yyextra->current->brief=stripLeadingAndTrailingEmptyLines(yyextra->current->brief,yyextra->current->docLine);
5054
5055 if (yyextra->current->section.isFileDoc() && yyextra->current->doc.isEmpty())
5056 {
5057 // to allow a comment block with just a @file command.
5058 yyextra->current->doc="\n\n";
5059 }
5060
5061 if (yyextra->current->section.isMemberGrp() &&
5062 yyextra->docGroup.isEmpty()) // @name section but no group started yet
5063 {
5064 yyextra->docGroup.open(yyextra->current,yyextra->fileName,yyextra->lineNr,true);
5065 }
5066
5067 Debug::print(Debug::CommentScan,0,"-----------\nCommentScanner: {}:{}\noutput=[\n"
5068 "brief=[line={}\n{}]\ndocs=[line={}\n{}]\ninbody=[line={}\n{}]\n]\n===========\n",
5069 fileName,lineNr,
5070 yyextra->current->briefLine,yyextra->current->brief,
5071 yyextra->current->docLine,yyextra->current->doc,
5072 yyextra->current->inbodyLine,yyextra->current->inbodyDocs
5073 );
5074
5075 checkFormula(yyscanner);
5076 prot = yyextra->protection;
5077
5078 yyextra->docGroup.addDocs(curEntry);
5079
5080 newEntryNeeded = yyextra->needNewEntry;
5081
5082 // if we did not proceed during this call, it does not make
5083 // sense to continue, since we get stuck. See bug 567346 for situations
5084 // were this happens
5085 if (yyextra->parseMore && position==yyextra->inputPosition) yyextra->parseMore=FALSE;
5086
5087 if (!yyextra->parseMore && !yyextra->guards->empty())
5088 {
5089 warn(yyextra->fileName,yyextra->lineNr,"Documentation block ended in the middle of a conditional section!");
5090 }
5091
5092 if (yyextra->parseMore) position=yyextra->inputPosition; else position=0;
5093
5094 lineNr = yyextra->lineNr;
5095 AUTO_TRACE_EXIT("position={} parseMore={} newEntryNeeded={}",
5096 position,yyextra->parseMore,newEntryNeeded);
5097
5098 return yyextra->parseMore;
5099}
@ CommentScan
Definition debug.h:32
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
Definition debug.h:77
int docLine
line number at which the documentation was found
Definition entry.h:202
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:167
void clear()
Definition qcstring.h:186
yyguts_t * yyscan_t
Definition code.l:24
@ XRef_None
static void setOutput(yyscan_t yyscanner, OutputContext ctx)
static void initParser(yyscan_t yyscanner)
static void addOutput(yyscan_t yyscanner, const char *s)
@ OutputDoc
@ OutputBrief
static void checkFormula(yyscan_t yyscanner)
#define AUTO_TRACE(...)
Definition docnode.cpp:48
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:50
#define warn(file, line, fmt,...)
Definition message.h:97
QCString trunc(const QCString &s, size_t numChars=15)
Definition trace.h:56
#define qsnprintf
Definition qcstring.h:49
const char * qPrint(const char *s)
Definition qcstring.h:691
#define FALSE
Definition qcstring.h:34
QCString stripLeadingAndTrailingEmptyLines(const QCString &s, int &docLine)
Special version of QCString::stripWhiteSpace() that only strips completely blank lines.
Definition util.cpp:5050
QCString getOverloadDocs()
Definition util.cpp:4110
const char * comment

References addOutput(), AUTO_TRACE, AUTO_TRACE_EXIT, checkFormula(), comment, Debug::CommentScan, Entry::docLine, FALSE, getOverloadDocs(), initParser(), QCString::isEmpty(), Debug::Lex_commentscan, OutputBrief, OutputDoc, p, Debug::print(), qPrint(), qsnprintf, setOutput(), stripLeadingAndTrailingEmptyLines(), Trace::trunc(), warn, and XRef_None.

Referenced by generateHtmlForComment(), and CitationManager::generatePage().

Member Data Documentation

◆ p

std::unique_ptr<Private> CommentScanner::p
private

The documentation for this class was generated from the following files: