@@ -39,45 +39,63 @@ public EagerForTag(ForTag forTag) {
3939
4040 @ Override
4141 public String innerInterpret (TagNode tagNode , JinjavaInterpreter interpreter ) {
42- Set <DeferredToken > addedTokens = new HashSet <>();
43- EagerExecutionResult result = EagerContextWatcher .executeInChildContext (
44- eagerInterpreter -> {
45- EagerExpressionResult expressionResult = EagerExpressionResult .fromSupplier (
46- () -> getTag ().interpretUnchecked (tagNode , eagerInterpreter ),
47- eagerInterpreter
48- );
49- addedTokens .addAll (eagerInterpreter .getContext ().getDeferredTokens ());
50- return expressionResult ;
51- },
42+ Pair <List <String >, String > loopVarsAndExpression = getTag ()
43+ .getLoopVarsAndExpression ((TagToken ) tagNode .getMaster ());
44+ EagerExecutionResult collectionResult = EagerContextWatcher .executeInChildContext (
45+ eagerInterpreter ->
46+ EagerExpressionResolver .resolveExpression (
47+ '[' + loopVarsAndExpression .getRight () + ']' ,
48+ interpreter
49+ ),
5250 interpreter ,
5351 EagerContextWatcher
5452 .EagerChildContextConfig .newBuilder ()
5553 .withCheckForContextChanges (!interpreter .getContext ().isDeferredExecutionMode ())
5654 .build ()
5755 );
58- if (
59- result .getResult ().getResolutionState () == ResolutionState .NONE ||
60- (
61- !result .getResult ().isFullyResolved () &&
62- !result .getSpeculativeBindings ().isEmpty ()
63- )
64- ) {
65- EagerReconstructionUtils .resetSpeculativeBindings (interpreter , result );
66- interpreter .getContext ().removeDeferredTokens (addedTokens );
67- throw new DeferredValueException (
68- result .getResult ().getResolutionState () == ResolutionState .NONE
69- ? result .getResult ().toString ()
70- : "Modification inside partially evaluated for loop"
71- );
72- }
73- if (result .getResult ().isFullyResolved ()) {
74- return result .getResult ().toString (true );
75- } else {
76- return EagerReconstructionUtils .wrapInChildScope (
77- result .getResult ().toString (true ),
78- interpreter
56+ if (collectionResult .getResult ().isFullyResolved ()) {
57+ Set <DeferredToken > addedTokens = new HashSet <>();
58+ EagerExecutionResult result = EagerContextWatcher .executeInChildContext (
59+ eagerInterpreter -> {
60+ EagerExpressionResult expressionResult = EagerExpressionResult .fromSupplier (
61+ () ->
62+ getTag ()
63+ .renderForCollection (
64+ tagNode ,
65+ eagerInterpreter ,
66+ loopVarsAndExpression .getLeft (),
67+ collectionResult .getResult ().toList ().get (0 )
68+ ),
69+ eagerInterpreter
70+ );
71+ addedTokens .addAll (eagerInterpreter .getContext ().getDeferredTokens ());
72+ return expressionResult ;
73+ },
74+ interpreter ,
75+ EagerContextWatcher .EagerChildContextConfig .newBuilder ().build ()
7976 );
77+ if (result .getResult ().getResolutionState () == ResolutionState .NONE ) {
78+ EagerReconstructionUtils .resetSpeculativeBindings (interpreter , collectionResult );
79+ EagerReconstructionUtils .resetSpeculativeBindings (interpreter , result );
80+ interpreter .getContext ().removeDeferredTokens (addedTokens );
81+ throw new DeferredValueException (result .getResult ().toString ());
82+ }
83+ if (result .getResult ().isFullyResolved ()) {
84+ return result .getResult ().toString (true );
85+ } else {
86+ return (
87+ result
88+ .getPrefixToPreserveState ()
89+ .withAllInFront (collectionResult .getPrefixToPreserveState ()) +
90+ EagerReconstructionUtils .wrapInChildScope (
91+ result .getResult ().toString (true ),
92+ interpreter
93+ )
94+ );
95+ }
8096 }
97+ EagerReconstructionUtils .resetSpeculativeBindings (interpreter , collectionResult );
98+ throw new DeferredValueException (collectionResult .getResult ().toString ());
8199 }
82100
83101 @ Override
0 commit comments