Package groovy.beans
Class BindableASTTransformation
- java.lang.Object
-
- groovy.beans.BindableASTTransformation
-
- All Implemented Interfaces:
ASTTransformation
,org.objectweb.asm.Opcodes
- Direct Known Subclasses:
VetoableASTTransformation
public class BindableASTTransformation extends Object implements ASTTransformation, org.objectweb.asm.Opcodes
Handles generation of code for the@Bindable
annotation when@Vetoable
is not present.Generally, it adds (if needed) a PropertyChangeSupport field and the needed add/removePropertyChangeListener methods to support the listeners.
It also generates the setter and wires the setter through the PropertyChangeSupport.
If a
Vetoable
annotation is detected it does nothing and lets theVetoableASTTransformation
handle all the changes.
-
-
Field Summary
Fields Modifier and Type Field Description protected static ClassNode
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_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, ASM8_EXPERIMENTAL, 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, V9
-
-
Constructor Summary
Constructors Constructor Description BindableASTTransformation()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description protected void
addPropertyChangeSupport(ClassNode declaringClass)
Adds the necessary field and methods to support property change support.protected Statement
createBindableStatement(PropertyNode propertyNode, Expression fieldExpression)
Creates a statement body similar to:this.firePropertyChange("field", field, field = value)
protected void
createSetterMethod(ClassNode declaringClass, PropertyNode propertyNode, String setterName, Statement setterBlock)
Creates a setter method with the given body.static boolean
hasBindableAnnotation(AnnotatedNode node)
Convenience method to see if an annotated node is@Bindable
.protected boolean
needsPropertyChangeSupport(ClassNode declaringClass, SourceUnit sourceUnit)
Snoops through the declaring class and all parents looking for methodsvoid addPropertyChangeListener(PropertyChangeListener)
,void removePropertyChangeListener(PropertyChangeListener)
, andvoid firePropertyChange(String, Object, Object)
.void
visit(ASTNode[] nodes, SourceUnit source)
Handles the bulk of the processing, mostly delegating to other methods.
-
-
-
Field Detail
-
boundClassNode
protected static ClassNode boundClassNode
-
-
Method Detail
-
hasBindableAnnotation
public static boolean hasBindableAnnotation(AnnotatedNode node)
Convenience method to see if an annotated node is@Bindable
.- Parameters:
node
- the node to check- Returns:
- true if the node is bindable
-
visit
public void visit(ASTNode[] nodes, SourceUnit source)
Handles the bulk of the processing, mostly delegating to other methods.- Specified by:
visit
in interfaceASTTransformation
- Parameters:
nodes
- the ast nodessource
- the source unit for the nodes
-
createBindableStatement
protected Statement createBindableStatement(PropertyNode propertyNode, Expression fieldExpression)
Creates a statement body similar to:this.firePropertyChange("field", field, field = value)
- Parameters:
propertyNode
- the field node for the propertyfieldExpression
- a field expression for setting the property value- Returns:
- the created statement
-
createSetterMethod
protected void createSetterMethod(ClassNode declaringClass, PropertyNode propertyNode, String setterName, Statement setterBlock)
Creates a setter method with the given body.- 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
-
needsPropertyChangeSupport
protected boolean needsPropertyChangeSupport(ClassNode declaringClass, SourceUnit sourceUnit)
Snoops through the declaring class and all parents looking for methodsvoid addPropertyChangeListener(PropertyChangeListener)
,void removePropertyChangeListener(PropertyChangeListener)
, andvoid firePropertyChange(String, Object, Object)
. If any are defined all must be defined or a compilation error results.- Parameters:
declaringClass
- the class to searchsourceUnit
- the source unit, for error reporting.@NotNull
.- Returns:
- true if property change support should be added
-
addPropertyChangeSupport
protected void addPropertyChangeSupport(ClassNode declaringClass)
Adds the necessary field and methods to support property change support.Adds a new field:
protected final java.beans.PropertyChangeSupport this$PropertyChangeSupport = new java.beans.PropertyChangeSupport(this)
"Also adds support methods:
public void addPropertyChangeListener(java.beans.PropertyChangeListener)
public void addPropertyChangeListener(String, java.beans.PropertyChangeListener)
public void removePropertyChangeListener(java.beans.PropertyChangeListener)
public void removePropertyChangeListener(String, java.beans.PropertyChangeListener)
public java.beans.PropertyChangeListener[] getPropertyChangeListeners()
- Parameters:
declaringClass
- the class to which we add the support field and methods
-
-