Class VetoableASTTransformation
- java.lang.Object
-
- groovy.beans.BindableASTTransformation
-
- groovy.beans.VetoableASTTransformation
-
- All Implemented Interfaces:
ASTTransformation
,org.objectweb.asm.Opcodes
public class VetoableASTTransformation extends BindableASTTransformation
Handles generation of code for the@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 whatBindableASTTransformation
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, V9
-
-
Constructor Summary
Constructors Constructor Description VetoableASTTransformation()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods 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, 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
-
-
-
-
Field Detail
-
constrainedClassNode
protected static final ClassNode constrainedClassNode
-
-
Method Detail
-
hasVetoableAnnotation
public static boolean hasVetoableAnnotation(AnnotatedNode node)
Convenience method to see if an annotated node is@Vetoable
.- Parameters:
node
- the node to check- Returns:
- true if the node is constrained
-
visit
public void visit(ASTNode[] nodes, SourceUnit source)
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
protected Statement createSetStatement(Expression fieldExpression)
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
protected boolean needsVetoableChangeSupport(ClassNode declaringClass, SourceUnit sourceUnit)
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, 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
protected void addVetoableChangeSupport(ClassNode declaringClass)
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
-
-