@@ -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()
31273126void 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-
36453539void 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);
0 commit comments