Class VetoableASTTransformation
- All Implemented Interfaces:
ASTTransformation,org.objectweb.asm.Opcodes
public class VetoableASTTransformation extends BindableASTTransformation
@Vetoable annotation, and @Bindable
if also present.
Generally, it adds (if needed) a VetoableChangeSupport field and the needed add/removeVetoableChangeListener methods to support the listeners.
It also generates the setter and wires the setter through the VetoableChangeSupport.
If a Bindable annotation is detected it also adds support similar
to what BindableASTTransformation would do.
-
Field Summary
Fields Modifier and Type Field Description protected static ClassNodeconstrainedClassNodeFields inherited from class groovy.beans.BindableASTTransformation
boundClassNodeFields 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_RECORD, 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, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, 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, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V9 -
Constructor Summary
Constructors Constructor Description VetoableASTTransformation() -
Method Summary
Modifier and Type Method Description protected voidaddVetoableChangeSupport(ClassNode declaringClass)Adds the necessary field and methods to support vetoable change support.protected StatementcreateConstrainedStatement(PropertyNode propertyNode, Expression fieldExpression)Creates a statement body similar to:this.fireVetoableChange("field", field, field = value)protected StatementcreateSetStatement(Expression fieldExpression)Creates a statement body similar to:field = value.protected voidcreateSetterMethod(ClassNode declaringClass, PropertyNode propertyNode, java.lang.String setterName, Statement setterBlock)Creates a setter method with the given body.static booleanhasVetoableAnnotation(AnnotatedNode node)Convenience method to see if an annotated node is@Vetoable.protected booleanneedsVetoableChangeSupport(ClassNode declaringClass, SourceUnit sourceUnit)Snoops through the declaring class and all parents looking for a field of type VetoableChangeSupport.voidvisit(ASTNode[] nodes, SourceUnit source)Handles the bulk of the processing, mostly delegating to other methods.Methods inherited from class groovy.beans.BindableASTTransformation
addPropertyChangeSupport, createBindableStatement, hasBindableAnnotation, needsPropertyChangeSupportMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Field Details
-
constrainedClassNode
-
-
Constructor Details
-
VetoableASTTransformation
public VetoableASTTransformation()
-
-
Method Details
-
hasVetoableAnnotation
Convenience method to see if an annotated node is@Vetoable.- Parameters:
node- the node to check- Returns:
- true if the node is constrained
-
visit
Handles the bulk of the processing, mostly delegating to other methods.- Specified by:
visitin interfaceASTTransformation- Overrides:
visitin classBindableASTTransformation- Parameters:
nodes- the AST nodessource- the source unit for the nodes
-
createConstrainedStatement
protected Statement createConstrainedStatement(PropertyNode propertyNode, Expression fieldExpression)Creates a statement body similar to:this.fireVetoableChange("field", field, field = value)- Parameters:
propertyNode- the field node for the propertyfieldExpression- a field expression for setting the property value- Returns:
- the created statement
-
createSetStatement
Creates a statement body similar to:field = value.Used when the field is not also
@Bindable.- Parameters:
fieldExpression- a field expression for setting the property value- Returns:
- the created statement
-
needsVetoableChangeSupport
Snoops through the declaring class and all parents looking for a field of type VetoableChangeSupport. Remembers the field and returns false if found otherwise returns true to indicate that such support should be added.- Parameters:
declaringClass- the class to search- Returns:
- true if vetoable change support should be added
-
createSetterMethod
protected void createSetterMethod(ClassNode declaringClass, PropertyNode propertyNode, java.lang.String setterName, Statement setterBlock)Creates a setter method with the given body.This differs from normal setters in that we need to add a declared exception java.beans.PropertyVetoException
- Overrides:
createSetterMethodin classBindableASTTransformation- Parameters:
declaringClass- the class to which we will add the setterpropertyNode- the field to back the settersetterName- the name of the settersetterBlock- the statement representing the setter block
-
addVetoableChangeSupport
Adds the necessary field and methods to support vetoable change support.Adds a new field:
"protected final java.beans.VetoableChangeSupport this$vetoableChangeSupport = new java.beans.VetoableChangeSupport(this)"Also adds support methods:
public void addVetoableChangeListener(java.beans.VetoableChangeListener)public void addVetoableChangeListener(String, java.beans.VetoableChangeListener)public void removeVetoableChangeListener(java.beans.VetoableChangeListener)public void removeVetoableChangeListener(String, java.beans.VetoableChangeListener)public java.beans.VetoableChangeListener[] getVetoableChangeListeners()- Parameters:
declaringClass- the class to which we add the support field and methods
-