Skip to content

Commit 9cf4ad6

Browse files
committed
Defer BreakTag and ContinueTag if they're used in deferredExecutionMode.
Eventually we can handle them
1 parent 69b70ba commit 9cf4ad6

File tree

6 files changed

+48
-0
lines changed

6 files changed

+48
-0
lines changed

src/main/java/com/hubspot/jinjava/lib/tag/BreakTag.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.hubspot.jinjava.doc.annotations.JinjavaDoc;
44
import com.hubspot.jinjava.doc.annotations.JinjavaTextMateSnippet;
5+
import com.hubspot.jinjava.interpret.DeferredValueException;
56
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
67
import com.hubspot.jinjava.interpret.NotInLoopException;
78
import com.hubspot.jinjava.tree.TagNode;
@@ -31,6 +32,9 @@ public String getName() {
3132
public String interpret(TagNode tagNode, JinjavaInterpreter interpreter) {
3233
Object loop = interpreter.getContext().get(ForTag.LOOP);
3334
if (loop instanceof ForLoop) {
35+
if (interpreter.getContext().isDeferredExecutionMode()) {
36+
throw new DeferredValueException("Deferred break");
37+
}
3438
ForLoop forLoop = (ForLoop) loop;
3539
forLoop.doBreak();
3640
} else {

src/main/java/com/hubspot/jinjava/lib/tag/ContinueTag.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.hubspot.jinjava.doc.annotations.JinjavaDoc;
44
import com.hubspot.jinjava.doc.annotations.JinjavaTextMateSnippet;
5+
import com.hubspot.jinjava.interpret.DeferredValueException;
56
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
67
import com.hubspot.jinjava.interpret.NotInLoopException;
78
import com.hubspot.jinjava.tree.TagNode;
@@ -29,6 +30,9 @@ public String getName() {
2930
public String interpret(TagNode tagNode, JinjavaInterpreter interpreter) {
3031
Object loop = interpreter.getContext().get(ForTag.LOOP);
3132
if (loop instanceof ForLoop) {
33+
if (interpreter.getContext().isDeferredExecutionMode()) {
34+
throw new DeferredValueException("Deferred continue");
35+
}
3236
ForLoop forLoop = (ForLoop) loop;
3337
forLoop.doContinue();
3438
} else {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
import com.google.common.collect.ImmutableMap;
66
import com.google.common.collect.ImmutableSet;
77
import com.hubspot.jinjava.lib.tag.BlockTag;
8+
import com.hubspot.jinjava.lib.tag.BreakTag;
89
import com.hubspot.jinjava.lib.tag.CallTag;
10+
import com.hubspot.jinjava.lib.tag.ContinueTag;
911
import com.hubspot.jinjava.lib.tag.CycleTag;
1012
import com.hubspot.jinjava.lib.tag.DoTag;
1113
import com.hubspot.jinjava.lib.tag.ElseIfTag;
@@ -54,6 +56,8 @@ public class EagerTagFactory {
5456
.add(ElseTag.class)
5557
.add(RawTag.class)
5658
.add(ExtendsTag.class) // TODO support reconstructing extends tags
59+
.add(BreakTag.class) // TODO support eager break tag
60+
.add(ContinueTag.class) // TODO support eager continue tag
5761
.build();
5862

5963
@SuppressWarnings("unchecked")

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1644,4 +1644,24 @@ public void itWrapsMacroThatWouldChangeCurrentPathInChildScope() {
16441644
"wraps-macro-that-would-change-current-path-in-child-scope/test"
16451645
);
16461646
}
1647+
1648+
@Test
1649+
public void itHandlesDeferredBreakInForLoop() {
1650+
String input = expectedTemplateInterpreter.getFixtureTemplate(
1651+
"handles-deferred-break-in-for-loop/test"
1652+
);
1653+
interpreter.render(input);
1654+
// We don't support this yet
1655+
assertThat(interpreter.getContext().getDeferredNodes()).isNotEmpty();
1656+
}
1657+
1658+
@Test
1659+
public void itHandlesDeferredContinueInForLoop() {
1660+
String input = expectedTemplateInterpreter.getFixtureTemplate(
1661+
"handles-deferred-continue-in-for-loop/test"
1662+
);
1663+
interpreter.render(input);
1664+
// We don't support this yet
1665+
assertThat(interpreter.getContext().getDeferredNodes()).isNotEmpty();
1666+
}
16471667
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Start loop
2+
{% for i in range(5) %}
3+
{% if deferred %}
4+
{% break %}
5+
{% endif %}
6+
i is: {{ i }}
7+
{% endfor %}
8+
End loop
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Start loop
2+
{% for i in range(5) %}
3+
{% if deferred %}
4+
{% continue %}
5+
{% endif %}
6+
i is: {{ i }}
7+
{% endfor %}
8+
End loop

0 commit comments

Comments
 (0)