Skip to content

Commit bc15907

Browse files
committed
Don't cause set tags for current_path to disappear in nested
interpretation
1 parent d0f329e commit bc15907

4 files changed

Lines changed: 25 additions & 8 deletions

File tree

src/main/java/com/hubspot/jinjava/lib/tag/eager/EagerSetTagStrategy.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
66
import com.hubspot.jinjava.interpret.MetaContextVariables;
77
import com.hubspot.jinjava.lib.tag.SetTag;
8+
import com.hubspot.jinjava.loader.RelativePathResolver;
89
import com.hubspot.jinjava.tree.TagNode;
910
import com.hubspot.jinjava.util.EagerReconstructionUtils;
1011
import com.hubspot.jinjava.util.PrefixToPreserveState;
@@ -53,9 +54,14 @@ public String run(TagNode tagNode, JinjavaInterpreter interpreter) {
5354
expression,
5455
interpreter
5556
);
57+
boolean triedResolve = false;
5658
if (
5759
eagerExecutionResult.getResult().isFullyResolved() &&
58-
!interpreter.getContext().isDeferredExecutionMode()
60+
!interpreter.getContext().isDeferredExecutionMode() &&
61+
(Arrays
62+
.stream(variables)
63+
.noneMatch(RelativePathResolver.CURRENT_PATH_CONTEXT_KEY::equals) ||
64+
interpreter.getContext().getPenultimateParent().getDeferredTokens().isEmpty()) // Prevents set tags from disappearing in nested interpretation
5965
) {
6066
EagerReconstructionUtils.commitSpeculativeBindings(
6167
interpreter,
@@ -67,6 +73,7 @@ public String run(TagNode tagNode, JinjavaInterpreter interpreter) {
6773
eagerExecutionResult,
6874
interpreter
6975
);
76+
triedResolve = true;
7077
if (maybeResolved.isPresent()) {
7178
return maybeResolved.get();
7279
}
@@ -77,10 +84,7 @@ public String run(TagNode tagNode, JinjavaInterpreter interpreter) {
7784
eagerExecutionResult,
7885
interpreter
7986
);
80-
if (
81-
eagerExecutionResult.getResult().isFullyResolved() &&
82-
interpreter.getContext().isDeferredExecutionMode()
83-
) {
87+
if (eagerExecutionResult.getResult().isFullyResolved() && !triedResolve) {
8488
attemptResolve(tagNode, variables, eagerExecutionResult, interpreter);
8589
}
8690
return buildImage(tagNode, variables, eagerExecutionResult, triple, interpreter);

src/test/java/com/hubspot/jinjava/ExpectedTemplateInterpreter.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.google.common.io.Resources;
77
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
88
import com.hubspot.jinjava.interpret.JinjavaInterpreter.InterpreterScopeClosable;
9+
import com.hubspot.jinjava.loader.RelativePathResolver;
910
import com.hubspot.jinjava.mode.DefaultExecutionMode;
1011
import java.io.IOException;
1112
import java.nio.charset.StandardCharsets;
@@ -147,6 +148,12 @@ public String getFixtureTemplate(String name) {
147148
.getContext()
148149
.getCurrentPathStack()
149150
.push(String.format("%s/%s.jinja", path, name), 0, 0);
151+
interpreter
152+
.getContext()
153+
.put(
154+
RelativePathResolver.CURRENT_PATH_CONTEXT_KEY,
155+
String.format("%s/%s.jinja", path, name)
156+
);
150157
}
151158
return simplify(
152159
Resources.toString(

src/test/java/com/hubspot/jinjava/lib/tag/eager/EagerImportTagTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ public void itDefersTripleLayer() {
331331
removeDeferredContextKeys();
332332
context.put("a_val", "a");
333333
// There are some extras due to deferred values copying up the context stack.
334+
context.getDeferredTokens().clear();
334335
assertThat(interpreter.render(result).trim())
335336
.isEqualTo(
336337
interpreter.render(
@@ -363,6 +364,7 @@ public void itDefersQuadLayer() {
363364
removeDeferredContextKeys();
364365

365366
context.put("a_val", "a");
367+
context.getDeferredTokens().clear();
366368
assertThat(interpreter.render(result).trim()).isEqualTo("12345 cbaabaaba");
367369
}
368370

@@ -655,6 +657,7 @@ public void itDoesNotSilentlyOverrideVariable() {
655657
"{{ vars.foo }}"
656658
);
657659
interpreter.getContext().put("deferred", "resolved");
660+
context.getDeferredTokens().clear();
658661
assertThat(interpreter.render(result)).isEqualTo("ab");
659662
}
660663

@@ -687,6 +690,7 @@ public void itDoesNotSilentlyOverrideVariableWithoutAlias() {
687690
);
688691

689692
interpreter.getContext().put("deferred", "resolved");
693+
context.getDeferredTokens().clear();
690694
assertThat(interpreter.render(result)).isEqualTo("ab");
691695
}
692696

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
Starting current_path: starting path
2-
Intermediate current_path: starting path
1+
Starting current_path: eager/wraps-macro-that-would-change-current-path-in-child-scope/test.jinja
2+
Intermediate current_path: eager/wraps-macro-that-would-change-current-path-in-child-scope/test.jinja
33
{% for __ignored__ in [0] %}\
4+
{% set __temp_meta_current_path_629250870__,current_path = 'eager/wraps-macro-that-would-change-current-path-in-child-scope/test.jinja', 'eager/wraps-macro-that-would-change-current-path-in-child-scope/dir2/included.jinja' %}\
45
{% set foo = deferred %}
56
{{ foo }}\
7+
{% set current_path,__temp_meta_current_path_629250870__ = 'eager/wraps-macro-that-would-change-current-path-in-child-scope/test.jinja', null %}\
68
{% print foo %}\
79
{% endfor %}
8-
Ending current_path: starting path
10+
Ending current_path: eager/wraps-macro-that-would-change-current-path-in-child-scope/test.jinja

0 commit comments

Comments
 (0)