Skip to content

Commit 1e6ff21

Browse files
authored
Merge pull request #1265 from HubSpot/handle-continue-used-in-deferred-for-loop
fix(eager execution): Create DeferredNodes rather than NotInLoopException when trying to evaluate continue or break in a deferred for loop
2 parents 8d01d13 + e01171b commit 1e6ff21

File tree

5 files changed

+42
-0
lines changed

5 files changed

+42
-0
lines changed

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

Lines changed: 3 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.DeferredValue;
56
import com.hubspot.jinjava.interpret.DeferredValueException;
67
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
78
import com.hubspot.jinjava.interpret.NotInLoopException;
@@ -37,6 +38,8 @@ public String interpret(TagNode tagNode, JinjavaInterpreter interpreter) {
3738
}
3839
ForLoop forLoop = (ForLoop) loop;
3940
forLoop.doBreak();
41+
} else if (loop instanceof DeferredValue) {
42+
throw new DeferredValueException("Deferred break");
4043
} else {
4144
throw new NotInLoopException(TAG_NAME);
4245
}

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

Lines changed: 3 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.DeferredValue;
56
import com.hubspot.jinjava.interpret.DeferredValueException;
67
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
78
import com.hubspot.jinjava.interpret.NotInLoopException;
@@ -35,6 +36,8 @@ public String interpret(TagNode tagNode, JinjavaInterpreter interpreter) {
3536
}
3637
ForLoop forLoop = (ForLoop) loop;
3738
forLoop.doContinue();
39+
} else if (loop instanceof DeferredValue) {
40+
throw new DeferredValueException("Deferred continue");
3841
} else {
3942
throw new NotInLoopException(TAG_NAME);
4043
}

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1655,6 +1655,16 @@ public void itHandlesDeferredBreakInForLoop() {
16551655
assertThat(interpreter.getContext().getDeferredNodes()).isNotEmpty();
16561656
}
16571657

1658+
@Test
1659+
public void itHandlesBreakInDeferredForLoop() {
1660+
String input = expectedTemplateInterpreter.getFixtureTemplate(
1661+
"handles-break-in-deferred-for-loop/test"
1662+
);
1663+
interpreter.render(input);
1664+
// We don't support this yet
1665+
assertThat(interpreter.getContext().getDeferredNodes()).isNotEmpty();
1666+
}
1667+
16581668
@Test
16591669
public void itHandlesDeferredContinueInForLoop() {
16601670
String input = expectedTemplateInterpreter.getFixtureTemplate(
@@ -1665,6 +1675,16 @@ public void itHandlesDeferredContinueInForLoop() {
16651675
assertThat(interpreter.getContext().getDeferredNodes()).isNotEmpty();
16661676
}
16671677

1678+
@Test
1679+
public void itHandlesContinueInDeferredForLoop() {
1680+
String input = expectedTemplateInterpreter.getFixtureTemplate(
1681+
"handles-continue-in-deferred-for-loop/test"
1682+
);
1683+
interpreter.render(input);
1684+
// We don't support this yet
1685+
assertThat(interpreter.getContext().getDeferredNodes()).isNotEmpty();
1686+
}
1687+
16681688
@Test
16691689
public void itReconstructsFromedMacro() {
16701690
expectedTemplateInterpreter.assertExpectedOutput("reconstructs-fromed-macro/test");
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 deferred %}
3+
{% if i %}
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 deferred %}
3+
{% if i %}
4+
{% continue %}
5+
{% endif %}
6+
i is: {{ i }}
7+
{% endfor %}
8+
End loop

0 commit comments

Comments
 (0)