|
20 | 20 | import com.google.common.collect.HashMultimap; |
21 | 21 | import com.google.common.collect.ImmutableSet; |
22 | 22 | import com.google.common.collect.SetMultimap; |
| 23 | +import com.google.common.collect.Sets; |
23 | 24 | import com.hubspot.jinjava.lib.Importable; |
24 | 25 | import com.hubspot.jinjava.lib.expression.DefaultExpressionStrategy; |
25 | 26 | import com.hubspot.jinjava.lib.expression.ExpressionStrategy; |
|
34 | 35 | import com.hubspot.jinjava.lib.tag.Tag; |
35 | 36 | import com.hubspot.jinjava.lib.tag.TagLibrary; |
36 | 37 | import com.hubspot.jinjava.lib.tag.eager.DeferredToken; |
| 38 | +import com.hubspot.jinjava.mode.EagerExecutionMode; |
37 | 39 | import com.hubspot.jinjava.tree.Node; |
38 | 40 | import com.hubspot.jinjava.util.DeferredValueUtils; |
39 | 41 | import com.hubspot.jinjava.util.ScopeMap; |
@@ -117,6 +119,7 @@ public enum Library { |
117 | 119 | private boolean unwrapRawOverride = false; |
118 | 120 | private DynamicVariableResolver dynamicVariableResolver = null; |
119 | 121 | private final Set<String> metaContextVariables; // These variable names aren't tracked in eager execution |
| 122 | + private final Set<String> overriddenNonMetaContextVariables; |
120 | 123 | private Node currentNode; |
121 | 124 |
|
122 | 125 | public Context() { |
@@ -209,6 +212,8 @@ public Context( |
209 | 212 | new FunctionLibrary(parent == null, disabled.get(Library.FUNCTION)); |
210 | 213 | this.metaContextVariables = |
211 | 214 | parent == null ? new HashSet<>() : parent.metaContextVariables; |
| 215 | + this.overriddenNonMetaContextVariables = |
| 216 | + parent == null ? new HashSet<>() : parent.overriddenNonMetaContextVariables; |
212 | 217 | if (parent != null) { |
213 | 218 | this.expressionStrategy = parent.expressionStrategy; |
214 | 219 | this.partialMacroEvaluation = parent.partialMacroEvaluation; |
@@ -348,10 +353,37 @@ public void addResolvedFunction(String function) { |
348 | 353 | } |
349 | 354 | } |
350 | 355 |
|
| 356 | + @Deprecated |
| 357 | + @Beta |
351 | 358 | public Set<String> getMetaContextVariables() { |
352 | 359 | return metaContextVariables; |
353 | 360 | } |
354 | 361 |
|
| 362 | + @Beta |
| 363 | + public Set<String> getComputedMetaContextVariables() { |
| 364 | + return Sets.difference(metaContextVariables, overriddenNonMetaContextVariables); |
| 365 | + } |
| 366 | + |
| 367 | + @Beta |
| 368 | + public void addMetaContextVariables(Collection<String> variables) { |
| 369 | + metaContextVariables.addAll(variables); |
| 370 | + } |
| 371 | + |
| 372 | + @Beta |
| 373 | + public void addNonMetaContextVariables(Collection<String> variables) { |
| 374 | + overriddenNonMetaContextVariables.addAll( |
| 375 | + variables |
| 376 | + .stream() |
| 377 | + .filter(var -> !EagerExecutionMode.STATIC_META_CONTEXT_VARIABLES.contains(var)) |
| 378 | + .collect(Collectors.toList()) |
| 379 | + ); |
| 380 | + } |
| 381 | + |
| 382 | + @Beta |
| 383 | + public void removeNonMetaContextVariables(Collection<String> variables) { |
| 384 | + overriddenNonMetaContextVariables.removeAll(variables); |
| 385 | + } |
| 386 | + |
355 | 387 | public void handleDeferredNode(Node node) { |
356 | 388 | if ( |
357 | 389 | JinjavaInterpreter |
|
0 commit comments