@@ -62,6 +62,11 @@ StatementsParser::ParseResult StatementsParser::Parse(LexScanner& lexer, Stateme
6262 case Keyword::From:
6363 result = ParseFrom (lexer, statementsInfo, tok);
6464 break ;
65+ case Keyword::Do:
66+ if (!m_settings.extensions .Do )
67+ return MakeParseError (ErrorCode::ExtensionDisabled, tok);
68+ result = ParseDo (lexer, statementsInfo, tok);
69+ break ;
6570 case Keyword::Filter:
6671 case Keyword::EndFilter:
6772 case Keyword::EndSet:
@@ -142,7 +147,7 @@ StatementsParser::ParseResult StatementsParser::ParseFor(LexScanner &lexer, Stat
142147 }
143148
144149 auto pivotToken = lexer.PeekNextToken ();
145- ExpressionParser exprPraser;
150+ ExpressionParser exprPraser (m_settings) ;
146151 auto valueExpr = exprPraser.ParseFullExpression (lexer, false );
147152 if (!valueExpr)
148153 return valueExpr.get_unexpected ();
@@ -213,7 +218,7 @@ StatementsParser::ParseResult StatementsParser::ParseIf(LexScanner &lexer, State
213218 const Token &stmtTok)
214219{
215220 auto pivotTok = lexer.PeekNextToken ();
216- ExpressionParser exprParser;
221+ ExpressionParser exprParser (m_settings) ;
217222 auto valueExpr = exprParser.ParseFullExpression (lexer);
218223 if (!valueExpr)
219224 return MakeParseError (ErrorCode::ExpectedExpression, pivotTok);
@@ -239,7 +244,7 @@ StatementsParser::ParseResult StatementsParser::ParseElIf(LexScanner& lexer, Sta
239244 , const Token& stmtTok)
240245{
241246 auto pivotTok = lexer.PeekNextToken ();
242- ExpressionParser exprParser;
247+ ExpressionParser exprParser (m_settings) ;
243248 auto valueExpr = exprParser.ParseFullExpression (lexer);
244249 if (!valueExpr)
245250 return MakeParseError (ErrorCode::ExpectedExpression, pivotTok);
@@ -309,7 +314,7 @@ StatementsParser::ParseResult StatementsParser::ParseSet(LexScanner& lexer, Stat
309314 ExpressionEvaluatorPtr<> valueExpr;
310315 if (operTok == ' =' )
311316 {
312- ExpressionParser exprParser;
317+ ExpressionParser exprParser (m_settings) ;
313318 auto expr = exprParser.ParseFullExpression (lexer);
314319 if (!expr)
315320 return expr.get_unexpected ();
@@ -478,7 +483,7 @@ nonstd::expected<MacroParams, ParseError> StatementsParser::ParseMacroParams(Lex
478483 if (lexer.EatIfEqual (' )' ))
479484 return std::move (items);
480485
481- ExpressionParser exprParser;
486+ ExpressionParser exprParser (m_settings) ;
482487
483488 do
484489 {
@@ -562,7 +567,7 @@ StatementsParser::ParseResult StatementsParser::ParseCall(LexScanner& lexer, Sta
562567 CallParams callParams;
563568 if (lexer.EatIfEqual (' (' ))
564569 {
565- ExpressionParser exprParser;
570+ ExpressionParser exprParser (m_settings) ;
566571 auto result = exprParser.ParseCallParams (lexer);
567572 if (!result)
568573 return result.get_unexpected ();
@@ -606,7 +611,7 @@ StatementsParser::ParseResult StatementsParser::ParseInclude(LexScanner& lexer,
606611
607612 // auto operTok = lexer.NextToken();
608613 ExpressionEvaluatorPtr<> valueExpr;
609- ExpressionParser exprParser;
614+ ExpressionParser exprParser (m_settings) ;
610615 auto expr = exprParser.ParseFullExpression (lexer);
611616 if (!expr)
612617 return expr.get_unexpected ();
@@ -662,7 +667,7 @@ StatementsParser::ParseResult StatementsParser::ParseInclude(LexScanner& lexer,
662667StatementsParser::ParseResult StatementsParser::ParseImport (LexScanner& lexer, StatementInfoList& statementsInfo, const Token& stmtTok)
663668{
664669 ExpressionEvaluatorPtr<> valueExpr;
665- ExpressionParser exprParser;
670+ ExpressionParser exprParser (m_settings) ;
666671 auto expr = exprParser.ParseFullExpression (lexer);
667672 if (!expr)
668673 return expr.get_unexpected ();
@@ -709,7 +714,7 @@ StatementsParser::ParseResult StatementsParser::ParseImport(LexScanner& lexer, S
709714StatementsParser::ParseResult StatementsParser::ParseFrom (LexScanner& lexer, StatementInfoList& statementsInfo, const Token& stmtTok)
710715{
711716 ExpressionEvaluatorPtr<> valueExpr;
712- ExpressionParser exprParser;
717+ ExpressionParser exprParser (m_settings) ;
713718 auto expr = exprParser.ParseFullExpression (lexer);
714719 if (!expr)
715720 return expr.get_unexpected ();
@@ -795,4 +800,19 @@ StatementsParser::ParseResult StatementsParser::ParseFrom(LexScanner& lexer, Sta
795800 return ParseResult ();
796801}
797802
803+ StatementsParser::ParseResult StatementsParser::ParseDo (LexScanner& lexer, StatementInfoList& statementsInfo, const Token& stmtTok)
804+ {
805+ ExpressionEvaluatorPtr<> valueExpr;
806+ ExpressionParser exprParser (m_settings);
807+ auto expr = exprParser.ParseFullExpression (lexer);
808+ if (!expr)
809+ return expr.get_unexpected ();
810+ valueExpr = *expr;
811+
812+ auto renderer = std::make_shared<DoStatement>(valueExpr);
813+ statementsInfo.back ().currentComposition ->AddRenderer (renderer);
814+
815+ return jinja2::StatementsParser::ParseResult ();
816+ }
817+
798818}
0 commit comments