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 ClassNode
constrainedClassNode
Fields inherited from class groovy.beans.BindableASTTransformation
boundClassNode
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_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, V9
-
Constructor Summary
Constructors Constructor Description VetoableASTTransformation()
-
Method Summary
Modifier and Type Method Description protected void
addVetoableChangeSupport(ClassNode declaringClass)
Adds the necessary field and methods to support vetoable change support.protected Statement
createConstrainedStatement(PropertyNode propertyNode, Expression fieldExpression)
Creates a statement body similar to:this.fireVetoableChange("field", field, field = value)
protected Statement
createSetStatement(Expression fieldExpression)
Creates a statement body similar to:field = value
.protected void
createSetterMethod(ClassNode declaringClass, PropertyNode propertyNode, java.lang.String setterName, Statement setterBlock)
Creates a setter method with the given body.static boolean
hasVetoableAnnotation(AnnotatedNode node)
Convenience method to see if an annotated node is@Vetoable
.protected boolean
needsVetoableChangeSupport(ClassNode declaringClass, SourceUnit sourceUnit)
Snoops through the declaring class and all parents looking for a field of type VetoableChangeSupport.void
visit(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, needsPropertyChangeSupport
Methods 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:
visit
in interfaceASTTransformation
- Overrides:
visit
in 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:
createSetterMethod
in 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
-