org.codehaus.groovy.classgen

## Class AsmClassGenerator

- java.lang.Object
- - org.codehaus.groovy.ast.CodeVisitorSupport
  - - org.codehaus.groovy.ast.ClassCodeVisitorSupport
    - - org.codehaus.groovy.classgen.ClassGenerator
      - - org.codehaus.groovy.classgen.AsmClassGenerator

- All Implemented Interfaces:
    GroovyClassVisitor, GroovyCodeVisitor, org.objectweb.asm.Opcodes

      public class AsmClassGenerator
      extends ClassGenerator

  Generates Java class versions of Groovy classes using ASM.
  Version:
    $Revision: 21652 $
  Author:
    James Strachan, Bing Ran, Jochen Theodorou, Alex Popescu, Alex Tkachman

- - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `static boolean` | `ASM_DEBUG`
    `static boolean` | `CREATE_DEBUG_INFO`
    `static boolean` | `CREATE_LINE_NUMBER_INFO`

    - ### Fields inherited from class org.codehaus.groovy.classgen.ClassGenerator

      `asmJDKVersion, classLoader, innerClasses`

    - ### Fields inherited from interface org.objectweb.asm.Opcodes

      `AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEDYNAMIC_OWNER, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `AsmClassGenerator(SourceUnit source, GeneratorContext context, org.objectweb.asm.ClassVisitor classVisitor, ClassLoader classLoader, String sourceFile)`

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected boolean` | `addInnerClass(ClassNode innerClass)`
    `protected static int` | `argumentSize(Expression arguments)`
    `protected boolean` | `argumentsUseStack(Expression arguments)`
    `protected static boolean` | `containsSpreadExpression(Expression arguments)`
    `protected ClassNode` | `createClosureClass(ClosureExpression expression)`
    `protected void` | `createInterfaceSyntheticStaticFields()`
    `protected Expression` | `createReturnLHSExpression(Expression expression)` For assignment expressions, return a safe expression for the LHS we can use to return the value
    `protected Expression` | `createReusableExpression(Expression expression)`
    `protected void` | `createSyntheticStaticFields()`
    `protected void` | `doConvertAndCast(ClassNode type)`
    `protected void` | `doConvertAndCast(ClassNode type, boolean coerce)`
    `protected void` | `doConvertAndCast(ClassNode type, Expression expression, boolean ignoreAutoboxing, boolean forceCast, boolean coerce)` Casts to the given type unless it can be determined that the cast is unnecessary
    `protected boolean` | `emptyArguments(Expression arguments)`
    `protected void` | `evaluateBinaryExpression(String method, BinaryExpression expression)`
    `protected void` | `evaluateBinaryExpressionWithAssignment(String method, BinaryExpression expression)`
    `protected void` | `evaluateCompareTo(BinaryExpression expression)`
    `protected void` | `evaluateEqual(BinaryExpression expression, boolean defineVariable)`
    `protected void` | `evaluateExpression(Expression expression)`
    `protected void` | `evaluateInstanceof(BinaryExpression expression)`
    `protected void` | `evaluateLogicalAndExpression(BinaryExpression expression)`
    `protected void` | `evaluateLogicalOrExpression(BinaryExpression expression)`
    `protected void` | `evaluatePostfixMethod(String method, Expression expression)`
    `protected void` | `evaluatePrefixMethod(String method, Expression expression)`
    `protected int` | `getBytecodeVersion()`
    `protected Parameter[]` | `getClosureSharedVariables(ClosureExpression ce)`
    `protected CompileUnit` | `getCompileUnit()`
    `protected ClassNode` | `getExpressionType(Expression expression)`
    `protected ClassNode` | `getLHSType(Expression leftExpression)` Deduces the type name required for some casting
    `static String` | `getMopMethodName(MethodNode method, boolean useThis)` creates a MOP method name from a method
    `protected ClassNode` | `getOutermostClass()`
    `protected SourceUnit` | `getSourceUnit()`
    `protected boolean` | `isComparisonExpression(Expression expression)`
    `protected boolean` | `isFieldOrVariable(String name)`
    `protected boolean` | `isGroovyObject(Expression objectExpression)`
    `protected boolean` | `isInClosure()`
    `protected boolean` | `isInClosureConstructor()`
    `protected boolean` | `isInScriptBody()`
    `static boolean` | `isMopMethod(String methodName)` method to determine if a method is a MOP method.
    `protected boolean` | `isNotExplicitThisInClosure(boolean implicitThis)`
    `protected boolean` | `isPopRequired(Expression expression)`
    `protected boolean` | `isStaticMethod()`
    `protected boolean` | `isValidTypeForCast(ClassNode type)`
    `void` | `loadInstanceField(FieldExpression fldExp)` RHS instance field. should move most of the code in the BytecodeHelper
    `void` | `loadStaticField(FieldExpression fldExp)`
    `protected void` | `loadThisOrOwner()` Loads either this object or if we're inside a closure then load the top level owner
    `protected void` | `onLineNumber(ASTNode statement, String message)`
    `protected void` | `processClassVariable(String name)`
    `protected void` | `processFieldAccess(String name, FieldNode field, int steps)`
    `protected void` | `processStackVariable(Variable variable, boolean useReferenceDirectly)`
    `void` | `storeStaticField(FieldExpression expression)`
    `void` | `storeThisInstanceField(FieldExpression expression)`
    `static boolean` | `usesSuper(MethodCallExpression call)`
    `static boolean` | `usesSuper(PropertyExpression pe)`
    `protected void` | `visitAndAutoboxBoolean(Expression expression)`
    `void` | `visitAnnotations(AnnotatedNode node)` Note: ignore it.
    `void` | `visitArgumentlistExpression(ArgumentListExpression ale)`
    `void` | `visitArrayExpression(ArrayExpression expression)`
    `void` | `visitAssertStatement(AssertStatement statement)`
    `void` | `visitAttributeExpression(AttributeExpression expression)`
    `void` | `visitBinaryExpression(BinaryExpression expression)`
    `void` | `visitBitwiseNegationExpression(BitwiseNegationExpression expression)`
    `void` | `visitBlockStatement(BlockStatement block)`
    `void` | `visitBooleanExpression(BooleanExpression expression)` return a primitive boolean value of the BooleanExpresion.
    `void` | `visitBreakStatement(BreakStatement statement)`
    `void` | `visitBytecodeExpression(BytecodeExpression cle)`
    `void` | `visitBytecodeSequence(BytecodeSequence bytecodeSequence)`
    `void` | `visitCaseStatement(CaseStatement statement)`
    `void` | `visitCaseStatement(CaseStatement statement, int switchVariableIndex, org.objectweb.asm.Label thisLabel, org.objectweb.asm.Label nextLabel)`
    `void` | `visitCastExpression(CastExpression castExpression)`
    `void` | `visitClass(ClassNode classNode)`
    `void` | `visitClassExpression(ClassExpression expression)` load class object on stack
    `void` | `visitClosureExpression(ClosureExpression expression)`
    `void` | `visitClosureListExpression(ClosureListExpression expression)`
    `void` | `visitConstantExpression(ConstantExpression expression)` Generate byte code for constants
    `void` | `visitConstructor(ConstructorNode node)`
    `void` | `visitConstructorCallExpression(ConstructorCallExpression call)`
    `protected void` | `visitConstructorOrMethod(MethodNode node, boolean isConstructor)`
    `void` | `visitContinueStatement(ContinueStatement statement)`
    `void` | `visitDeclarationExpression(DeclarationExpression expression)`
    `void` | `visitDoWhileLoop(DoWhileStatement loop)`
    `void` | `visitExpressionStatement(ExpressionStatement statement)`
    `void` | `visitField(FieldNode fieldNode)`
    `void` | `visitFieldExpression(FieldExpression expression)`
    `void` | `visitForLoop(ForStatement loop)`
    `void` | `visitGenericType(GenericsType genericsType)`
    `void` | `visitGStringExpression(GStringExpression expression)`
    `void` | `visitIfElse(IfStatement ifElse)`
    `void` | `visitListExpression(ListExpression expression)`
    `void` | `visitMapEntryExpression(MapEntryExpression expression)`
    `void` | `visitMapExpression(MapExpression expression)`
    `void` | `visitMethod(MethodNode node)`
    `void` | `visitMethodCallExpression(MethodCallExpression call)`
    `void` | `visitMethodPointerExpression(MethodPointerExpression expression)`
    `void` | `visitNotExpression(NotExpression expression)`
    `protected void` | `visitOuterFieldExpression(FieldExpression expression, ClassNode outerClassNode, int steps, boolean first)`
    `void` | `visitPostfixExpression(PostfixExpression expression)`
    `void` | `visitPrefixExpression(PrefixExpression expression)`
    `void` | `visitProperty(PropertyNode statement)`
    `void` | `visitPropertyExpression(PropertyExpression expression)`
    `void` | `visitRangeExpression(RangeExpression expression)`
    `void` | `visitRegexExpression(RegexExpression expression)` Deprecated.
    `void` | `visitReturnStatement(ReturnStatement statement)`
    `void` | `visitSpreadExpression(SpreadExpression expression)`
    `void` | `visitSpreadMapExpression(SpreadMapExpression expression)`
    `protected void` | `visitStatement(Statement statement)`
    `void` | `visitStaticMethodCallExpression(StaticMethodCallExpression call)`
    `void` | `visitSwitch(SwitchStatement statement)`
    `void` | `visitSynchronizedStatement(SynchronizedStatement statement)`
    `void` | `visitTernaryExpression(TernaryExpression expression)`
    `void` | `visitThrowStatement(ThrowStatement statement)`
    `void` | `visitTryCatchFinally(TryCatchStatement statement)`
    `void` | `visitTupleExpression(TupleExpression expression)`
    `void` | `visitUnaryMinusExpression(UnaryMinusExpression expression)`
    `void` | `visitUnaryPlusExpression(UnaryPlusExpression expression)`
    `void` | `visitVariableExpression(VariableExpression expression)` Visits a bare (unqualified) variable expression.
    `void` | `visitWhileLoop(WhileStatement loop)`

    - ### Methods inherited from class org.codehaus.groovy.classgen.ClassGenerator

      `getClassLoader, getInnerClasses`

    - ### Methods inherited from class org.codehaus.groovy.ast.ClassCodeVisitorSupport

      `addError, visitCatchStatement, visitClassCodeContainer, visitImports, visitObjectInitializerStatements, visitPackage`

    - ### Methods inherited from class org.codehaus.groovy.ast.CodeVisitorSupport

      `visitEmptyStatement, visitListOfExpressions, visitShortTernaryExpression`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### CREATE_DEBUG_INFO

          public static final boolean CREATE_DEBUG_INFO

      See Also:
        Constant Field Values

    - #### CREATE_LINE_NUMBER_INFO

          public static final boolean CREATE_LINE_NUMBER_INFO

      See Also:
        Constant Field Values

    - #### ASM_DEBUG

          public static final boolean ASM_DEBUG

      See Also:
        Constant Field Values

  - ### Constructor Detail

    - #### AsmClassGenerator

          public AsmClassGenerator(SourceUnit source,
                           GeneratorContext context,
                           org.objectweb.asm.ClassVisitor classVisitor,
                           ClassLoader classLoader,
                           String sourceFile)

  - ### Method Detail

    - #### getSourceUnit

          protected SourceUnit getSourceUnit()

      Overrides:
        `getSourceUnit` in class `ClassGenerator`

    - #### visitClass

          public void visitClass(ClassNode classNode)

      Specified by:
        `visitClass` in interface `GroovyClassVisitor`
      Overrides:
        `visitClass` in class `ClassCodeVisitorSupport`

    - #### visitGenericType

          public void visitGenericType(GenericsType genericsType)

    - #### getMopMethodName

          public static String getMopMethodName(MethodNode method,
                                boolean useThis)

      creates a MOP method name from a method
      Parameters:
        `method` - the method to be called by the mop method
        `useThis` - if true, then it is a call on "this", "super" else
      Returns:
        the mop method name

    - #### isMopMethod

          public static boolean isMopMethod(String methodName)

      method to determine if a method is a MOP method. This is done by the method name. If the name starts with "this$" or "super$" but does not contain "$dist$", then it is an MOP method
      Parameters:
        `methodName` - name of the method to test
      Returns:
        true if the method is a MOP method

    - #### visitConstructorOrMethod

          protected void visitConstructorOrMethod(MethodNode node,
                                      boolean isConstructor)

      Overrides:
        `visitConstructorOrMethod` in class `ClassCodeVisitorSupport`

    - #### visitConstructor

          public void visitConstructor(ConstructorNode node)

      Specified by:
        `visitConstructor` in interface `GroovyClassVisitor`
      Overrides:
        `visitConstructor` in class `ClassCodeVisitorSupport`

    - #### visitMethod

          public void visitMethod(MethodNode node)

      Specified by:
        `visitMethod` in interface `GroovyClassVisitor`
      Overrides:
        `visitMethod` in class `ClassCodeVisitorSupport`

    - #### visitField

          public void visitField(FieldNode fieldNode)

      Specified by:
        `visitField` in interface `GroovyClassVisitor`
      Overrides:
        `visitField` in class `ClassCodeVisitorSupport`

    - #### visitProperty

          public void visitProperty(PropertyNode statement)

      Specified by:
        `visitProperty` in interface `GroovyClassVisitor`
      Overrides:
        `visitProperty` in class `ClassCodeVisitorSupport`

    - #### visitStatement

          protected void visitStatement(Statement statement)

      Overrides:
        `visitStatement` in class `ClassCodeVisitorSupport`

    - #### visitBlockStatement

          public void visitBlockStatement(BlockStatement block)

      Specified by:
        `visitBlockStatement` in interface `GroovyCodeVisitor`
      Overrides:
        `visitBlockStatement` in class `ClassCodeVisitorSupport`

    - #### visitForLoop

          public void visitForLoop(ForStatement loop)

      Specified by:
        `visitForLoop` in interface `GroovyCodeVisitor`
      Overrides:
        `visitForLoop` in class `ClassCodeVisitorSupport`

    - #### visitWhileLoop

          public void visitWhileLoop(WhileStatement loop)

      Specified by:
        `visitWhileLoop` in interface `GroovyCodeVisitor`
      Overrides:
        `visitWhileLoop` in class `ClassCodeVisitorSupport`

    - #### visitDoWhileLoop

          public void visitDoWhileLoop(DoWhileStatement loop)

      Specified by:
        `visitDoWhileLoop` in interface `GroovyCodeVisitor`
      Overrides:
        `visitDoWhileLoop` in class `ClassCodeVisitorSupport`

    - #### visitIfElse

          public void visitIfElse(IfStatement ifElse)

      Specified by:
        `visitIfElse` in interface `GroovyCodeVisitor`
      Overrides:
        `visitIfElse` in class `ClassCodeVisitorSupport`

    - #### visitTernaryExpression

          public void visitTernaryExpression(TernaryExpression expression)

      Specified by:
        `visitTernaryExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitTernaryExpression` in class `CodeVisitorSupport`

    - #### visitAssertStatement

          public void visitAssertStatement(AssertStatement statement)

      Specified by:
        `visitAssertStatement` in interface `GroovyCodeVisitor`
      Overrides:
        `visitAssertStatement` in class `ClassCodeVisitorSupport`

    - #### visitTryCatchFinally

          public void visitTryCatchFinally(TryCatchStatement statement)

      Specified by:
        `visitTryCatchFinally` in interface `GroovyCodeVisitor`
      Overrides:
        `visitTryCatchFinally` in class `ClassCodeVisitorSupport`

    - #### visitSwitch

          public void visitSwitch(SwitchStatement statement)

      Specified by:
        `visitSwitch` in interface `GroovyCodeVisitor`
      Overrides:
        `visitSwitch` in class `ClassCodeVisitorSupport`

    - #### visitCaseStatement

          public void visitCaseStatement(CaseStatement statement)

      Specified by:
        `visitCaseStatement` in interface `GroovyCodeVisitor`
      Overrides:
        `visitCaseStatement` in class `ClassCodeVisitorSupport`

    - #### visitCaseStatement

          public void visitCaseStatement(CaseStatement statement,
                                int switchVariableIndex,
                                org.objectweb.asm.Label thisLabel,
                                org.objectweb.asm.Label nextLabel)

    - #### visitBreakStatement

          public void visitBreakStatement(BreakStatement statement)

      Specified by:
        `visitBreakStatement` in interface `GroovyCodeVisitor`
      Overrides:
        `visitBreakStatement` in class `ClassCodeVisitorSupport`

    - #### visitContinueStatement

          public void visitContinueStatement(ContinueStatement statement)

      Specified by:
        `visitContinueStatement` in interface `GroovyCodeVisitor`
      Overrides:
        `visitContinueStatement` in class `ClassCodeVisitorSupport`

    - #### visitSynchronizedStatement

          public void visitSynchronizedStatement(SynchronizedStatement statement)

      Specified by:
        `visitSynchronizedStatement` in interface `GroovyCodeVisitor`
      Overrides:
        `visitSynchronizedStatement` in class `ClassCodeVisitorSupport`

    - #### visitThrowStatement

          public void visitThrowStatement(ThrowStatement statement)

      Specified by:
        `visitThrowStatement` in interface `GroovyCodeVisitor`
      Overrides:
        `visitThrowStatement` in class `ClassCodeVisitorSupport`

    - #### visitReturnStatement

          public void visitReturnStatement(ReturnStatement statement)

      Specified by:
        `visitReturnStatement` in interface `GroovyCodeVisitor`
      Overrides:
        `visitReturnStatement` in class `ClassCodeVisitorSupport`

    - #### doConvertAndCast

          protected void doConvertAndCast(ClassNode type,
                              Expression expression,
                              boolean ignoreAutoboxing,
                              boolean forceCast,
                              boolean coerce)

      Casts to the given type unless it can be determined that the cast is unnecessary

    - #### evaluateExpression

          protected void evaluateExpression(Expression expression)

      Parameters:
        `expression` -

    - #### visitExpressionStatement

          public void visitExpressionStatement(ExpressionStatement statement)

      Specified by:
        `visitExpressionStatement` in interface `GroovyCodeVisitor`
      Overrides:
        `visitExpressionStatement` in class `ClassCodeVisitorSupport`

    - #### visitDeclarationExpression

          public void visitDeclarationExpression(DeclarationExpression expression)

      Specified by:
        `visitDeclarationExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitDeclarationExpression` in class `CodeVisitorSupport`

    - #### visitBinaryExpression

          public void visitBinaryExpression(BinaryExpression expression)

      Specified by:
        `visitBinaryExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitBinaryExpression` in class `CodeVisitorSupport`

    - #### visitPostfixExpression

          public void visitPostfixExpression(PostfixExpression expression)

      Specified by:
        `visitPostfixExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitPostfixExpression` in class `CodeVisitorSupport`

    - #### visitPrefixExpression

          public void visitPrefixExpression(PrefixExpression expression)

      Specified by:
        `visitPrefixExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitPrefixExpression` in class `CodeVisitorSupport`

    - #### visitClosureExpression

          public void visitClosureExpression(ClosureExpression expression)

      Specified by:
        `visitClosureExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitClosureExpression` in class `CodeVisitorSupport`

    - #### loadThisOrOwner

          protected void loadThisOrOwner()

      Loads either this object or if we're inside a closure then load the top level owner

    - #### visitRegexExpression

          @Deprecated
          public void visitRegexExpression(RegexExpression expression)

      Deprecated.
      Specified by:
        `visitRegexExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitRegexExpression` in class `CodeVisitorSupport`

    - #### visitConstantExpression

          public void visitConstantExpression(ConstantExpression expression)

      Generate byte code for constants
      Specified by:
        `visitConstantExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitConstantExpression` in class `CodeVisitorSupport`
      See Also:
        Class field types

    - #### visitSpreadExpression

          public void visitSpreadExpression(SpreadExpression expression)

      Specified by:
        `visitSpreadExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitSpreadExpression` in class `CodeVisitorSupport`

    - #### visitSpreadMapExpression

          public void visitSpreadMapExpression(SpreadMapExpression expression)

      Specified by:
        `visitSpreadMapExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitSpreadMapExpression` in class `CodeVisitorSupport`

    - #### visitMethodPointerExpression

          public void visitMethodPointerExpression(MethodPointerExpression expression)

      Specified by:
        `visitMethodPointerExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitMethodPointerExpression` in class `CodeVisitorSupport`

    - #### visitUnaryMinusExpression

          public void visitUnaryMinusExpression(UnaryMinusExpression expression)

      Specified by:
        `visitUnaryMinusExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitUnaryMinusExpression` in class `CodeVisitorSupport`

    - #### visitUnaryPlusExpression

          public void visitUnaryPlusExpression(UnaryPlusExpression expression)

      Specified by:
        `visitUnaryPlusExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitUnaryPlusExpression` in class `CodeVisitorSupport`

    - #### visitBitwiseNegationExpression

          public void visitBitwiseNegationExpression(BitwiseNegationExpression expression)

      Specified by:
        `visitBitwiseNegationExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitBitwiseNegationExpression` in class `CodeVisitorSupport`

    - #### visitCastExpression

          public void visitCastExpression(CastExpression castExpression)

      Specified by:
        `visitCastExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitCastExpression` in class `CodeVisitorSupport`

    - #### visitNotExpression

          public void visitNotExpression(NotExpression expression)

      Specified by:
        `visitNotExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitNotExpression` in class `CodeVisitorSupport`

    - #### visitBooleanExpression

          public void visitBooleanExpression(BooleanExpression expression)

      return a primitive boolean value of the BooleanExpresion.
      Specified by:
        `visitBooleanExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitBooleanExpression` in class `CodeVisitorSupport`
      Parameters:
        `expression` -

    - #### visitMethodCallExpression

          public void visitMethodCallExpression(MethodCallExpression call)

      Specified by:
        `visitMethodCallExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitMethodCallExpression` in class `CodeVisitorSupport`

    - #### emptyArguments

          protected boolean emptyArguments(Expression arguments)

    - #### containsSpreadExpression

          protected static boolean containsSpreadExpression(Expression arguments)

    - #### argumentSize

          protected static int argumentSize(Expression arguments)

    - #### visitStaticMethodCallExpression

          public void visitStaticMethodCallExpression(StaticMethodCallExpression call)

      Specified by:
        `visitStaticMethodCallExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitStaticMethodCallExpression` in class `CodeVisitorSupport`

    - #### visitConstructorCallExpression

          public void visitConstructorCallExpression(ConstructorCallExpression call)

      Specified by:
        `visitConstructorCallExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitConstructorCallExpression` in class `CodeVisitorSupport`

    - #### visitPropertyExpression

          public void visitPropertyExpression(PropertyExpression expression)

      Specified by:
        `visitPropertyExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitPropertyExpression` in class `CodeVisitorSupport`

    - #### visitAttributeExpression

          public void visitAttributeExpression(AttributeExpression expression)

      Specified by:
        `visitAttributeExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitAttributeExpression` in class `CodeVisitorSupport`

    - #### isGroovyObject

          protected boolean isGroovyObject(Expression objectExpression)

    - #### visitFieldExpression

          public void visitFieldExpression(FieldExpression expression)

      Specified by:
        `visitFieldExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitFieldExpression` in class `CodeVisitorSupport`

    - #### loadStaticField

          public void loadStaticField(FieldExpression fldExp)

      Parameters:
        `fldExp` -

    - #### loadInstanceField

          public void loadInstanceField(FieldExpression fldExp)

      RHS instance field. should move most of the code in the BytecodeHelper
      Parameters:
        `fldExp` -

    - #### storeThisInstanceField

          public void storeThisInstanceField(FieldExpression expression)

    - #### storeStaticField

          public void storeStaticField(FieldExpression expression)

    - #### visitOuterFieldExpression

          protected void visitOuterFieldExpression(FieldExpression expression,
                                       ClassNode outerClassNode,
                                       int steps,
                                       boolean first)

    - #### visitVariableExpression

          public void visitVariableExpression(VariableExpression expression)

      Visits a bare (unqualified) variable expression.
      Specified by:
        `visitVariableExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitVariableExpression` in class `ClassCodeVisitorSupport`

    - #### processStackVariable

          protected void processStackVariable(Variable variable,
                                  boolean useReferenceDirectly)

    - #### processClassVariable

          protected void processClassVariable(String name)

    - #### processFieldAccess

          protected void processFieldAccess(String name,
                                FieldNode field,
                                int steps)

    - #### isInScriptBody

          protected boolean isInScriptBody()

      Returns:
        true if we are in a script body, where all variables declared are no longer local variables but are properties

    - #### isPopRequired

          protected boolean isPopRequired(Expression expression)

      Returns:
        true if this expression will have left a value on the stack that must be popped

    - #### createInterfaceSyntheticStaticFields

          protected void createInterfaceSyntheticStaticFields()

    - #### createSyntheticStaticFields

          protected void createSyntheticStaticFields()

    - #### visitClassExpression

          public void visitClassExpression(ClassExpression expression)

      load class object on stack
      Specified by:
        `visitClassExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitClassExpression` in class `CodeVisitorSupport`

    - #### visitRangeExpression

          public void visitRangeExpression(RangeExpression expression)

      Specified by:
        `visitRangeExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitRangeExpression` in class `CodeVisitorSupport`

    - #### visitMapEntryExpression

          public void visitMapEntryExpression(MapEntryExpression expression)

      Specified by:
        `visitMapEntryExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitMapEntryExpression` in class `CodeVisitorSupport`

    - #### visitMapExpression

          public void visitMapExpression(MapExpression expression)

      Specified by:
        `visitMapExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitMapExpression` in class `CodeVisitorSupport`

    - #### visitArgumentlistExpression

          public void visitArgumentlistExpression(ArgumentListExpression ale)

      Specified by:
        `visitArgumentlistExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitArgumentlistExpression` in class `CodeVisitorSupport`

    - #### visitTupleExpression

          public void visitTupleExpression(TupleExpression expression)

      Specified by:
        `visitTupleExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitTupleExpression` in class `CodeVisitorSupport`

    - #### visitArrayExpression

          public void visitArrayExpression(ArrayExpression expression)

      Specified by:
        `visitArrayExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitArrayExpression` in class `CodeVisitorSupport`

    - #### visitClosureListExpression

          public void visitClosureListExpression(ClosureListExpression expression)

      Specified by:
        `visitClosureListExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitClosureListExpression` in class `CodeVisitorSupport`

    - #### visitBytecodeSequence

          public void visitBytecodeSequence(BytecodeSequence bytecodeSequence)

      Overrides:
        `visitBytecodeSequence` in class `ClassGenerator`

    - #### visitListExpression

          public void visitListExpression(ListExpression expression)

      Specified by:
        `visitListExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitListExpression` in class `CodeVisitorSupport`

    - #### visitGStringExpression

          public void visitGStringExpression(GStringExpression expression)

      Specified by:
        `visitGStringExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitGStringExpression` in class `CodeVisitorSupport`

    - #### visitAnnotations

          public void visitAnnotations(AnnotatedNode node)

      Note: ignore it. Annotation generation needs the current visitor.
      Overrides:
        `visitAnnotations` in class `ClassCodeVisitorSupport`

    - #### addInnerClass

          protected boolean addInnerClass(ClassNode innerClass)

    - #### createClosureClass

          protected ClassNode createClosureClass(ClosureExpression expression)

    - #### getClosureSharedVariables

          protected Parameter[] getClosureSharedVariables(ClosureExpression ce)

    - #### getOutermostClass

          protected ClassNode getOutermostClass()

    - #### doConvertAndCast

          protected void doConvertAndCast(ClassNode type)

    - #### doConvertAndCast

          protected void doConvertAndCast(ClassNode type,
                              boolean coerce)

    - #### evaluateLogicalOrExpression

          protected void evaluateLogicalOrExpression(BinaryExpression expression)

    - #### evaluateLogicalAndExpression

          protected void evaluateLogicalAndExpression(BinaryExpression expression)

    - #### evaluateBinaryExpression

          protected void evaluateBinaryExpression(String method,
                                      BinaryExpression expression)

    - #### evaluateCompareTo

          protected void evaluateCompareTo(BinaryExpression expression)

    - #### evaluateBinaryExpressionWithAssignment

          protected void evaluateBinaryExpressionWithAssignment(String method,
                                                    BinaryExpression expression)

    - #### evaluateEqual

          protected void evaluateEqual(BinaryExpression expression,
                           boolean defineVariable)

    - #### getLHSType

          protected ClassNode getLHSType(Expression leftExpression)

      Deduces the type name required for some casting
      Returns:
        the type of the given (LHS) expression or null if it is java.lang.Object or it cannot be deduced

    - #### isValidTypeForCast

          protected boolean isValidTypeForCast(ClassNode type)

    - #### visitBytecodeExpression

          public void visitBytecodeExpression(BytecodeExpression cle)

      Specified by:
        `visitBytecodeExpression` in interface `GroovyCodeVisitor`
      Overrides:
        `visitBytecodeExpression` in class `CodeVisitorSupport`

    - #### visitAndAutoboxBoolean

          protected void visitAndAutoboxBoolean(Expression expression)

    - #### evaluatePrefixMethod

          protected void evaluatePrefixMethod(String method,
                                  Expression expression)

    - #### evaluatePostfixMethod

          protected void evaluatePostfixMethod(String method,
                                   Expression expression)

    - #### evaluateInstanceof

          protected void evaluateInstanceof(BinaryExpression expression)

    - #### argumentsUseStack

          protected boolean argumentsUseStack(Expression arguments)

      Returns:
        true if the given argument expression requires the stack, in which case the arguments are evaluated first, stored in the variable stack and then reloaded to make a method call

    - #### createReturnLHSExpression

          protected Expression createReturnLHSExpression(Expression expression)

      For assignment expressions, return a safe expression for the LHS we can use to return the value

    - #### createReusableExpression

          protected Expression createReusableExpression(Expression expression)

    - #### isComparisonExpression

          protected boolean isComparisonExpression(Expression expression)

    - #### onLineNumber

          protected void onLineNumber(ASTNode statement,
                          String message)

    - #### isFieldOrVariable

          protected boolean isFieldOrVariable(String name)

      Returns:
        true if the given name is a local variable or a field

    - #### getExpressionType

          protected ClassNode getExpressionType(Expression expression)

      Returns:
        if the type of the expression can be determined at compile time then this method returns the type - otherwise null

    - #### isInClosureConstructor

          protected boolean isInClosureConstructor()

    - #### isInClosure

          protected boolean isInClosure()

    - #### isNotExplicitThisInClosure

          protected boolean isNotExplicitThisInClosure(boolean implicitThis)

    - #### isStaticMethod

          protected boolean isStaticMethod()

    - #### getCompileUnit

          protected CompileUnit getCompileUnit()

    - #### usesSuper

          public static boolean usesSuper(MethodCallExpression call)

    - #### usesSuper

          public static boolean usesSuper(PropertyExpression pe)

    - #### getBytecodeVersion

          protected int getBytecodeVersion()