Skip to content

Commit 52f7fe5

Browse files
committed
Apply tentative fix
1 parent a6c5d0b commit 52f7fe5

8 files changed

Lines changed: 195 additions & 0 deletions

File tree

src/main/java/com/hubspot/jinjava/interpret/JinjavaInterpreter.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,7 @@ private String render(Node root, boolean processExtendRoots, long renderLimit) {
427427
output.addNode(pathSetter);
428428
Optional<String> basePath = context.getCurrentPathStack().peek();
429429
StringBuilder ignoredOutput = new StringBuilder();
430+
boolean preserveBlocks = false;
430431
// render all extend parents, keeping the last as the root output
431432
if (processExtendRoots) {
432433
Set<String> extendPaths = new HashSet<>();
@@ -495,10 +496,24 @@ private String render(Node root, boolean processExtendRoots, long renderLimit) {
495496
basePath = Optional.of(currentPath);
496497
}
497498
}
499+
if (context.getDeferredTokens().size() > numDeferredTokensBefore) {
500+
preserveBlocks = true;
501+
}
498502
}
499503

500504
int numDeferredTokensBefore = context.getDeferredTokens().size();
501505
resolveBlockStubs(output);
506+
if (preserveBlocks) {
507+
for (BlockPlaceholderOutputNode blockPlaceholder : output.getBlocks()) {
508+
blockPlaceholder.resolve(
509+
"{%% block %s %%}%s{%% endblock %s %%}".formatted(
510+
blockPlaceholder.getBlockName(),
511+
blockPlaceholder.getValue(),
512+
blockPlaceholder.getBlockName()
513+
)
514+
);
515+
}
516+
}
502517
if (context.getDeferredTokens().size() > numDeferredTokensBefore) {
503518
pathSetter.setValue(
504519
EagerReconstructionUtils.buildBlockOrInlineSetTag(

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1753,4 +1753,40 @@ public void itHandlesDeferredValueInRenderFilter() {
17531753
"handles-deferred-value-in-render-filter/test"
17541754
);
17551755
}
1756+
1757+
@Test
1758+
public void itHandlesDeferredUsedInMultipleBlockLevels() {
1759+
expectedTemplateInterpreter.assertExpectedOutputNonIdempotent(
1760+
"handles-deferred-used-in-multiple-block-levels/test"
1761+
);
1762+
}
1763+
1764+
@Test
1765+
public void itHandlesDeferredUsedInMultipleBlockLevelsSecondPass() {
1766+
localContext.put("deferred", "resolved");
1767+
expectedTemplateInterpreter.assertExpectedOutput(
1768+
"handles-deferred-used-in-multiple-block-levels/test.expected"
1769+
);
1770+
expectedTemplateInterpreter.assertExpectedNonEagerOutput(
1771+
"handles-deferred-used-in-multiple-block-levels/test.expected"
1772+
);
1773+
}
1774+
1775+
@Test
1776+
public void itDoesNotDeferBlockWhenOnlyMiddleDefers() {
1777+
expectedTemplateInterpreter.assertExpectedOutputNonIdempotent(
1778+
"does-not-defer-block-when-only-middle-defers/test"
1779+
);
1780+
}
1781+
1782+
@Test
1783+
public void itDoesNotDeferBlockWhenOnlyMiddleDefersSecondPass() {
1784+
localContext.put("deferred", "resolved");
1785+
expectedTemplateInterpreter.assertExpectedOutput(
1786+
"does-not-defer-block-when-only-middle-defers/test.expected"
1787+
);
1788+
expectedTemplateInterpreter.assertExpectedNonEagerOutput(
1789+
"does-not-defer-block-when-only-middle-defers/test.expected"
1790+
);
1791+
}
17561792
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{% set tracker_base = '1_base' %}
2+
3+
4+
-----Pre-First-----
5+
{% block first -%}
6+
{%- endblock %}
7+
-----Post-First-----
8+
-----Pre-Second-----
9+
{% block second -%}
10+
{%- endblock %}
11+
-----Post-Second-----
12+
We aren't deferring tracker base.{# This message WILL show up in final output #}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{% extends '../../eager/does-not-defer-block-when-only-middle-defers/base.jinja' %}
2+
{% set tracker_middle = '2_middle' %}
3+
{% block first %}
4+
I WON'T SHOW UP
5+
{% endblock %}
6+
7+
{% block second %}
8+
tracker_base is: {{ tracker_base }}? {{ tracker_base == '1_base' }}
9+
tracker_middle is: {{ tracker_middle }}? {{ tracker_middle == 'resolved' }}
10+
tracker_test is: {{ tracker_test }}? {{ tracker_test == 'resolved' }}
11+
{% endblock %}
12+
Deferring tracker middle.{# This message will not show up in final output #}
13+
{% set tracker_middle = deferred %}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
-----Pre-First-----
2+
3+
tracker_base is: 1_base? true
4+
tracker_middle is: resolved? true
5+
tracker_test is: resolved? true
6+
7+
-----Post-First-----
8+
-----Pre-Second-----
9+
10+
tracker_base is: 1_base? true
11+
tracker_middle is: resolved? true
12+
tracker_test is: resolved? true
13+
14+
-----Post-Second-----
15+
We aren't deferring tracker base.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{# Start Label: ignored_output_from_extends #}{% do %}
2+
3+
4+
5+
Deferring tracker test.
6+
{% set tracker_test = deferred %}
7+
8+
9+
10+
11+
12+
Deferring tracker middle.
13+
{% set tracker_middle = deferred %}
14+
{% enddo %}\
15+
{# End Label: ignored_output_from_extends #}{% set current_path = 'eager/does-not-defer-block-when-only-middle-defers/base.jinja' %}
16+
17+
18+
-----Pre-First-----
19+
{% set __temp_meta_current_path_1008935144__,current_path = current_path,'eager/does-not-defer-block-when-only-middle-defers/test.jinja' %}
20+
tracker_base is: 1_base? true
21+
tracker_middle is: {{ tracker_middle }}\
22+
? {{ tracker_middle == 'resolved' }}
23+
tracker_test is: {{ tracker_test }}\
24+
? {{ tracker_test == 'resolved' }}
25+
{% set current_path,__temp_meta_current_path_1008935144__ = __temp_meta_current_path_1008935144__,null %}
26+
-----Post-First-----
27+
-----Pre-Second-----
28+
{% set __temp_meta_current_path_245328778__,current_path = current_path,'eager/does-not-defer-block-when-only-middle-defers/middle.jinja' %}
29+
tracker_base is: 1_base? true
30+
tracker_middle is: {{ tracker_middle }}\
31+
? {{ tracker_middle == 'resolved' }}
32+
tracker_test is: {{ tracker_test }}\
33+
? {{ tracker_test == 'resolved' }}
34+
{% set current_path,__temp_meta_current_path_245328778__ = __temp_meta_current_path_245328778__,null %}
35+
-----Post-Second-----
36+
We aren't deferring tracker base.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{% extends '../../eager/does-not-defer-block-when-only-middle-defers/middle.jinja' %}
2+
3+
{% set tracker_test = '3_test' %}
4+
{% block first %}
5+
tracker_base is: {{ tracker_base }}? {{ tracker_base == '1_base' }}
6+
tracker_middle is: {{ tracker_middle }}? {{ tracker_middle == 'resolved' }}
7+
tracker_test is: {{ tracker_test }}? {{ tracker_test == 'resolved' }}
8+
{% endblock %}
9+
Deferring tracker test.{# This message will not show up in final output #}
10+
{% set tracker_test = deferred %}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
{# Start Label: ignored_output_from_extends #}{% do %}
2+
3+
4+
5+
Deferring tracker test.
6+
{% set tracker_test = deferred %}
7+
8+
9+
10+
11+
12+
Deferring tracker middle.
13+
{% set tracker_middle = deferred %}
14+
{% enddo %}\
15+
{# End Label: ignored_output_from_extends #}{% set current_path = 'eager/handles-deferred-used-in-multiple-block-levels/base.jinja' %}
16+
17+
tracker_base is: 1_base? true
18+
tracker_middle is: {{ tracker_middle }}\
19+
? {{ tracker_middle == 'resolved' }}
20+
tracker_test is: {{ tracker_test }}\
21+
? {{ tracker_test == 'resolved' }}
22+
-----Pre-First-----
23+
{% block first %}\
24+
{% set __temp_meta_current_path_1057627035__,current_path = current_path,'eager/handles-deferred-used-in-multiple-block-levels/test.jinja' %}
25+
tracker_base is: {{ tracker_base }}\
26+
? {{ tracker_base == 'resolved' }}
27+
tracker_middle is: {{ tracker_middle }}\
28+
? {{ tracker_middle == 'resolved' }}
29+
tracker_test is: {{ tracker_test }}\
30+
? {{ tracker_test == 'resolved' }}
31+
{% set current_path,__temp_meta_current_path_1057627035__ = __temp_meta_current_path_1057627035__,null %}\
32+
{% endblock first %}
33+
-----Post-First-----
34+
tracker_base is: 1_base? true
35+
tracker_middle is: {{ tracker_middle }}\
36+
? {{ tracker_middle == 'resolved' }}
37+
tracker_test is: {{ tracker_test }}\
38+
? {{ tracker_test == 'resolved' }}
39+
-----Pre-Second-----
40+
{% block second %}\
41+
{% set __temp_meta_current_path_697061783__,current_path = current_path,'eager/handles-deferred-used-in-multiple-block-levels/middle.jinja' %}
42+
tracker_base is: {{ tracker_base }}\
43+
? {{ tracker_base == 'resolved' }}
44+
tracker_middle is: {{ tracker_middle }}\
45+
? {{ tracker_middle == 'resolved' }}
46+
tracker_test is: {{ tracker_test }}\
47+
? {{ tracker_test == 'resolved' }}
48+
{% set current_path,__temp_meta_current_path_697061783__ = __temp_meta_current_path_697061783__,null %}\
49+
{% endblock second %}
50+
-----Post-Second-----
51+
Deferring tracker base.
52+
{% set tracker_base = deferred %}
53+
tracker_base is: {{ tracker_base }}\
54+
? {{ tracker_base == 'resolved' }}
55+
tracker_middle is: {{ tracker_middle }}\
56+
? {{ tracker_middle == 'resolved' }}
57+
tracker_test is: {{ tracker_test }}\
58+
? {{ tracker_test == 'resolved' }}

0 commit comments

Comments
 (0)