001: /*
002: $Id: VariableExpression.java 3419 2006-01-19 00:07:02Z blackdrag $
003:
004: Copyright 2003 (C) James Strachan and Bob Mcwhirter. All Rights Reserved.
005:
006: Redistribution and use of this software and associated documentation
007: ("Software"), with or without modification, are permitted provided
008: that the following conditions are met:
009:
010: 1. Redistributions of source code must retain copyright
011: statements and notices. Redistributions must also contain a
012: copy of this document.
013:
014: 2. Redistributions in binary form must reproduce the
015: above copyright notice, this list of conditions and the
016: following disclaimer in the documentation and/or other
017: materials provided with the distribution.
018:
019: 3. The name "groovy" must not be used to endorse or promote
020: products derived from this Software without prior written
021: permission of The Codehaus. For written permission,
022: please contact info@codehaus.org.
023:
024: 4. Products derived from this Software may not be called "groovy"
025: nor may "groovy" appear in their names without prior written
026: permission of The Codehaus. "groovy" is a registered
027: trademark of The Codehaus.
028:
029: 5. Due credit should be given to The Codehaus -
030: http://groovy.codehaus.org/
031:
032: THIS SOFTWARE IS PROVIDED BY THE CODEHAUS AND CONTRIBUTORS
033: ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
034: NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
035: FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
036: THE CODEHAUS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
037: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
038: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
039: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
040: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
041: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
042: ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
043: OF THE POSSIBILITY OF SUCH DAMAGE.
044:
045: */
046: package org.codehaus.groovy.ast.expr;
047:
048: import org.codehaus.groovy.ast.ClassHelper;
049: import org.codehaus.groovy.ast.ClassNode;
050: import org.codehaus.groovy.ast.GroovyCodeVisitor;
051: import org.codehaus.groovy.ast.Variable;
052:
053: /**
054: * Represents a local variable name, the simplest form of expression. e.g. "foo".
055: *
056: * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
057: * @version $Revision: 3419 $
058: */
059: public class VariableExpression extends Expression implements Variable {
060:
061: public static final VariableExpression THIS_EXPRESSION = new VariableExpression(
062: "this", ClassHelper.DYNAMIC_TYPE);
063: public static final VariableExpression SUPER_EXPRESSION = new VariableExpression(
064: "super", ClassHelper.DYNAMIC_TYPE);
065:
066: private String variable;
067: private boolean inStaticContext;
068: private boolean isDynamicTyped = false;
069: private Variable accessedVariable;
070: boolean closureShare = false;
071:
072: public Variable getAccessedVariable() {
073: return accessedVariable;
074: }
075:
076: public void setAccessedVariable(Variable origin) {
077: this .accessedVariable = origin;
078: }
079:
080: public VariableExpression(String variable, ClassNode type) {
081: this .variable = variable;
082: super .setType(ClassHelper.getWrapper(type));
083: }
084:
085: public VariableExpression(String variable) {
086: this (variable, ClassHelper.DYNAMIC_TYPE);
087: }
088:
089: public VariableExpression(Variable variable) {
090: this (variable.getName(), variable.getType());
091: setAccessedVariable(variable);
092: }
093:
094: public void visit(GroovyCodeVisitor visitor) {
095: visitor.visitVariableExpression(this );
096: }
097:
098: public Expression transformExpression(
099: ExpressionTransformer transformer) {
100: return this ;
101: }
102:
103: public String getText() {
104: return variable;
105: }
106:
107: public String getName() {
108: return variable;
109: }
110:
111: /**
112: * @return true if this variable is dynamically typed
113: */
114: public String toString() {
115: return super .toString() + "[variable: " + variable
116: + (this .isDynamicTyped() ? "" : " type: " + getType())
117: + "]";
118: }
119:
120: public Expression getInitialExpression() {
121: return null;
122: }
123:
124: public boolean hasInitialExpression() {
125: return false;
126: }
127:
128: public boolean isInStaticContext() {
129: if (accessedVariable != null && accessedVariable != this )
130: return accessedVariable.isInStaticContext();
131: return inStaticContext;
132: }
133:
134: public void setInStaticContext(boolean inStaticContext) {
135: this .inStaticContext = inStaticContext;
136: }
137:
138: public void setType(ClassNode cn) {
139: super .setType(cn);
140: isDynamicTyped |= ClassHelper.DYNAMIC_TYPE == cn;
141: }
142:
143: public boolean isDynamicTyped() {
144: return isDynamicTyped;
145: }
146:
147: public boolean isClosureSharedVariable() {
148: if (accessedVariable != null && accessedVariable != this )
149: return accessedVariable.isClosureSharedVariable();
150: return closureShare;
151: }
152:
153: public void setClosureSharedVariable(boolean inClosure) {
154: closureShare = inClosure;
155: }
156:
157: public ClassNode getType() {
158: if (accessedVariable != null && accessedVariable != this)
159: return accessedVariable.getType();
160: return super.getType();
161: }
162: }
|