Skip to content

Commit 3fb854b

Browse files
authored
Merge pull request #1093 from HubSpot/unclosed-token-warning
Add warnings for unclosed tokens
2 parents 74a997a + bae75dd commit 3fb854b

File tree

4 files changed

+58
-0
lines changed

4 files changed

+58
-0
lines changed

src/main/java/com/hubspot/jinjava/tree/TreeParser.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import com.hubspot.jinjava.tree.parse.Token;
3737
import com.hubspot.jinjava.tree.parse.TokenScanner;
3838
import com.hubspot.jinjava.tree.parse.TokenScannerSymbols;
39+
import com.hubspot.jinjava.tree.parse.UnclosedToken;
3940
import org.apache.commons.lang3.StringUtils;
4041

4142
public class TreeParser {
@@ -97,6 +98,20 @@ private Node nextNode() {
9798
Token token = scanner.next();
9899

99100
if (token.getType() == symbols.getFixed()) {
101+
if (token instanceof UnclosedToken) {
102+
interpreter.addError(
103+
new TemplateError(
104+
ErrorType.WARNING,
105+
ErrorReason.SYNTAX_ERROR,
106+
ErrorItem.TAG,
107+
"Unclosed token",
108+
"token",
109+
token.getLineNumber(),
110+
token.getStartPosition(),
111+
null
112+
)
113+
);
114+
}
100115
return text((TextToken) token);
101116
} else if (token.getType() == symbols.getExprStart()) {
102117
return expression((ExpressionToken) token);

src/main/java/com/hubspot/jinjava/tree/parse/TokenScanner.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,13 @@ private Token getEndToken() {
226226
int type = symbols.getFixed();
227227
if (inComment > 0) {
228228
type = symbols.getNote();
229+
} else if (inBlock > 0) {
230+
return new UnclosedToken(
231+
String.valueOf(is, tokenStart, tokenLength),
232+
currLine,
233+
tokenStart - lastNewlinePos + 1,
234+
symbols
235+
);
229236
}
230237
return Token.newToken(
231238
type,
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.hubspot.jinjava.tree.parse;
2+
3+
public class UnclosedToken extends TextToken {
4+
5+
public UnclosedToken(
6+
String image,
7+
int lineNumber,
8+
int startPosition,
9+
TokenScannerSymbols symbols
10+
) {
11+
super(image, lineNumber, startPosition, symbols);
12+
}
13+
}

src/test/java/com/hubspot/jinjava/tree/TreeParserTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,29 @@ public void itWarnsAgainstUnclosedComment() {
164164
assertThat(interpreter.getErrors().get(0).getFieldName()).isEqualTo("comment");
165165
}
166166

167+
@Test
168+
public void itWarnsAgainstUnclosedExpression() {
169+
String expression = "foo {{ this is an unclosed expression %}";
170+
final Node tree = new TreeParser(interpreter, expression).buildTree();
171+
assertThat(interpreter.getErrors()).hasSize(1);
172+
assertThat(interpreter.getErrors().get(0).getSeverity()).isEqualTo(ErrorType.WARNING);
173+
assertThat(interpreter.getErrors().get(0).getMessage()).isEqualTo("Unclosed token");
174+
assertThat(interpreter.getErrors().get(0).getFieldName()).isEqualTo("token");
175+
assertThat(interpreter.render(tree))
176+
.isEqualTo("foo {{ this is an unclosed expression %}");
177+
}
178+
179+
@Test
180+
public void itWarnsAgainstUnclosedTag() {
181+
String expression = "foo {% this is an unclosed tag }}";
182+
final Node tree = new TreeParser(interpreter, expression).buildTree();
183+
assertThat(interpreter.getErrors()).hasSize(1);
184+
assertThat(interpreter.getErrors().get(0).getSeverity()).isEqualTo(ErrorType.WARNING);
185+
assertThat(interpreter.getErrors().get(0).getMessage()).isEqualTo("Unclosed token");
186+
assertThat(interpreter.getErrors().get(0).getFieldName()).isEqualTo("token");
187+
assertThat(interpreter.render(tree)).isEqualTo("foo {% this is an unclosed tag }}");
188+
}
189+
167190
@Test
168191
public void itWarnsTwiceAgainstUnclosedForTag() {
169192
String expression = "{% for item in list %}\n{% for elem in items %}";

0 commit comments

Comments
 (0)