Skip to content

Commit 707ac84

Browse files
committed
Merge branch 'albert-github-feature/bug_cite_par'
2 parents 4539414 + c27b300 commit 707ac84

5 files changed

Lines changed: 197 additions & 168 deletions

File tree

src/docnode.cpp

Lines changed: 44 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -502,9 +502,8 @@ bool DocXRefItem::parse()
502502

503503
if (!item->text().isEmpty())
504504
{
505-
parser()->pushContext();
505+
DocParser::AutoSaveContext saveContext(*parser());
506506
parser()->internalValidatingParseDoc(thisVariant(),children(),item->text());
507-
parser()->popContext();
508507
}
509508
}
510509
return TRUE;
@@ -922,9 +921,9 @@ void DocRef::parse(char cmdChar,const QCString &cmdName)
922921
"Potential recursion while resolving {:c}{} command!",cmdChar,cmdName);
923922
}
924923
parser()->context.insideHtmlLink=TRUE;
925-
parser()->pushContext();
926-
parser()->internalValidatingParseDoc(thisVariant(),children(),text);
927-
parser()->popContext();
924+
{ DocParser::AutoSaveContext saveContext(*parser());
925+
parser()->internalValidatingParseDoc(thisVariant(),children(),text);
926+
}
928927
parser()->context.insideHtmlLink=FALSE;
929928
parser()->tokenizer.setStatePara();
930929
flattenParagraphs(thisVariant(),children());
@@ -2046,15 +2045,15 @@ static Token skipSpacesForTable(DocParser *parser)
20462045
auto cmdType = Mappers::cmdMapper->map(cmdName);
20472046
if (cmdType==CommandType::CMD_ILINE)
20482047
{
2049-
parser->tokenizer.pushState();
2050-
parser->tokenizer.setStateILine();
2051-
tok = parser->tokenizer.lex();
2052-
if (!tok.is(TokenRetval::TK_WORD))
2053-
{
2054-
warn_doc_error(parser->context.fileName,parser->tokenizer.getLineNr(),"invalid argument for command '{:c}{}'",
2055-
tok.command_to_char(),cmdName);
2048+
{ DocTokenizer::AutoSaveState saveState(parser->tokenizer);
2049+
parser->tokenizer.setStateILine();
2050+
tok = parser->tokenizer.lex();
2051+
if (!tok.is(TokenRetval::TK_WORD))
2052+
{
2053+
warn_doc_error(parser->context.fileName,parser->tokenizer.getLineNr(),"invalid argument for command '{:c}{}'",
2054+
tok.command_to_char(),cmdName);
2055+
}
20562056
}
2057-
parser->tokenizer.popState();
20582057
tok = parser->tokenizer.lex();
20592058
}
20602059
else
@@ -3127,9 +3126,9 @@ void DocTitle::parse()
31273126
void DocTitle::parseFromString(DocNodeVariant *parent,const QCString &text)
31283127
{
31293128
parser()->context.insideHtmlLink=TRUE;
3130-
parser()->pushContext(); // this will create a new parser->context.token
3131-
parser()->internalValidatingParseDoc(thisVariant(),children(),text);
3132-
parser()->popContext(); // this will restore the old parser->context.token
3129+
{ DocParser::AutoSaveContext saveContext(*parser());
3130+
parser()->internalValidatingParseDoc(thisVariant(),children(),text);
3131+
}
31333132
parser()->context.insideHtmlLink=FALSE;
31343133
parser()->tokenizer.setStatePara();
31353134
flattenParagraphs(thisVariant(),children());
@@ -3194,9 +3193,9 @@ Token DocSimpleSect::parseRcs()
31943193
title->parseFromString(thisVariant(),parser()->context.token->name);
31953194

31963195
QCString text = parser()->context.token->text;
3197-
parser()->pushContext(); // this will create a new parser->context.token
3198-
parser()->internalValidatingParseDoc(thisVariant(),children(),text);
3199-
parser()->popContext(); // this will restore the old parser->context.token
3196+
{ DocParser::AutoSaveContext saveContext(*parser());
3197+
parser()->internalValidatingParseDoc(thisVariant(),children(),text);
3198+
}
32003199

32013200
return Token::make_RetVal_OK();
32023201
}
@@ -3537,111 +3536,6 @@ Token DocPara::handleParamSection(const QCString &cmdName,
35373536
return (!rv.is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
35383537
}
35393538

3540-
void DocPara::handleCite(char cmdChar,const QCString &cmdName)
3541-
{
3542-
AUTO_TRACE();
3543-
QCString saveCmdName = cmdName;
3544-
// get the argument of the cite command.
3545-
Token tok=parser()->tokenizer.lex();
3546-
3547-
CiteInfoOption option;
3548-
if (tok.is(TokenRetval::TK_WORD) && parser()->context.token->name=="{")
3549-
{
3550-
parser()->tokenizer.setStateOptions();
3551-
parser()->tokenizer.lex();
3552-
StringVector optList=split(parser()->context.token->name.str(),",");
3553-
for (auto const &opt : optList)
3554-
{
3555-
if (opt == "number")
3556-
{
3557-
if (!option.isUnknown())
3558-
{
3559-
warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3560-
}
3561-
else
3562-
{
3563-
option = CiteInfoOption::makeNumber();
3564-
}
3565-
}
3566-
else if (opt == "year")
3567-
{
3568-
if (!option.isUnknown())
3569-
{
3570-
warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3571-
}
3572-
else
3573-
{
3574-
option = CiteInfoOption::makeYear();
3575-
}
3576-
}
3577-
else if (opt == "shortauthor")
3578-
{
3579-
if (!option.isUnknown())
3580-
{
3581-
warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3582-
}
3583-
else
3584-
{
3585-
option = CiteInfoOption::makeShortAuthor();
3586-
}
3587-
}
3588-
else if (opt == "nopar")
3589-
{
3590-
option.setNoPar();
3591-
}
3592-
else if (opt == "nocite")
3593-
{
3594-
option.setNoCite();
3595-
}
3596-
else
3597-
{
3598-
warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unknown option specified with \\{}, discarding '{}'", saveCmdName, opt);
3599-
}
3600-
}
3601-
3602-
if (option.isUnknown()) option.changeToNumber();
3603-
3604-
parser()->tokenizer.setStatePara();
3605-
tok=parser()->tokenizer.lex();
3606-
if (!tok.is(TokenRetval::TK_WHITESPACE))
3607-
{
3608-
warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\{} command",
3609-
saveCmdName);
3610-
return;
3611-
}
3612-
}
3613-
else if (!tok.is(TokenRetval::TK_WHITESPACE))
3614-
{
3615-
warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
3616-
cmdChar,saveCmdName);
3617-
return;
3618-
}
3619-
else
3620-
{
3621-
option = CiteInfoOption::makeNumber();
3622-
}
3623-
3624-
parser()->tokenizer.setStateCite();
3625-
tok=parser()->tokenizer.lex();
3626-
if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3627-
{
3628-
warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"THE ONE unexpected end of comment block while parsing the "
3629-
"argument of command '{:c}{}'",cmdChar,saveCmdName);
3630-
return;
3631-
}
3632-
else if (!tok.is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3633-
{
3634-
warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of '{:c}{}'",
3635-
tok.to_string(),cmdChar,saveCmdName);
3636-
return;
3637-
}
3638-
parser()->context.token->sectionId = parser()->context.token->name;
3639-
children().append<DocCite>(
3640-
parser(),thisVariant(),parser()->context.token->name,parser()->context.context,option);
3641-
3642-
parser()->tokenizer.setStatePara();
3643-
}
3644-
36453539
void DocPara::handleEmoji(char cmdChar,const QCString &cmdName)
36463540
{
36473541
AUTO_TRACE();
@@ -4201,25 +4095,29 @@ void DocPara::handleInheritDoc()
42014095
if (reMd) // member from which was inherited.
42024096
{
42034097
const MemberDef *thisMd = parser()->context.memberDef;
4204-
//printf("{InheritDocs:%s=>%s}\n",qPrint(parser()->context.memberDef->qualifiedName()),qPrint(reMd->qualifiedName()));
4205-
parser()->pushContext();
4206-
parser()->context.scope=reMd->getOuterScope();
4207-
if (parser()->context.scope!=Doxygen::globalScope)
4208-
{
4209-
parser()->context.context=parser()->context.scope->name();
4210-
}
4211-
parser()->context.memberDef=reMd;
4212-
while (!parser()->context.styleStack.empty()) parser()->context.styleStack.pop();
4213-
while (!parser()->context.nodeStack.empty()) parser()->context.nodeStack.pop();
4214-
parser()->context.copyStack.push_back(reMd);
4215-
parser()->internalValidatingParseDoc(thisVariant(),children(),reMd->briefDescription());
4216-
parser()->internalValidatingParseDoc(thisVariant(),children(),reMd->documentation());
4217-
parser()->context.copyStack.pop_back();
4218-
auto hasParamCommand = parser()->context.hasParamCommand;
4219-
auto hasReturnCommand = parser()->context.hasReturnCommand;
4220-
auto retvalsFound = parser()->context.retvalsFound;
4221-
auto paramsFound = parser()->context.paramsFound;
4222-
parser()->popContext();
4098+
bool hasParamCommand = false;
4099+
bool hasReturnCommand = false;
4100+
StringMultiSet retvalsFound;
4101+
StringMultiSet paramsFound;
4102+
{ DocParser::AutoSaveContext saveContext(*parser());
4103+
//printf("{InheritDocs:%s=>%s}\n",qPrint(parser()->context.memberDef->qualifiedName()),qPrint(reMd->qualifiedName()));
4104+
parser()->context.scope=reMd->getOuterScope();
4105+
if (parser()->context.scope!=Doxygen::globalScope)
4106+
{
4107+
parser()->context.context=parser()->context.scope->name();
4108+
}
4109+
parser()->context.memberDef=reMd;
4110+
while (!parser()->context.styleStack.empty()) parser()->context.styleStack.pop();
4111+
while (!parser()->context.nodeStack.empty()) parser()->context.nodeStack.pop();
4112+
parser()->context.copyStack.push_back(reMd);
4113+
parser()->internalValidatingParseDoc(thisVariant(),children(),reMd->briefDescription());
4114+
parser()->internalValidatingParseDoc(thisVariant(),children(),reMd->documentation());
4115+
parser()->context.copyStack.pop_back();
4116+
hasParamCommand = parser()->context.hasParamCommand;
4117+
hasReturnCommand = parser()->context.hasReturnCommand;
4118+
retvalsFound = parser()->context.retvalsFound;
4119+
paramsFound = parser()->context.paramsFound;
4120+
}
42234121
parser()->context.hasParamCommand = hasParamCommand;
42244122
parser()->context.hasReturnCommand = hasReturnCommand;
42254123
parser()->context.retvalsFound = retvalsFound;
@@ -4946,7 +4844,9 @@ Token DocPara::handleCommand(char cmdChar, const QCString &cmdName)
49464844
handleLink(cmdName,TRUE);
49474845
break;
49484846
case CommandType::CMD_CITE:
4949-
handleCite(cmdChar,cmdName);
4847+
{
4848+
parser()->handleCite(thisVariant(),children());
4849+
}
49504850
break;
49514851
case CommandType::CMD_EMOJI:
49524852
handleEmoji(cmdChar,cmdName);

src/docnode.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1106,7 +1106,6 @@ class DocPara : public DocCompoundNode
11061106
template<class T> void handleFile(const QCString &cmdName);
11071107
void handleInclude(const QCString &cmdName,DocInclude::Type t);
11081108
void handleLink(const QCString &cmdName,bool isJavaLink);
1109-
void handleCite(char cmdChar,const QCString &cmdName);
11101109
void handleDoxyConfig(char cmdChar,const QCString &cmdName);
11111110
void handleEmoji(char cmdChar,const QCString &cmdName);
11121111
void handleSection(char cmdChar,const QCString &cmdName);

0 commit comments

Comments
 (0)