Skip to content

Commit b7b5972

Browse files
committed
Move onto DeferredTokenBuilder
1 parent 47e3db4 commit b7b5972

14 files changed

Lines changed: 244 additions & 249 deletions

src/main/java/com/hubspot/jinjava/lib/expression/EagerExpressionStrategy.java

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

33
import com.google.common.annotations.Beta;
44
import com.hubspot.jinjava.JinjavaConfig;
5-
import com.hubspot.jinjava.interpret.DeferredMacroValueImpl;
65
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
76
import com.hubspot.jinjava.interpret.TemplateError.ErrorReason;
87
import com.hubspot.jinjava.lib.filter.EscapeFilter;
@@ -16,7 +15,6 @@
1615
import com.hubspot.jinjava.util.Logging;
1716
import com.hubspot.jinjava.util.PrefixToPreserveState;
1817
import java.util.Objects;
19-
import java.util.stream.Collectors;
2018
import org.apache.commons.lang3.StringUtils;
2119

2220
@Beta
@@ -67,35 +65,30 @@ private String eagerResolveExpression(
6765
prefixToPreserveState.toString() + postProcessResult(master, result, interpreter)
6866
);
6967
}
68+
69+
String deferredExpressionImage = wrapInExpression(
70+
eagerExecutionResult.getResult().toString(),
71+
interpreter
72+
);
7073
EagerReconstructionUtils.hydrateReconstructionFromContextBeforeDeferring(
7174
prefixToPreserveState,
7275
eagerExecutionResult.getResult().getDeferredWords(),
7376
interpreter
7477
);
75-
String deferredExpressionImage = wrapInExpression(
76-
eagerExecutionResult.getResult().toString(),
77-
interpreter
78-
);
7978
prefixToPreserveState.withAllInFront(
8079
EagerReconstructionUtils.handleDeferredTokenAndReconstructReferences(
8180
interpreter,
82-
new DeferredToken(
83-
new ExpressionToken(
84-
deferredExpressionImage,
85-
master.getLineNumber(),
86-
master.getStartPosition(),
87-
master.getSymbols()
88-
),
89-
eagerExecutionResult
90-
.getResult()
91-
.getDeferredWords()
92-
.stream()
93-
.filter(
94-
word ->
95-
!(interpreter.getContext().get(word) instanceof DeferredMacroValueImpl)
81+
DeferredToken
82+
.builderFromToken(
83+
new ExpressionToken(
84+
deferredExpressionImage,
85+
master.getLineNumber(),
86+
master.getStartPosition(),
87+
master.getSymbols()
9688
)
97-
.collect(Collectors.toSet())
98-
)
89+
)
90+
.addUsedDeferredWords(eagerExecutionResult.getResult().getDeferredWords())
91+
.build()
9992
)
10093
);
10194
// There is only a preserving prefix because it couldn't be entirely evaluated.

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

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
1212
import com.hubspot.jinjava.tree.parse.Token;
1313
import com.hubspot.jinjava.util.EagerExpressionResolver;
14-
import com.hubspot.jinjava.util.PrefixToPreserveState;
1514
import java.util.Collection;
1615
import java.util.Collections;
1716
import java.util.HashSet;
@@ -25,55 +24,69 @@ public class DeferredToken {
2524

2625
public static class DeferredTokenBuilder {
2726
private final Token token;
28-
private Stream<String> usedDeferredWords = Stream.empty();
29-
private Stream<String> setDeferredWords = Stream.empty();
27+
private Stream<String> usedDeferredWords;
28+
private Stream<String> setDeferredWords;
3029

3130
private DeferredTokenBuilder(Token token) {
3231
this.token = token;
3332
}
3433

35-
public static DeferredTokenBuilder fromToken(Token token) {
36-
return new DeferredTokenBuilder(token);
37-
}
38-
3934
public DeferredToken build() {
4035
JinjavaInterpreter interpreter = JinjavaInterpreter.getCurrent();
4136
return new DeferredToken(
4237
token,
43-
usedDeferredWords
44-
.map(prop -> prop.split("\\.", 2)[0])
45-
.distinct()
46-
.filter(
47-
word ->
48-
!(interpreter.getContext().get(word) instanceof DeferredMacroValueImpl)
49-
)
50-
.collect(Collectors.toSet()),
51-
setDeferredWords.map(prop -> prop.split("\\.", 2)[0]).collect(Collectors.toSet()),
38+
usedDeferredWords != null
39+
? usedDeferredWords
40+
.map(prop -> prop.split("\\.", 2)[0])
41+
.distinct()
42+
.filter(
43+
word ->
44+
interpreter == null ||
45+
!(interpreter.getContext().get(word) instanceof DeferredMacroValueImpl)
46+
)
47+
.collect(Collectors.toSet())
48+
: Collections.emptySet(),
49+
setDeferredWords != null
50+
? setDeferredWords
51+
.map(prop -> prop.split("\\.", 2)[0])
52+
.collect(Collectors.toSet())
53+
: Collections.emptySet(),
5254
acquireImportResourcePath(),
5355
acquireMacroStack()
5456
);
5557
}
5658

57-
public DeferredTokenBuilder addUsedDeferredWordsFromPrefixAndResult(
58-
PrefixToPreserveState prefixToPreserveState,
59-
EagerExecutionResult eagerExecutionResult
59+
public DeferredTokenBuilder addUsedDeferredWords(
60+
Collection<String> usedDeferredWordsToAdd
6061
) {
61-
return addUsedDeferredWords(prefixToPreserveState.getNestedDependentWords())
62-
.addUsedDeferredWords(eagerExecutionResult.getResult().getDeferredWords());
62+
return addUsedDeferredWords(usedDeferredWordsToAdd.stream());
6363
}
6464

6565
public DeferredTokenBuilder addUsedDeferredWords(
66-
Collection<String> usedDeferredWordsToAdd
66+
Stream<String> usedDeferredWordsToAdd
6767
) {
68-
usedDeferredWords =
69-
Stream.concat(usedDeferredWords, usedDeferredWordsToAdd.stream());
68+
if (usedDeferredWords == null) {
69+
usedDeferredWords = usedDeferredWordsToAdd;
70+
} else {
71+
usedDeferredWords = Stream.concat(usedDeferredWords, usedDeferredWordsToAdd);
72+
}
7073
return this;
7174
}
7275

7376
public DeferredTokenBuilder addSetDeferredWords(
7477
Collection<String> setDeferredWordsToAdd
7578
) {
76-
setDeferredWords = Stream.concat(setDeferredWords, setDeferredWordsToAdd.stream());
79+
return addSetDeferredWords(setDeferredWordsToAdd.stream());
80+
}
81+
82+
public DeferredTokenBuilder addSetDeferredWords(
83+
Stream<String> setDeferredWordsToAdd
84+
) {
85+
if (setDeferredWords == null) {
86+
setDeferredWords = setDeferredWordsToAdd;
87+
} else {
88+
setDeferredWords = Stream.concat(setDeferredWords, setDeferredWordsToAdd);
89+
}
7790
return this;
7891
}
7992
}
@@ -92,10 +105,22 @@ public DeferredTokenBuilder addSetDeferredWords(
92105
// Used to determine if in separate file
93106
private final String importResourcePath;
94107

108+
public static DeferredTokenBuilder builderFromToken(Token token) {
109+
return new DeferredTokenBuilder(token);
110+
}
111+
112+
/**
113+
* @deprecated Use {@link #builderFromToken(Token)}
114+
*/
115+
@Deprecated
95116
public DeferredToken(Token token, Set<String> usedDeferredWords) {
96117
this(token, usedDeferredWords, Collections.emptySet());
97118
}
98119

120+
/**
121+
* @deprecated Use {@link #builderFromToken(Token)}
122+
*/
123+
@Deprecated
99124
public DeferredToken(
100125
Token token,
101126
Set<String> usedDeferredWords,

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.hubspot.jinjava.lib.tag.eager;
22

33
import com.google.common.annotations.Beta;
4-
import com.google.common.collect.Sets;
54
import com.hubspot.jinjava.interpret.DeferredValueException;
65
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
76
import com.hubspot.jinjava.lib.tag.SetTag;
@@ -12,8 +11,8 @@
1211
import com.hubspot.jinjava.util.EagerReconstructionUtils;
1312
import com.hubspot.jinjava.util.LengthLimitingStringJoiner;
1413
import com.hubspot.jinjava.util.PrefixToPreserveState;
15-
import java.util.Collections;
1614
import java.util.Optional;
15+
import java.util.stream.Stream;
1716
import org.apache.commons.lang3.tuple.Triple;
1817

1918
@Beta
@@ -125,16 +124,17 @@ protected Triple<String, String, String> getPrefixTokenAndSuffix(
125124
.withAllInFront(
126125
EagerReconstructionUtils.handleDeferredTokenAndReconstructReferences(
127126
interpreter,
128-
new DeferredToken(
129-
new TagToken(
130-
joiner.toString(),
131-
tagNode.getLineNumber(),
132-
tagNode.getStartPosition(),
133-
tagNode.getSymbols()
134-
),
135-
Collections.emptySet(),
136-
Sets.newHashSet(variables)
137-
)
127+
DeferredToken
128+
.builderFromToken(
129+
new TagToken(
130+
joiner.toString(),
131+
tagNode.getLineNumber(),
132+
tagNode.getStartPosition(),
133+
tagNode.getSymbols()
134+
)
135+
)
136+
.addSetDeferredWords(Stream.of(variables))
137+
.build()
138138
)
139139
);
140140
String suffixToPreserveState = getSuffixToPreserveState(variables[0], interpreter);

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

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.hubspot.jinjava.lib.tag.eager;
22

33
import com.google.common.annotations.Beta;
4-
import com.hubspot.jinjava.interpret.DeferredMacroValueImpl;
54
import com.hubspot.jinjava.interpret.DeferredValue;
65
import com.hubspot.jinjava.interpret.InterpretException;
76
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
@@ -20,7 +19,6 @@
2019
import com.hubspot.jinjava.util.LengthLimitingStringJoiner;
2120
import com.hubspot.jinjava.util.PrefixToPreserveState;
2221
import java.util.LinkedHashMap;
23-
import java.util.stream.Collectors;
2422
import org.apache.commons.lang3.StringUtils;
2523

2624
@Beta
@@ -114,23 +112,17 @@ public String eagerInterpret(
114112
prefixToPreserveState.withAllInFront(
115113
EagerReconstructionUtils.handleDeferredTokenAndReconstructReferences(
116114
interpreter,
117-
new DeferredToken(
118-
new TagToken(
119-
joiner.toString(),
120-
tagNode.getLineNumber(),
121-
tagNode.getStartPosition(),
122-
tagNode.getSymbols()
123-
),
124-
eagerExecutionResult
125-
.getResult()
126-
.getDeferredWords()
127-
.stream()
128-
.filter(
129-
word ->
130-
!(interpreter.getContext().get(word) instanceof DeferredMacroValueImpl)
115+
DeferredToken
116+
.builderFromToken(
117+
new TagToken(
118+
joiner.toString(),
119+
tagNode.getLineNumber(),
120+
tagNode.getStartPosition(),
121+
tagNode.getSymbols()
131122
)
132-
.collect(Collectors.toSet())
133-
)
123+
)
124+
.addUsedDeferredWords(eagerExecutionResult.getResult().getDeferredWords())
125+
.build()
134126
)
135127
);
136128
StringBuilder result = new StringBuilder(prefixToPreserveState + joiner.toString());

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

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@
99
import com.hubspot.jinjava.tree.parse.TagToken;
1010
import com.hubspot.jinjava.util.EagerContextWatcher;
1111
import com.hubspot.jinjava.util.EagerExpressionResolver;
12+
import com.hubspot.jinjava.util.EagerExpressionResolver.EagerExpressionResult;
1213
import com.hubspot.jinjava.util.EagerReconstructionUtils;
1314
import com.hubspot.jinjava.util.HelperStringTokenizer;
1415
import com.hubspot.jinjava.util.PrefixToPreserveState;
1516
import com.hubspot.jinjava.util.WhitespaceUtils;
1617
import java.util.ArrayList;
1718
import java.util.List;
18-
import java.util.Set;
1919
import java.util.stream.Collectors;
2020

2121
@Beta
@@ -120,8 +120,7 @@ public String getEagerTagImage(TagToken tagToken, JinjavaInterpreter interpreter
120120
interpreter,
121121
resolvedValues,
122122
resolvedExpression,
123-
eagerExecutionResult.getResult().isFullyResolved(),
124-
eagerExecutionResult.getResult().getDeferredWords()
123+
eagerExecutionResult.getResult()
125124
)
126125
);
127126
} else if (helper.size() == 3) {
@@ -183,8 +182,7 @@ private String interpretPrintingCycle(
183182
JinjavaInterpreter interpreter,
184183
List<String> values,
185184
String resolvedExpression,
186-
boolean fullyResolved,
187-
Set<String> deferredWords
185+
EagerExpressionResult eagerExpressionResult
188186
) {
189187
if (interpreter.getContext().isDeferredExecutionMode()) {
190188
String reconstructedTag = reconstructCycleTag(resolvedExpression, tagToken);
@@ -193,15 +191,17 @@ private String interpretPrintingCycle(
193191
new PrefixToPreserveState(
194192
EagerReconstructionUtils.handleDeferredTokenAndReconstructReferences(
195193
interpreter,
196-
new DeferredToken(
197-
new TagToken(
198-
reconstructedTag,
199-
tagToken.getLineNumber(),
200-
tagToken.getStartPosition(),
201-
tagToken.getSymbols()
202-
),
203-
deferredWords
204-
)
194+
DeferredToken
195+
.builderFromToken(
196+
new TagToken(
197+
reconstructedTag,
198+
tagToken.getLineNumber(),
199+
tagToken.getStartPosition(),
200+
tagToken.getSymbols()
201+
)
202+
)
203+
.addUsedDeferredWords(eagerExpressionResult.getDeferredWords())
204+
.build()
205205
)
206206
)
207207
);
@@ -216,14 +216,17 @@ private String interpretPrintingCycle(
216216
}
217217
if (values.size() == 1) {
218218
String var = values.get(0);
219-
if (!fullyResolved) {
219+
if (!eagerExpressionResult.isFullyResolved()) {
220220
return getIsIterable(var, forindex, tagToken);
221221
} else {
222222
return var;
223223
}
224224
}
225225
String item = values.get(forindex % values.size());
226-
if (!fullyResolved && EagerExpressionResolver.shouldBeEvaluated(item, interpreter)) {
226+
if (
227+
!eagerExpressionResult.isFullyResolved() &&
228+
EagerExpressionResolver.shouldBeEvaluated(item, interpreter)
229+
) {
227230
return String.format("{{ %s }}", values.get(forindex % values.size()));
228231
}
229232
return item;

0 commit comments

Comments
 (0)