code: PyExpr exec(CallNode callNode, LocalVariableStack localVarStack, ErrorReporter errorReporter) {
      this.localVarStack = localVarStack;
      this.errorReporter = errorReporter;
      PyExpr callExpr = visit(callNode);
      this.localVarStack = null;
      this.errorReporter = null;
      return callExpr;
    }
docs: Generates the Python expression for a given call.
  
  <p>Important: If there are CallParamContentNode children whose contents are not computable as
  Python expressions, then this function assumes that, elsewhere, code has been generated to
  define their respective {@code param<n>} temporary variables.
  
  <p>Here are five example calls:
  
  <pre>
  {call some.func data="all" /}
  {call some.func data="$boo" /}
  {call some.func}
  {param goo = $moo /}
  {/call}
  {call some.func data="$boo"}
  {param goo}Blah{/param}
  {/call}
  {call some.func}
  {param goo}
  {for $i in range(3)}{$i}{/for}
  {/param}
  {/call}
  </pre>
  
  Their respective generated calls might be the following:
  
  <pre>
  some.func(data)
  some.func(data.get('boo'))
  some.func({'goo': opt_data.get('moo')})
  some.func(runtime.merge_into_dict({'goo': 'Blah'}, data.get('boo')))
  some.func({'goo': param65})
  </pre>
  
  Note that in the last case, the param content is not computable as Python expressions, so we
  assume that code has been generated to define the temporary variable {@code param<n>}.
  
  @param callNode The call to generate code for.
  @param localVarStack The current stack of replacement Python expressions for the local
  variables (and foreach-loop special functions) current in scope.
  @return The Python expression for the call.