Skip to content

Commit f56f94e

Browse files
committed
Add tests for multiple nested expressions and fix escaping
1 parent fdbf02b commit f56f94e

2 files changed

Lines changed: 39 additions & 7 deletions

File tree

src/main/java/com/hubspot/jinjava/util/EagerExpressionResolver.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ private static Set<String> findDeferredWords(
133133
interpreter.getContext().setThrowInterpreterErrors(true);
134134
Set<String> words = new HashSet<>();
135135
char[] value = partiallyResolved.toCharArray();
136-
int prevQuotePos = 0;
136+
int prevQuotePos = -1;
137137
int curPos = 0;
138138
char c;
139139
char prevChar = 0;
@@ -143,13 +143,12 @@ private static Set<String> findDeferredWords(
143143
c = value[curPos];
144144
if (inQuote) {
145145
if (c == quoteChar && prevChar != '\\') {
146-
String quoted = partiallyResolved.substring(prevQuotePos, curPos);
147146
if (nestedInterpretationEnabled) {
148147
getDeferredWordsInsideNestedExpression(
149148
interpreter,
150149
scannerSymbols,
151150
words,
152-
quoted
151+
partiallyResolved.substring(prevQuotePos, curPos + 1)
153152
);
154153
}
155154
inQuote = false;
@@ -161,17 +160,23 @@ private static Set<String> findDeferredWords(
161160
words.addAll(
162161
findDeferredWordsInSubstring(
163162
partiallyResolved,
164-
prevQuotePos,
163+
prevQuotePos + 1,
165164
curPos,
166165
interpreter
167166
)
168167
);
168+
prevQuotePos = curPos;
169169
}
170170
prevChar = c;
171171
curPos++;
172172
}
173173
words.addAll(
174-
findDeferredWordsInSubstring(partiallyResolved, prevQuotePos, curPos, interpreter)
174+
findDeferredWordsInSubstring(
175+
partiallyResolved,
176+
prevQuotePos + 1,
177+
curPos,
178+
interpreter
179+
)
175180
);
176181
return words;
177182
} finally {
@@ -198,7 +203,10 @@ private static void getDeferredWordsInsideNestedExpression(
198203
quoted.contains(scannerSymbols.getExpressionStart()) &&
199204
quoted.contains(scannerSymbols.getExpressionEnd())
200205
) {
201-
List<ExpressionNode> expressionNodes = getExpressionNodes(quoted, interpreter);
206+
List<ExpressionNode> expressionNodes = getExpressionNodes(
207+
WhitespaceUtils.unquoteAndUnescape(quoted),
208+
interpreter
209+
);
202210
words.addAll(
203211
expressionNodes
204212
.stream()

src/test/java/com/hubspot/jinjava/util/EagerExpressionResolverTest.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,6 @@ public void itHandlesDeferredChoice() {
630630

631631
@Test
632632
public void itGetsDeferredWordsFromNestedExpression() {
633-
context.put("foo", 4);
634633
EagerExpressionResult eagerExpressionResult = eagerResolveExpression(
635634
"deferred.append('{{ foo }}')"
636635
);
@@ -641,6 +640,31 @@ public void itGetsDeferredWordsFromNestedExpression() {
641640
.containsExactlyInAnyOrder("deferred.append", "foo");
642641
}
643642

643+
@Test
644+
public void itGetsDeferredWordsFromAdjacentNestedExpression() {
645+
EagerExpressionResult eagerExpressionResult = eagerResolveExpression(
646+
"deferred.append('{{ foo }} and {{ bar }}')"
647+
);
648+
interpreter.getContext().setThrowInterpreterErrors(true);
649+
String partiallyResolved = eagerExpressionResult.toString();
650+
assertThat(partiallyResolved).isEqualTo("deferred.append('{{ foo }} and {{ bar }}')");
651+
assertThat(eagerExpressionResult.getDeferredWords())
652+
.containsExactlyInAnyOrder("deferred.append", "foo", "bar");
653+
}
654+
655+
@Test
656+
public void itGetsDeferredWordsFromMultipleNestedExpression() {
657+
EagerExpressionResult eagerExpressionResult = eagerResolveExpression(
658+
"deferred.append('{{ foo ~ \\'and {{ bar }}\\' }}')"
659+
);
660+
interpreter.getContext().setThrowInterpreterErrors(true);
661+
String partiallyResolved = eagerExpressionResult.toString();
662+
assertThat(partiallyResolved)
663+
.isEqualTo("deferred.append('{{ foo ~ \\'and {{ bar }}\\' }}')");
664+
assertThat(eagerExpressionResult.getDeferredWords())
665+
.containsExactlyInAnyOrder("deferred.append", "foo", "bar");
666+
}
667+
644668
@Test
645669
public void itHandlesDeferredNamedParameter() {
646670
context.put("foo", "foo");

0 commit comments

Comments
 (0)