org.codehaus.groovy.classgen

## Class Verifier

- java.lang.Object
- - org.codehaus.groovy.classgen.Verifier

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

    public class Verifier
    extends java.lang.Object
    implements GroovyClassVisitor, org.objectweb.asm.Opcodes

Verifies the AST node and adds any default AST code before bytecode generation occurs. Checks include:

- Methods with duplicate signatures
- Duplicate interfaces
- Reassigned final variables/parameters
- Uninitialized variables
- Bad code in object initializers or constructors
- Mismatches in modifiers or return types between implementations and interfaces/abstract classes

Added code includes:

- Methods needed to implement GroovyObject
- Property accessor methods
- Covariant methods
- Additional methods/constructors as needed for default parameters

### Nested Class Summary

Nested Classes
`static interface` `Verifier.DefaultArgsAction`

### Field Summary

Fields
`static java.lang.String` `__TIMESTAMP`
`static java.lang.String` `__TIMESTAMP__`
`static java.lang.String` `DEFAULT_PARAMETER_GENERATED`
`static java.lang.String` `INITIAL_EXPRESSION`
`static java.lang.String` `STATIC_METACLASS_BOOL`
`static java.lang.String` `SWAP_INIT`

### 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_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM4, ASM5, ASM6, ASM7, 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, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, 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, 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, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V9`

### Constructor Summary

Constructors
Constructor and Description
`Verifier()`

### Method Summary

All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods
`protected void` `addClosureCode(InnerClassNode node)`
`protected void` `addConstructor(Parameter[] newParams, ConstructorNode ctor, Statement code, ClassNode node)`
`protected void` `addCovariantMethods(ClassNode classNode)`
`protected void` `addDefaultConstructor(ClassNode node)`
`protected void` `addDefaultParameterConstructors(ClassNode node)`
`protected void` `addDefaultParameterMethods(ClassNode node)` Creates a new helper method for each combination of default parameter expressions
`protected void` `addDefaultParameters(java.util.List methods, Verifier.DefaultArgsAction action)` Creates a new helper method for each combination of default parameter expressions
`protected void` `addDefaultParameters(Verifier.DefaultArgsAction action, MethodNode method)`
`protected void` `addFieldInitialization(java.util.List list, java.util.List staticList, FieldNode fieldNode, boolean isEnumClassNode, java.util.List initStmtsAfterEnumValuesInit, java.util.Set explicitStaticPropsInEnum)`
`protected void` `addGroovyObjectInterfaceAndMethods(ClassNode node, java.lang.String classInternalName)`
`protected void` `addInitialization(ClassNode node)`
`protected void` `addInitialization(ClassNode node, ConstructorNode constructorNode)`
`protected void` `addMethod(ClassNode node, boolean shouldBeSynthetic, java.lang.String name, int modifiers, ClassNode returnType, Parameter[] parameters, ClassNode[] exceptions, Statement code)` Helper method to add a new method to a ClassNode.
`protected void` `addPropertyMethod(MethodNode method)`
`protected void` `addReturnIfNeeded(MethodNode node)`
`protected void` `addTimeStamp(ClassNode node)` Deprecated.
`static java.lang.String` `capitalize(java.lang.String name)` Capitalizes the start of the given bean property name
`protected Statement` `createGetterBlock(PropertyNode propertyNode, FieldNode field)`
`protected Statement` `createSetterBlock(PropertyNode propertyNode, FieldNode field)`
`ClassNode` `getClassNode()`
`MethodNode` `getMethodNode()`
`static long` `getTimestamp(java.lang.Class clazz)`
`protected void` `setClassNode(ClassNode classNode)`
`static ConstantExpression` `transformToPrimitiveConstantIfPossible(ConstantExpression constantExpression)` When constant expressions are created, the value is always wrapped to a non primitive type.
`void` `visitClass(ClassNode node)` walk the class
`void` `visitConstructor(ConstructorNode node)` Visit a ConstructorNode.
`void` `visitField(FieldNode node)` Visit a FieldNode.
`void` `visitGenericType(GenericsType genericsType)`
`void` `visitMethod(MethodNode node)` Visit a MethodNode.
`void` `visitProperty(PropertyNode node)` Visit a PropertyNode.

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

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

### Field Detail

#### STATIC_METACLASS_BOOL

    public static final java.lang.String STATIC_METACLASS_BOOL

See Also:
  Constant Field Values

#### SWAP_INIT

    public static final java.lang.String SWAP_INIT

See Also:
  Constant Field Values

#### INITIAL_EXPRESSION

    public static final java.lang.String INITIAL_EXPRESSION

See Also:
  Constant Field Values

#### DEFAULT_PARAMETER_GENERATED

    public static final java.lang.String DEFAULT_PARAMETER_GENERATED

See Also:
  Constant Field Values

#### __TIMESTAMP

    public static final java.lang.String __TIMESTAMP

See Also:
  Constant Field Values

#### __TIMESTAMP__

    public static final java.lang.String __TIMESTAMP__

See Also:
  Constant Field Values

### Constructor Detail

#### Verifier

    public Verifier()

### Method Detail

#### getClassNode

    public ClassNode getClassNode()

#### setClassNode

    protected void setClassNode(ClassNode classNode)

#### getMethodNode

    public MethodNode getMethodNode()

#### visitClass

    public void visitClass(ClassNode node)

walk the class

Specified by:
  `visitClass` in interface `GroovyClassVisitor`
Parameters:
  `node` - the node to visit

#### addDefaultConstructor

    protected void addDefaultConstructor(ClassNode node)

#### addGroovyObjectInterfaceAndMethods

    protected void addGroovyObjectInterfaceAndMethods(ClassNode node,
                                                      java.lang.String classInternalName)

#### addMethod

    protected void addMethod(ClassNode node,
                             boolean shouldBeSynthetic,
                             java.lang.String name,
                             int modifiers,
                             ClassNode returnType,
                             Parameter[] parameters,
                             ClassNode[] exceptions,
                             Statement code)

Helper method to add a new method to a ClassNode. Depending on the shouldBeSynthetic flag the call will either be made to ClassNode.addSyntheticMethod() or ClassNode.addMethod(). If a non-synthetic method is to be added the ACC_SYNTHETIC modifier is removed if it has been accidentally supplied.

#### addTimeStamp

    @Deprecated
    protected void addTimeStamp(ClassNode node)

Deprecated.

#### visitConstructor

    public void visitConstructor(ConstructorNode node)

Description copied from interface: `GroovyClassVisitor`
Visit a ConstructorNode.

Specified by:
  `visitConstructor` in interface `GroovyClassVisitor`

#### visitMethod

    public void visitMethod(MethodNode node)

Description copied from interface: `GroovyClassVisitor`
Visit a MethodNode.

Specified by:
  `visitMethod` in interface `GroovyClassVisitor`

#### addReturnIfNeeded

    protected void addReturnIfNeeded(MethodNode node)

#### visitField

    public void visitField(FieldNode node)

Description copied from interface: `GroovyClassVisitor`
Visit a FieldNode.

Specified by:
  `visitField` in interface `GroovyClassVisitor`

#### visitProperty

    public void visitProperty(PropertyNode node)

Description copied from interface: `GroovyClassVisitor`
Visit a PropertyNode.

Specified by:
  `visitProperty` in interface `GroovyClassVisitor`

#### addPropertyMethod

    protected void addPropertyMethod(MethodNode method)

#### addDefaultParameterMethods

    protected void addDefaultParameterMethods(ClassNode node)

Creates a new helper method for each combination of default parameter expressions

#### addDefaultParameterConstructors

    protected void addDefaultParameterConstructors(ClassNode node)

#### addConstructor

    protected void addConstructor(Parameter[] newParams,
                                  ConstructorNode ctor,
                                  Statement code,
                                  ClassNode node)

#### addDefaultParameters

    protected void addDefaultParameters(java.util.List methods,
                                        Verifier.DefaultArgsAction action)

Creates a new helper method for each combination of default parameter expressions

#### addDefaultParameters

    protected void addDefaultParameters(Verifier.DefaultArgsAction action,
                                        MethodNode method)

#### addClosureCode

    protected void addClosureCode(InnerClassNode node)

#### addInitialization

    protected void addInitialization(ClassNode node)

#### addInitialization

    protected void addInitialization(ClassNode node,
                                     ConstructorNode constructorNode)

#### addFieldInitialization

    protected void addFieldInitialization(java.util.List list,
                                          java.util.List staticList,
                                          FieldNode fieldNode,
                                          boolean isEnumClassNode,
                                          java.util.List initStmtsAfterEnumValuesInit,
                                          java.util.Set explicitStaticPropsInEnum)

#### capitalize

    public static java.lang.String capitalize(java.lang.String name)

Capitalizes the start of the given bean property name

#### createGetterBlock

    protected Statement createGetterBlock(PropertyNode propertyNode,
                                          FieldNode field)

#### createSetterBlock

    protected Statement createSetterBlock(PropertyNode propertyNode,
                                          FieldNode field)

#### visitGenericType

    public void visitGenericType(GenericsType genericsType)

#### getTimestamp

    public static long getTimestamp(java.lang.Class clazz)

#### addCovariantMethods

    protected void addCovariantMethods(ClassNode classNode)

#### transformToPrimitiveConstantIfPossible

    public static ConstantExpression transformToPrimitiveConstantIfPossible(ConstantExpression constantExpression)

When constant expressions are created, the value is always wrapped to a non primitive type. Some constant expressions are optimized to return primitive types, but not all primitives are handled. This method guarantees to return a similar constant expression but with a primitive type instead of a boxed type.

Additionally, single char strings are converted to 'char' types.

Parameters:
  `constantExpression` - a constant expression
Returns:
  the same instance of constant expression if the type is already primitive, or a primitive constant if possible.