groovy.beans
Class BindableASTTransformation

java.lang.Object
  extended by 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 annotaton is detected it does nothing and lets the VetoableASTTransformation handle all the changes.

Author:
Danno Ferrin (shemnon), Chris Reeves

Field Summary
protected static ClassNode boundClassNode
           
protected  ClassNode pcsClassNode
           
 
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_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, 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, 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, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6
 
Constructor Summary
BindableASTTransformation()
           
 
Method Summary
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 methods void addPropertyChangeListener(PropertyChangeListener), void removePropertyChangeListener(PropertyChangeListener), and void firePropertyChange(String, Object, Object).
 void visit(ASTNode[] nodes, SourceUnit source)
          Handles the bulk of the processing, mostly delegating to other methods.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

boundClassNode

protected static ClassNode boundClassNode

pcsClassNode

protected ClassNode pcsClassNode
Constructor Detail

BindableASTTransformation

public BindableASTTransformation()
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 interface ASTTransformation
Parameters:
nodes - the ast nodes
source - 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 property
fieldExpression - 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 setter
propertyNode - the field to back the setter
setterName - the name of the setter
setterBlock - the statement representing the setter block

needsPropertyChangeSupport

protected boolean needsPropertyChangeSupport(ClassNode declaringClass,
                                             SourceUnit sourceUnit)
Snoops through the declaring class and all parents looking for methods void addPropertyChangeListener(PropertyChangeListener), void removePropertyChangeListener(PropertyChangeListener), and void firePropertyChange(String, Object, Object). If any are defined all must be defined or a compilation error results.

Parameters:
declaringClass - the class to search
sourceUnit - 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

Copyright © 2003-2010 The Codehaus. All rights reserved.