Skip to content

Commit 4ba66d8

Browse files
committed
Add separate methods for whether deferred token is registered when builiding set tag
1 parent 72f2105 commit 4ba66d8

8 files changed

Lines changed: 42 additions & 32 deletions

File tree

src/main/java/com/hubspot/jinjava/lib/fn/eager/EagerMacroFunction.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,7 @@ public String reconstructImage(String fullName) {
233233
EagerReconstructionUtils.buildBlockOrInlineSetTag(
234234
Context.DEFERRED_IMPORT_RESOURCE_PATH_KEY,
235235
importFile.get(),
236-
interpreter,
237-
false
236+
interpreter
238237
);
239238
interpreter
240239
.getContext()
@@ -243,8 +242,7 @@ public String reconstructImage(String fullName) {
243242
EagerReconstructionUtils.buildBlockOrInlineSetTag(
244243
Context.DEFERRED_IMPORT_RESOURCE_PATH_KEY,
245244
currentDeferredImportResource,
246-
interpreter,
247-
false
245+
interpreter
248246
);
249247
}
250248

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public PrefixToPreserveState getPrefixToPreserveState() {
7171
entry ->
7272
prefixToPreserveState.put(
7373
entry.getKey(),
74-
buildBlockOrInlineSetTag(entry.getKey(), entry.getValue(), interpreter, false)
74+
buildBlockOrInlineSetTag(entry.getKey(), entry.getValue(), interpreter)
7575
)
7676
);
7777
filteredEntries

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ public String getEagerTagImage(TagToken tagToken, JinjavaInterpreter interpreter
6060
EagerReconstructionUtils.buildBlockOrInlineSetTag(
6161
RelativePathResolver.CURRENT_PATH_CONTEXT_KEY,
6262
interpreter.getContext().get(RelativePathResolver.CURRENT_PATH_CONTEXT_KEY),
63-
interpreter,
64-
false
63+
interpreter
6564
) +
6665
tagToken.getImage()
6766
);

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -190,11 +190,10 @@ private String getFinalOutputWithAlias(
190190
) {
191191
return (
192192
newPathSetter +
193-
EagerReconstructionUtils.buildBlockOrInlineSetTag(
193+
EagerReconstructionUtils.buildBlockOrInlineSetTagAndRegisterDeferredToken(
194194
currentImportAlias,
195195
Collections.emptyMap(),
196-
interpreter,
197-
true
196+
interpreter
198197
) +
199198
wrapInChildScope(
200199
interpreter,
@@ -259,11 +258,10 @@ private String getSetTagForDeferredChildBindings(
259258
.filter(entry -> !entry.getKey().equals(currentImportAlias))
260259
.map(
261260
entry ->
262-
EagerReconstructionUtils.buildBlockOrInlineSetTag(
261+
EagerReconstructionUtils.buildBlockOrInlineSetTag( // don't register deferred token so that we don't defer them on higher context scopes; they only exist in the child scope
263262
entry.getKey(),
264263
((DeferredValue) entry.getValue()).getOriginalValue(),
265-
interpreter,
266-
false // false so that we don't defer them on higher context scopes; they only exist in the child scope
264+
interpreter
267265
)
268266
)
269267
.collect(Collectors.joining());
@@ -282,8 +280,7 @@ public static String getSetTagForCurrentPath(JinjavaInterpreter interpreter) {
282280
.getContext()
283281
.getOrDefault(RelativePathResolver.CURRENT_PATH_CONTEXT_KEY, "")
284282
),
285-
interpreter,
286-
false
283+
interpreter
287284
);
288285
}
289286

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ public String innerInterpret(TagNode tagNode, JinjavaInterpreter interpreter) {
3535
final String newPathSetter = EagerReconstructionUtils.buildBlockOrInlineSetTag(
3636
RelativePathResolver.CURRENT_PATH_CONTEXT_KEY,
3737
templateFile,
38-
interpreter,
39-
false
38+
interpreter
4039
);
4140
return newPathSetter + output + initialPathSetter;
4241
}

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

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -258,13 +258,28 @@ private static Map<String, String> reconstructSetVariablesBeforeDeferring(
258258
buildBlockOrInlineSetTag(
259259
word,
260260
interpreter.getContext().get(word),
261-
interpreter,
262-
false
261+
interpreter
263262
)
264263
)
265264
);
266265
}
267266

267+
public static String buildBlockOrInlineSetTag(
268+
String name,
269+
Object value,
270+
JinjavaInterpreter interpreter
271+
) {
272+
return buildBlockOrInlineSetTag(name, value, interpreter, false);
273+
}
274+
275+
public static String buildBlockOrInlineSetTagAndRegisterDeferredToken(
276+
String name,
277+
Object value,
278+
JinjavaInterpreter interpreter
279+
) {
280+
return buildBlockOrInlineSetTag(name, value, interpreter, true);
281+
}
282+
268283
public static String buildBlockOrInlineSetTag(
269284
String name,
270285
Object value,
@@ -285,8 +300,13 @@ public static String buildBlockOrInlineSetTag(
285300
registerDeferredToken
286301
);
287302
}
303+
String pyishStringRepresentation = PyishObjectMapper.getAsPyishString(value);
304+
Set<String> dependentWords = EagerExpressionResolver.findDeferredWords(
305+
pyishStringRepresentation,
306+
interpreter
307+
);
288308
return buildSetTag(
289-
ImmutableMap.of(name, PyishObjectMapper.getAsPyishString(value)),
309+
ImmutableMap.of(name, pyishStringRepresentation),
290310
interpreter,
291311
registerDeferredToken
292312
);

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

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

33
import static org.assertj.core.api.Assertions.assertThat;
44
import static org.assertj.core.api.Assertions.assertThatThrownBy;
5-
import static org.mockito.Mockito.mock;
6-
import static org.mockito.Mockito.when;
5+
import static org.mockito.Mockito.*;
76

87
import com.google.common.collect.ImmutableList;
98
import com.google.common.collect.ImmutableMap;
@@ -197,11 +196,10 @@ public void itReconstructsVariablesAndMacroFunctions() {
197196

198197
@Test
199198
public void itBuildsSetTagForDeferredAndRegisters() {
200-
String result = EagerReconstructionUtils.buildBlockOrInlineSetTag(
199+
String result = EagerReconstructionUtils.buildBlockOrInlineSetTagAndRegisterDeferredToken(
201200
"foo",
202201
"bar",
203-
interpreter,
204-
true
202+
interpreter
205203
);
206204
assertThat(result).isEqualTo("{% set foo = 'bar' %}");
207205
assertThat(context.getDeferredTokens()).hasSize(1);
@@ -219,8 +217,7 @@ public void itBuildsSetTagForDeferredAndDoesntRegister() {
219217
String result = EagerReconstructionUtils.buildBlockOrInlineSetTag(
220218
"foo",
221219
"bar",
222-
interpreter,
223-
false
220+
interpreter
224221
);
225222
assertThat(result).isEqualTo("{% set foo = 'bar' %}");
226223
assertThat(context.getDeferredTokens()).isEmpty();
@@ -254,11 +251,10 @@ public void itLimitsSetTagConstruction() {
254251
}
255252
assertThatThrownBy(
256253
() ->
257-
EagerReconstructionUtils.buildBlockOrInlineSetTag(
254+
EagerReconstructionUtils.buildBlockOrInlineSetTagAndRegisterDeferredToken(
258255
"foo",
259256
tooLong.toString(),
260-
interpreter,
261-
true
257+
interpreter
262258
)
263259
)
264260
.isInstanceOf(OutputTooBigException.class);

src/test/resources/eager/reconstructs-nested-value-in-string-representation.jinja

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
{% set foo = 'I am foo' %}
2-
{% set bar = 'I am bar' %}
1+
{% set i_am = 'I am' %}
2+
{% set foo = '{{ i_am }} foo' %}
3+
{% set bar = '{{ i_am }} bar' %}
34
{% set map_with_vals = {'foo': 'Foo is {{ foo }}.'} %}
45
{% if deferred %}
56
{% do map_with_vals.put('bar', 'Bar is {{ bar }}.') %}

0 commit comments

Comments
 (0)