View Javadoc

1   /*
2    $Id: FieldNode.java,v 1.17 2005/11/13 16:42:09 blackdrag Exp $
3   
4    Copyright 2003 (C) James Strachan and Bob Mcwhirter. All Rights Reserved.
5   
6    Redistribution and use of this software and associated documentation
7    ("Software"), with or without modification, are permitted provided
8    that the following conditions are met:
9   
10   1. Redistributions of source code must retain copyright
11      statements and notices.  Redistributions must also contain a
12      copy of this document.
13  
14   2. Redistributions in binary form must reproduce the
15      above copyright notice, this list of conditions and the
16      following disclaimer in the documentation and/or other
17      materials provided with the distribution.
18  
19   3. The name "groovy" must not be used to endorse or promote
20      products derived from this Software without prior written
21      permission of The Codehaus.  For written permission,
22      please contact info@codehaus.org.
23  
24   4. Products derived from this Software may not be called "groovy"
25      nor may "groovy" appear in their names without prior written
26      permission of The Codehaus. "groovy" is a registered
27      trademark of The Codehaus.
28  
29   5. Due credit should be given to The Codehaus -
30      http://groovy.codehaus.org/
31  
32   THIS SOFTWARE IS PROVIDED BY THE CODEHAUS AND CONTRIBUTORS
33   ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
34   NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
35   FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
36   THE CODEHAUS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
37   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
38   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
39   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
40   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
41   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
42   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
43   OF THE POSSIBILITY OF SUCH DAMAGE.
44  
45   */
46  package org.codehaus.groovy.ast;
47  
48  import java.lang.reflect.Field;
49  
50  import org.codehaus.groovy.ast.expr.Expression;
51  import org.objectweb.asm.Opcodes;
52  
53  /***
54   * Represents a field (member variable)
55   * 
56   * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
57   * @version $Revision: 1.17 $
58   */
59  public class FieldNode extends AnnotatedNode implements Opcodes, Variable {
60  
61      private String name;
62      private int modifiers;
63      private ClassNode type;
64      private ClassNode owner;
65      private Expression initialValueExpression;
66      private boolean dynamicTyped;
67      private boolean holder;
68  
69      public static FieldNode newStatic(Class theClass, String name) throws SecurityException, NoSuchFieldException {
70          Field field = theClass.getField(name);
71          ClassNode fldType = ClassHelper.make(field.getType());
72          return new FieldNode(name, ACC_PUBLIC | ACC_STATIC, fldType, ClassHelper.make(theClass), null);
73      }
74  
75      public FieldNode(String name, int modifiers, ClassNode type, ClassNode owner, Expression initialValueExpression) {
76          this.name = name;
77          this.modifiers = modifiers;
78          this.type = type;
79          if (this.type==ClassHelper.DYNAMIC_TYPE && initialValueExpression!=null) this.setType(initialValueExpression.getType());
80          this.setType(ClassHelper.getWrapper(type));
81          this.owner = owner;
82          this.initialValueExpression = initialValueExpression;
83      }
84  
85      public Expression getInitialExpression() {
86          return initialValueExpression;
87      }
88  
89      public int getModifiers() {
90          return modifiers;
91      }
92  
93      public String getName() {
94          return name;
95      }
96  
97      public ClassNode getType() {
98          return type;
99      }
100 
101     public void setType(ClassNode type) {
102         this.type = type;
103         dynamicTyped |= type==ClassHelper.DYNAMIC_TYPE;
104     }
105     
106     public ClassNode getOwner() {
107         return owner;
108     }
109 
110     public boolean isHolder() {
111         return holder;
112     }
113 
114     public void setHolder(boolean holder) {
115         this.holder = holder;
116     }
117 
118     public boolean isDynamicTyped() {
119         return dynamicTyped;
120     }
121 
122     public void setModifiers(int modifiers) {
123         this.modifiers = modifiers;
124     }
125 
126     /***
127      * @return true if the field is static
128      */
129     public boolean isStatic() {
130         return (modifiers & ACC_STATIC) != 0;
131     }
132 	/***
133 	 * @param owner The owner to set.
134 	 */
135 	public void setOwner(ClassNode owner) {
136 		this.owner = owner;
137 	}
138 
139     public boolean hasInitialExpression() {
140         return initialValueExpression!=null;
141     }
142 
143     public boolean isInStaticContext() {
144         return isStatic();
145     }
146     public Expression getInitialValueExpression() {
147         return initialValueExpression;
148     }
149     public void setInitialValueExpression(Expression initialValueExpression) {
150         this.initialValueExpression = initialValueExpression;
151     }
152 }