Class Macro.MacroEvaluationContext

java.lang.Object
com.google.auto.value.processor.escapevelocity.Macro.MacroEvaluationContext
All Implemented Interfaces:
EvaluationContext
Enclosing class:
Macro

static class Macro.MacroEvaluationContext extends Object implements EvaluationContext
The context for evaluation within macros. This wraps an existing EvaluationContext but intercepts reads of the macro's parameters so that they result in a call-by-name evaluation of whatever was passed as the parameter. For example, if you write...

 #macro (mymacro $x)
 $x $x
 #end
 #mymacro($foo.bar(23))
 
...then the #mymacro call will result in $foo.bar(23) being evaluated twice, once for each time $x appears. The way this works is that $x is a thunk. Historically a thunk is a piece of code to evaluate an expression in the context where it occurs, for call-by-name procedures as in Algol 60. Here, it is not exactly a piece of code, but it has the same responsibility.
  • Field Details

    • parameterThunks

      private final Map<String,Node> parameterThunks
    • originalEvaluationContext

      private final EvaluationContext originalEvaluationContext
  • Constructor Details

  • Method Details

    • getVar

      public Object getVar(String var)
      Specified by:
      getVar in interface EvaluationContext
    • varIsDefined

      public boolean varIsDefined(String var)
      Specified by:
      varIsDefined in interface EvaluationContext
    • setVar

      public Runnable setVar(String var, Object value)
      Description copied from interface: EvaluationContext
      Sets the given variable to the given value.
      Specified by:
      setVar in interface EvaluationContext
      Returns:
      a Runnable that will restore the variable to the value it had before. If the variable was undefined before this method was executed, the Runnable will make it undefined again. This allows us to restore the state of $x after #foreach ($x in ...).