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 java.lang.Object implements ASTTransformation, org.objectweb.asm.Opcodes
Handles generation of code for the@Bindableannotation when@Vetoableis 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
Vetoableannotation is detected it does nothing and lets theVetoableASTTransformationhandle all the changes.
-
-
Field Summary
Fields Modifier and Type Field Description protected static ClassNodeboundClassNode-
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, V20, V21, V9
-
-
Constructor Summary
Constructors Constructor Description BindableASTTransformation()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description protected voidaddPropertyChangeSupport(ClassNode declaringClass)Adds the necessary field and methods to support property change support.protected StatementcreateBindableStatement(PropertyNode propertyNode, Expression fieldExpression)Creates a statement body similar to:this.firePropertyChange("field", field, field = value)protected voidcreateSetterMethod(ClassNode declaringClass, PropertyNode propertyNode, java.lang.String setterName, Statement setterBlock)Creates a setter method with the given body.static booleanhasBindableAnnotation(AnnotatedNode node)Convenience method to see if an annotated node is@Bindable.protected booleanneedsPropertyChangeSupport(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).voidvisit(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:
visitin 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, java.lang.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
-
-