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)

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 4916 of file commentscan.l.

4916 : p(std::make_unique<Private>())
4917{
4918 commentscanYYlex_init_extra(&p->extra,&p->yyscanner);
4919#ifdef FLEX_DEBUG
4920 commentscanYYset_debug(Debug::isFlagSet(Debug::Lex_commentscan)?1:0,p->yyscanner);
4921#endif
4922}
std::unique_ptr< Private > p
@ Lex_commentscan
Definition debug.h:54
static bool isFlagSet(const DebugMask mask)
Definition debug.cpp:132

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

◆ ~CommentScanner()

CommentScanner::~CommentScanner ( )

Definition at line 4924 of file commentscan.l.

4925{
4926 commentscanYYlex_destroy(p->yyscanner);
4927}

References p.

Member Function Documentation

◆ close()

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

Definition at line 5147 of file commentscan.l.

5148{
5149 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
5150 yyextra->docGroup.close(e,fileName,lineNr,foundInline,implicit);
5151}

References p.

◆ enterCompound()

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

Definition at line 5129 of file commentscan.l.

5130{
5131 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
5132 yyextra->docGroup.enterCompound(fileName,lineNr,name);
5133}

References p.

◆ enterFile()

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

Definition at line 5117 of file commentscan.l.

5118{
5119 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
5120 yyextra->docGroup.enterFile(fileName,lineNr);
5121}

References p.

Referenced by generateHtmlForComment().

◆ initGroupInfo()

void CommentScanner::initGroupInfo ( Entry * entry)

Definition at line 5111 of file commentscan.l.

5112{
5113 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
5114 yyextra->docGroup.initGroupInfo(entry);
5115}

References p.

◆ leaveCompound()

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

Definition at line 5135 of file commentscan.l.

5136{
5137 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
5138 yyextra->docGroup.leaveCompound(fileName,lineNr,name);
5139}

References p.

◆ leaveFile()

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

Definition at line 5123 of file commentscan.l.

5124{
5125 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
5126 yyextra->docGroup.leaveFile(fileName,lineNr);
5127}

References p.

Referenced by generateHtmlForComment().

◆ open()

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

Definition at line 5141 of file commentscan.l.

5142{
5143 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
5144 yyextra->docGroup.open(e,fileName,lineNr,implicit);
5145}

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 4929 of file commentscan.l.

4943{
4944 AUTO_TRACE("comment='{}' fileName={} lineNr={} isBrief={} isAutoBriefOn={} inInbody={}"
4945 " prot={} markdownSupport={}",Trace::trunc(comment),fileName,lineNr,isBrief,
4946 isAutoBriefOn,isInbody,prot,markdownSupport);
4947 yyscan_t yyscanner = p->yyscanner;
4948 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
4949
4950 initParser(yyscanner);
4951 yyextra->guards = guards;
4952 yyextra->langParser = parser;
4953 yyextra->current = curEntry;
4954 yyextra->current->docLine = (lineNr > 1 ? lineNr : 1);
4955 if (comment.isEmpty()) return FALSE; // avoid empty strings
4956 yyextra->inputString = comment;
4957 yyextra->inputString.append(" ");
4958 yyextra->inputPosition = position;
4959 yyextra->lineNr = lineNr;
4960 yyextra->fileName = fileName;
4961 yyextra->protection = prot;
4962 yyextra->needNewEntry = FALSE;
4963 yyextra->xrefKind = XRef_None;
4964 yyextra->xrefAppendFlag = FALSE;
4965 yyextra->insidePre = FALSE;
4966 yyextra->parseMore = FALSE;
4967 yyextra->inBody = isInbody;
4968 yyextra->markdownSupport= markdownSupport;
4969 yyextra->outputXRef.clear();
4970 if (!isBrief && !isAutoBriefOn && !yyextra->current->doc.isEmpty())
4971 { // add newline separator between detailed comment blocks
4972 yyextra->current->doc += '\n';
4973 }
4974 setOutput(yyscanner, isBrief || isAutoBriefOn ? OutputBrief : OutputDoc );
4975 yyextra->briefEndsAtDot = isAutoBriefOn;
4976 yyextra->condCount = 0;
4977 yyextra->sectionLevel = 0;
4978 yyextra->spaceBeforeCmd.clear();
4979 yyextra->spaceBeforeIf.clear();
4980 yyextra->htmlContextStack.clear();
4981
4982 DebugLex debugLex(Debug::Lex_commentscan, __FILE__, !fileName.isEmpty() ? qPrint(fileName): nullptr);
4983 if (!yyextra->current->inbodyDocs.isEmpty() && isInbody) // separate in body fragments
4984 {
4985 char cmd[30];
4986 qsnprintf(cmd,30,"\n\n\\iline %d \\ilinebr ",lineNr);
4987 yyextra->current->inbodyDocs+=cmd;
4988 }
4989
4990 Debug::print(Debug::CommentScan,0,"-----------\nCommentScanner: {}:{}\n"
4991 "input=[\n{}]\n",fileName,lineNr,yyextra->inputString
4992 );
4993
4994 commentscanYYrestart( nullptr, yyscanner );
4995 BEGIN( Comment );
4996 commentscanYYlex(yyscanner);
4997 setOutput(yyscanner, OutputDoc );
4998
4999 if (YY_START==OverloadParam) // comment ended with \overload
5000 {
5001 addOutput(yyscanner,getOverloadDocs());
5002 }
5003
5004 if (yyextra->insideParBlock)
5005 {
5006 warn(yyextra->fileName,yyextra->lineNr,
5007 "Documentation block ended while inside a \\parblock. Missing \\endparblock");
5008 }
5009
5010 yyextra->current->doc=stripLeadingAndTrailingEmptyLines(yyextra->current->doc,yyextra->current->docLine);
5011 yyextra->current->brief=stripLeadingAndTrailingEmptyLines(yyextra->current->brief,yyextra->current->docLine);
5012
5013 if (yyextra->current->section.isFileDoc() && yyextra->current->doc.isEmpty())
5014 {
5015 // to allow a comment block with just a @file command.
5016 yyextra->current->doc="\n\n";
5017 }
5018
5019 if (yyextra->current->section.isMemberGrp() &&
5020 yyextra->docGroup.isEmpty()) // @name section but no group started yet
5021 {
5022 yyextra->docGroup.open(yyextra->current,yyextra->fileName,yyextra->lineNr,true);
5023 }
5024
5025 Debug::print(Debug::CommentScan,0,"-----------\nCommentScanner: {}:{}\noutput=[\n"
5026 "brief=[line={}\n{}]\ndocs=[line={}\n{}]\ninbody=[line={}\n{}]\n]\n===========\n",
5027 fileName,lineNr,
5028 yyextra->current->briefLine,yyextra->current->brief,
5029 yyextra->current->docLine,yyextra->current->doc,
5030 yyextra->current->inbodyLine,yyextra->current->inbodyDocs
5031 );
5032
5033 checkFormula(yyscanner);
5034 prot = yyextra->protection;
5035
5036 yyextra->docGroup.addDocs(curEntry);
5037
5038 newEntryNeeded = yyextra->needNewEntry;
5039
5040 // if we did not proceed during this call, it does not make
5041 // sense to continue, since we get stuck. See bug 567346 for situations
5042 // were this happens
5043 if (yyextra->parseMore && position==yyextra->inputPosition) yyextra->parseMore=FALSE;
5044
5045 if (!yyextra->parseMore && !yyextra->guards->empty())
5046 {
5047 warn(yyextra->fileName,yyextra->lineNr,"Documentation block ended in the middle of a conditional section!");
5048 }
5049
5050 if (yyextra->parseMore) position=yyextra->inputPosition; else position=0;
5051
5052 lineNr = yyextra->lineNr;
5053 AUTO_TRACE_EXIT("position={} parseMore={} newEntryNeeded={}",
5054 position,yyextra->parseMore,newEntryNeeded);
5055
5056 return yyextra->parseMore;
5057}
@ CommentScan
Definition debug.h:32
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
Definition debug.h:76
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:163
void clear()
Definition qcstring.h:182
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:47
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:49
#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:687
#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:5010
QCString getOverloadDocs()
Definition util.cpp:4070
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: