Skip to content

Commit 444a9f4

Browse files
authored
Merge pull request #1193 from HubSpot/deferred-lazy-ref-fix
Fix sorting of DeferredLazyReference values that are prefixed before deferred block of code (such as an if tag block)
2 parents 7486760 + 63c9950 commit 444a9f4

6 files changed

Lines changed: 27 additions & 5 deletions

File tree

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import static com.hubspot.jinjava.util.EagerReconstructionUtils.buildSetTag;
44

55
import com.google.common.annotations.Beta;
6+
import com.hubspot.jinjava.interpret.DeferredLazyReference;
67
import com.hubspot.jinjava.interpret.DeferredLazyReferenceSource;
78
import com.hubspot.jinjava.interpret.DeferredValueShadow;
89
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
9-
import com.hubspot.jinjava.interpret.LazyReference;
1010
import com.hubspot.jinjava.objects.serialization.PyishObjectMapper;
1111
import com.hubspot.jinjava.util.EagerExpressionResolver.EagerExpressionResult;
1212
import com.hubspot.jinjava.util.EagerReconstructionUtils;
@@ -65,7 +65,7 @@ public PrefixToPreserveState getPrefixToPreserveState() {
6565
.collect(Collectors.toList());
6666
filteredEntries
6767
.stream()
68-
.filter(entry -> !(entry.getValue() instanceof LazyReference))
68+
.filter(entry -> !(entry.getValue() instanceof DeferredLazyReference))
6969
.forEach(entry ->
7070
EagerReconstructionUtils.hydrateBlockOrInlineSetTagRecursively(
7171
prefixToPreserveState,
@@ -76,11 +76,13 @@ public PrefixToPreserveState getPrefixToPreserveState() {
7676
);
7777
filteredEntries
7878
.stream()
79-
.filter(entry -> (entry.getValue() instanceof LazyReference))
79+
.filter(entry -> (entry.getValue() instanceof DeferredLazyReference))
8080
.map(entry ->
8181
new AbstractMap.SimpleImmutableEntry<>(
8282
entry.getKey(),
83-
PyishObjectMapper.getAsPyishString(entry.getValue())
83+
PyishObjectMapper.getAsPyishString(
84+
((DeferredLazyReference) entry.getValue()).getOriginalValue()
85+
)
8486
)
8587
)
8688
.sorted((a, b) ->

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1158,7 +1158,14 @@ public void itDefersCallTagWithDeferredArgumentSecondPass() {
11581158
@Test
11591159
public void itHandlesDuplicateVariableReferenceModification() {
11601160
expectedTemplateInterpreter.assertExpectedOutputNonIdempotent(
1161-
"handles-duplicate-variable-reference-modification"
1161+
"handles-duplicate-variable-reference-modification/test"
1162+
);
1163+
}
1164+
1165+
@Test
1166+
public void itHandlesDuplicateVariableReferenceSpeculativeModification() {
1167+
expectedTemplateInterpreter.assertExpectedOutputNonIdempotent(
1168+
"handles-duplicate-variable-reference-speculative-modification/test"
11621169
);
11631170
}
11641171

src/test/resources/eager/handles-duplicate-variable-reference-modification.expected.jinja renamed to src/test/resources/eager/handles-duplicate-variable-reference-modification/test.expected.jinja

File renamed without changes.

src/test/resources/eager/handles-duplicate-variable-reference-modification.jinja renamed to src/test/resources/eager/handles-duplicate-variable-reference-modification/test.jinja

File renamed without changes.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{% set foo = ['a', 1] %}{% set bar = foo %}{% if deferred %}
2+
{% do bar.append(2) %}
3+
{% endif %}
4+
{% do bar.append(3) %}
5+
{{ foo ~ 'and' ~ bar }}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{% set foo = ['a'] -%}
2+
{%- set bar = foo -%}
3+
{% do bar.append(1) %}
4+
{% if deferred %}
5+
{% do bar.append(2) %}
6+
{% endif %}
7+
{% do bar.append(3) %}
8+
{{ foo ~ 'and' ~ bar }}

0 commit comments

Comments
 (0)