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

4575 : p(std::make_unique<Private>())
4576{
4577 commentscanYYlex_init_extra(&p->extra,&p->yyscanner);
4578#ifdef FLEX_DEBUG
4579 commentscanYYset_debug(Debug::isFlagSet(Debug::Lex_commentscan)?1:0,p->yyscanner);
4580#endif
4581}
std::unique_ptr< Private > p
@ Lex_commentscan
Definition debug.h:52
static bool isFlagSet(const DebugMask mask)
Definition debug.cpp:134

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

◆ ~CommentScanner()

CommentScanner::~CommentScanner ( )

Definition at line 4583 of file commentscan.l.

4584{
4585 commentscanYYlex_destroy(p->yyscanner);
4586}

References p.

Member Function Documentation

◆ close()

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

Definition at line 4804 of file commentscan.l.

4805{
4806 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
4807 yyextra->docGroup.close(e,fileName,lineNr,foundInline,implicit);
4808}

References p.

◆ enterCompound()

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

Definition at line 4786 of file commentscan.l.

4787{
4788 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
4789 yyextra->docGroup.enterCompound(fileName,lineNr,name);
4790}

References p.

◆ enterFile()

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

Definition at line 4774 of file commentscan.l.

4775{
4776 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
4777 yyextra->docGroup.enterFile(fileName,lineNr);
4778}

References p.

◆ initGroupInfo()

void CommentScanner::initGroupInfo ( Entry * entry)

Definition at line 4768 of file commentscan.l.

4769{
4770 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
4771 yyextra->docGroup.initGroupInfo(entry);
4772}

References p.

◆ leaveCompound()

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

Definition at line 4792 of file commentscan.l.

4793{
4794 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
4795 yyextra->docGroup.leaveCompound(fileName,lineNr,name);
4796}

References p.

◆ leaveFile()

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

Definition at line 4780 of file commentscan.l.

4781{
4782 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
4783 yyextra->docGroup.leaveFile(fileName,lineNr);
4784}

References p.

◆ open()

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

Definition at line 4798 of file commentscan.l.

4799{
4800 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
4801 yyextra->docGroup.open(e,fileName,lineNr,implicit);
4802}

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

4602{
4603 AUTO_TRACE("comment='{}' fileName={} lineNr={} isBrief={} isAutoBriefOn={} inInbody={}"
4604 " prot={} markdownSupport={}",Trace::trunc(comment),fileName,lineNr,isBrief,
4605 isAutoBriefOn,isInbody,prot,markdownSupport);
4606 yyscan_t yyscanner = p->yyscanner;
4607 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
4608
4609 initParser(yyscanner);
4610 yyextra->guards = guards;
4611 yyextra->langParser = parser;
4612 yyextra->current = curEntry;
4613 yyextra->current->docLine = (lineNr > 1 ? lineNr : 1);
4614 if (comment.isEmpty()) return FALSE; // avoid empty strings
4615 yyextra->inputString = comment;
4616 yyextra->inputString.append(" ");
4617 yyextra->inputPosition = position;
4618 yyextra->lineNr = lineNr;
4619 yyextra->fileName = fileName;
4620 yyextra->protection = prot;
4621 yyextra->needNewEntry = FALSE;
4622 yyextra->xrefKind = XRef_None;
4623 yyextra->xrefAppendFlag = FALSE;
4624 yyextra->insidePre = FALSE;
4625 yyextra->parseMore = FALSE;
4626 yyextra->inBody = isInbody;
4627 yyextra->markdownSupport= markdownSupport;
4628 yyextra->outputXRef.clear();
4629 if (!isBrief && !isAutoBriefOn && !yyextra->current->doc.isEmpty())
4630 { // add newline separator between detailed comment blocks
4631 yyextra->current->doc += '\n';
4632 }
4633 setOutput(yyscanner, isBrief || isAutoBriefOn ? OutputBrief : OutputDoc );
4634 yyextra->briefEndsAtDot = isAutoBriefOn;
4635 yyextra->condCount = 0;
4636 yyextra->sectionLevel = 0;
4637 yyextra->spaceBeforeCmd.clear();
4638 yyextra->spaceBeforeIf.clear();
4639
4640 DebugLex debugLex(Debug::Lex_commentscan, __FILE__, !fileName.isEmpty() ? qPrint(fileName): nullptr);
4641 if (!yyextra->current->inbodyDocs.isEmpty() && isInbody) // separate in body fragments
4642 {
4643 char cmd[30];
4644 qsnprintf(cmd,30,"\n\n\\iline %d \\ilinebr ",lineNr);
4645 yyextra->current->inbodyDocs+=cmd;
4646 }
4647
4648 Debug::print(Debug::CommentScan,0,"-----------\nCommentScanner: %s:%d\n"
4649 "input=[\n%s]\n",qPrint(fileName),lineNr,qPrint(yyextra->inputString)
4650 );
4651
4652 commentscanYYrestart( nullptr, yyscanner );
4653 BEGIN( Comment );
4654 commentscanYYlex(yyscanner);
4655 setOutput(yyscanner, OutputDoc );
4656
4657 if (YY_START==OverloadParam) // comment ended with \overload
4658 {
4659 addOutput(yyscanner,getOverloadDocs());
4660 }
4661
4662 if (yyextra->insideParBlock)
4663 {
4664 warn(yyextra->fileName,yyextra->lineNr,
4665 "Documentation block ended while inside a \\parblock. Missing \\endparblock");
4666 }
4667
4668 yyextra->current->doc=stripLeadingAndTrailingEmptyLines(yyextra->current->doc,yyextra->current->docLine);
4669
4670 if (yyextra->current->section.isFileDoc() && yyextra->current->doc.isEmpty())
4671 {
4672 // to allow a comment block with just a @file command.
4673 yyextra->current->doc="\n\n";
4674 }
4675
4676 if (yyextra->current->section.isMemberGrp() &&
4677 yyextra->docGroup.isEmpty()) // @name section but no group started yet
4678 {
4679 yyextra->docGroup.open(yyextra->current,yyextra->fileName,yyextra->lineNr,true);
4680 }
4681
4682 Debug::print(Debug::CommentScan,0,"-----------\nCommentScanner: %s:%d\noutput=[\n"
4683 "brief=[line=%d\n%s]\ndocs=[line=%d\n%s]\ninbody=[line=%d\n%s]\n]\n===========\n",
4684 qPrint(fileName),lineNr,
4685 yyextra->current->briefLine,qPrint(yyextra->current->brief),
4686 yyextra->current->docLine,qPrint(yyextra->current->doc),
4687 yyextra->current->inbodyLine,qPrint(yyextra->current->inbodyDocs)
4688 );
4689
4690 checkFormula(yyscanner);
4691 prot = yyextra->protection;
4692
4693 yyextra->docGroup.addDocs(curEntry);
4694
4695 newEntryNeeded = yyextra->needNewEntry;
4696
4697 // if we did not proceed during this call, it does not make
4698 // sense to continue, since we get stuck. See bug 567346 for situations
4699 // were this happens
4700 if (yyextra->parseMore && position==yyextra->inputPosition) yyextra->parseMore=FALSE;
4701
4702 if (!yyextra->parseMore && !yyextra->guards->empty())
4703 {
4704 warn(yyextra->fileName,yyextra->lineNr,"Documentation block ended in the middle of a conditional section!");
4705 }
4706
4707 if (yyextra->parseMore) position=yyextra->inputPosition; else position=0;
4708
4709 lineNr = yyextra->lineNr;
4710 AUTO_TRACE_EXIT("position={} parseMore={} newEntryNeeded={}",
4711 position,yyextra->parseMore,newEntryNeeded);
4712
4713 return yyextra->parseMore;
4714}
@ CommentScan
Definition debug.h:31
static void print(DebugMask mask, int prio, const char *fmt,...)
Definition debug.cpp:80
int docLine
line number at which the documentation was found
Definition entry.h:200
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:143
void clear()
Definition qcstring.h:162
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:46
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:48
#define warn(file, line, fmt,...)
Definition message.h:59
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:652
#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:5292
QCString getOverloadDocs()
Definition util.cpp:4379
const char * comment

References addOutput(), AUTO_TRACE, AUTO_TRACE_EXIT, checkFormula(), QCString::clear(), 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 CitationManager::generatePage().

Member Data Documentation

◆ p

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

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