Skip to content

Commit fc1a462

Browse files
authored
Revert parsing fixes (#900)
1 parent e8d326d commit fc1a462

6 files changed

Lines changed: 60 additions & 153 deletions

File tree

src/main/java/com/hubspot/jinjava/el/ext/ExtendedParser.java

Lines changed: 39 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -426,83 +426,6 @@ protected AstRangeBracket createAstRangeBracket(
426426
);
427427
}
428428

429-
@Override
430-
protected AstNode mul(boolean required) throws ScanException, ParseException {
431-
AstNode v = filter(required);
432-
if (v == null) {
433-
return null;
434-
}
435-
while (true) {
436-
switch (getToken().getSymbol()) {
437-
case MUL:
438-
consumeToken();
439-
v = createAstBinary(v, filter(true), AstBinary.MUL);
440-
break;
441-
case DIV:
442-
consumeToken();
443-
v = createAstBinary(v, filter(true), AstBinary.DIV);
444-
break;
445-
case MOD:
446-
consumeToken();
447-
v = createAstBinary(v, filter(true), AstBinary.MOD);
448-
break;
449-
case EXTENSION:
450-
if (getExtensionHandler(getToken()).getExtensionPoint() == ExtensionPoint.MUL) {
451-
v = getExtensionHandler(consumeToken()).createAstNode(v, filter(true));
452-
break;
453-
}
454-
default:
455-
return v;
456-
}
457-
}
458-
}
459-
460-
protected AstNode filter(boolean required) throws ScanException, ParseException {
461-
AstNode v = unary(required);
462-
if (v == null) {
463-
return null;
464-
}
465-
while (true) {
466-
if ("|".equals(getToken().getImage()) && lookahead(0).getSymbol() == IDENTIFIER) {
467-
do {
468-
consumeToken(); // '|'
469-
String filterName = consumeToken().getImage();
470-
List<AstNode> filterParams = Lists.newArrayList(v, interpreter());
471-
472-
// optional filter args
473-
if (getToken().getSymbol() == Symbol.LPAREN) {
474-
AstParameters astParameters = params();
475-
for (int i = 0; i < astParameters.getCardinality(); i++) {
476-
filterParams.add(astParameters.getChild(i));
477-
}
478-
}
479-
480-
AstProperty filterProperty = createAstDot(
481-
identifier(FILTER_PREFIX + filterName),
482-
"filter",
483-
true
484-
);
485-
v = createAstMethod(filterProperty, createAstParameters(filterParams)); // function("filter:" + filterName, new AstParameters(filterParams));
486-
} while ("|".equals(getToken().getImage()));
487-
} else if (
488-
"is".equals(getToken().getImage()) &&
489-
"not".equals(lookahead(0).getImage()) &&
490-
isPossibleExpTest(lookahead(1).getSymbol())
491-
) {
492-
consumeToken(); // 'is'
493-
consumeToken(); // 'not'
494-
v = buildAstMethodForIdentifier(v, "evaluateNegated");
495-
} else if (
496-
"is".equals(getToken().getImage()) && isPossibleExpTest(lookahead(0).getSymbol())
497-
) {
498-
consumeToken(); // 'is'
499-
v = buildAstMethodForIdentifier(v, "evaluate");
500-
} else {
501-
return v;
502-
}
503-
}
504-
}
505-
506429
@Override
507430
protected AstNode value() throws ScanException, ParseException {
508431
boolean lvalue = true;
@@ -552,6 +475,45 @@ protected AstNode value() throws ScanException, ParseException {
552475

553476
break;
554477
default:
478+
if (
479+
"|".equals(getToken().getImage()) && lookahead(0).getSymbol() == IDENTIFIER
480+
) {
481+
do {
482+
consumeToken(); // '|'
483+
String filterName = consumeToken().getImage();
484+
List<AstNode> filterParams = Lists.newArrayList(v, interpreter());
485+
486+
// optional filter args
487+
if (getToken().getSymbol() == Symbol.LPAREN) {
488+
AstParameters astParameters = params();
489+
for (int i = 0; i < astParameters.getCardinality(); i++) {
490+
filterParams.add(astParameters.getChild(i));
491+
}
492+
}
493+
494+
AstProperty filterProperty = createAstDot(
495+
identifier(FILTER_PREFIX + filterName),
496+
"filter",
497+
true
498+
);
499+
v = createAstMethod(filterProperty, createAstParameters(filterParams)); // function("filter:" + filterName, new AstParameters(filterParams));
500+
} while ("|".equals(getToken().getImage()));
501+
} else if (
502+
"is".equals(getToken().getImage()) &&
503+
"not".equals(lookahead(0).getImage()) &&
504+
isPossibleExpTest(lookahead(1).getSymbol())
505+
) {
506+
consumeToken(); // 'is'
507+
consumeToken(); // 'not'
508+
v = buildAstMethodForIdentifier(v, "evaluateNegated");
509+
} else if (
510+
"is".equals(getToken().getImage()) &&
511+
isPossibleExpTest(lookahead(0).getSymbol())
512+
) {
513+
consumeToken(); // 'is'
514+
v = buildAstMethodForIdentifier(v, "evaluate");
515+
}
516+
555517
return v;
556518
}
557519
}

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,16 @@ public int getType() {
4444
@Override
4545
protected void parse() {
4646
this.expr = WhitespaceUtils.unwrap(image, "{{", "}}");
47-
this.expr = handleTrim(expr);
47+
48+
if (WhitespaceUtils.startsWith(expr, "-")) {
49+
setLeftTrim(true);
50+
this.expr = WhitespaceUtils.unwrap(expr, "-", "");
51+
}
52+
if (WhitespaceUtils.endsWith(expr, "-")) {
53+
setRightTrim(true);
54+
this.expr = WhitespaceUtils.unwrap(expr, "", "-");
55+
}
56+
4857
this.expr = StringUtils.trimToEmpty(this.expr);
4958
}
5059

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package com.hubspot.jinjava.tree.parse;
1717

1818
import com.hubspot.jinjava.interpret.TemplateSyntaxException;
19+
import com.hubspot.jinjava.util.WhitespaceUtils;
1920

2021
public class TagToken extends Token {
2122
private static final long serialVersionUID = -4927751270481832992L;
@@ -53,7 +54,15 @@ protected void parse() {
5354
}
5455

5556
content = image.substring(2, image.length() - 2);
56-
content = handleTrim(content);
57+
58+
if (WhitespaceUtils.startsWith(content, "-")) {
59+
setLeftTrim(true);
60+
content = WhitespaceUtils.unwrap(content, "-", "");
61+
}
62+
if (WhitespaceUtils.endsWith(content, "-")) {
63+
setRightTrim(true);
64+
content = WhitespaceUtils.unwrap(content, "", "-");
65+
}
5766

5867
int nameStart = -1, pos = 0, len = content.length();
5968

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

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -83,25 +83,6 @@ public void setRightTrimAfterEnd(boolean rightTrimAfterEnd) {
8383
this.rightTrimAfterEnd = rightTrimAfterEnd;
8484
}
8585

86-
/**
87-
* Handle any whitespace control characters, capturing whether leading or trailing
88-
* whitespace should be stripped.
89-
* @param unwrapped the content of the block stripped of its delimeters
90-
* @return the content stripped of any whitespace control characters.
91-
*/
92-
protected final String handleTrim(String unwrapped) {
93-
String result = unwrapped;
94-
if (result.startsWith("-")) {
95-
setLeftTrim(true);
96-
result = result.substring(1);
97-
}
98-
if (result.endsWith("-")) {
99-
setRightTrim(true);
100-
result = result.substring(0, result.length() - 1);
101-
}
102-
return result;
103-
}
104-
10586
public int getStartPosition() {
10687
return startPosition;
10788
}

src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -332,58 +332,4 @@ public void itHidesWarningErrors() {
332332
);
333333
assertThat(interpreter.getErrors()).isEmpty();
334334
}
335-
336-
@Test
337-
public void itBindsUnaryMinusTighterThanCmp() {
338-
assertThat(interpreter.render("{{ -5 > 4 }}")).isEqualTo("false");
339-
}
340-
341-
@Test
342-
public void itBindsUnaryMinusTighterThanIs() {
343-
assertThat(interpreter.render("{{ (-5 is integer) == true }}")).isEqualTo("true");
344-
}
345-
346-
@Test
347-
public void itBindsUnaryMinusTighterThanIsNot() {
348-
assertThat(interpreter.render("{{ (-5 is not integer) == false }}"))
349-
.isEqualTo("true");
350-
}
351-
352-
@Test
353-
public void itBindsUnaryMinusTighterThanFilters() {
354-
assertThat(interpreter.render("{{ -5 | abs }}")).isEqualTo("5");
355-
}
356-
357-
@Test
358-
public void itBindsUnaryMinusTighterThanPlus() {
359-
assertThat(interpreter.render("{{ -10 + 4 }}")).isEqualTo("-6");
360-
assertThat(interpreter.render("{{ 4 + -10 }}")).isEqualTo("-6");
361-
}
362-
363-
@Test
364-
public void itBindsFiltersTighterThanMul() {
365-
assertThat(interpreter.render("{{ -5 * -4 | abs }}")).isEqualTo("-20");
366-
}
367-
368-
@Test
369-
public void itBindsFiltersTighterThanPlus() {
370-
assertThat(interpreter.render("{{ -10 | abs + 4 }}")).isEqualTo("14");
371-
assertThat(interpreter.render("{{ 4 + -10 | abs }}")).isEqualTo("14");
372-
}
373-
374-
@Test
375-
public void itInterpretsFilterChainsInOrder() {
376-
assertThat(interpreter.render("{{ 'foo' | upper | replace('O', 'A') }}"))
377-
.isEqualTo("FAA");
378-
}
379-
380-
@Test
381-
public void itInterpretsStandaloneNegatives() {
382-
assertThat(interpreter.render("{{ -10 }}")).isEqualTo("-10");
383-
}
384-
385-
@Test
386-
public void itInterpretsWhitespaceControlOnBothSides() {
387-
assertThat(interpreter.render("{{- 5 -}}")).isEqualTo("5");
388-
}
389335
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{% set foo = [1, 1, 2, 1] %}
22
{%- for item in foo -%}
3-
{%- ifchanged item -%}
3+
{%- ifchanged item- %}
44
{{ deferred[item] }}
55
{%- endifchanged -%}
66
{% endfor%}

0 commit comments

Comments
 (0)