001: /*
002: $Id: BinaryExpression.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.ClassNode;
049: import org.codehaus.groovy.ast.GroovyCodeVisitor;
050: import org.codehaus.groovy.ast.Variable;
051: import org.codehaus.groovy.syntax.Token;
052: import org.codehaus.groovy.syntax.Types;
053:
054: /**
055: * Represents two expressions and an operation
056: *
057: * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
058: * @version $Revision: 3419 $
059: */
060: public class BinaryExpression extends Expression {
061:
062: private Expression leftExpression;
063: private Expression rightExpression;
064: private Token operation;
065:
066: public BinaryExpression(Expression leftExpression, Token operation,
067: Expression rightExpression) {
068: this .leftExpression = leftExpression;
069: this .operation = operation;
070: this .rightExpression = rightExpression;
071: }
072:
073: public String toString() {
074: return super .toString() + "[" + leftExpression + operation
075: + rightExpression + "]";
076: }
077:
078: public void visit(GroovyCodeVisitor visitor) {
079: visitor.visitBinaryExpression(this );
080: }
081:
082: public Expression transformExpression(
083: ExpressionTransformer transformer) {
084: Expression ret = new BinaryExpression(transformer
085: .transform(leftExpression), operation, transformer
086: .transform(rightExpression));
087: ret.setSourcePosition(this );
088: return ret;
089: }
090:
091: public Expression getLeftExpression() {
092: return leftExpression;
093: }
094:
095: public void setLeftExpression(Expression leftExpression) {
096: this .leftExpression = leftExpression;
097: }
098:
099: public void setRightExpression(Expression rightExpression) {
100: this .rightExpression = rightExpression;
101: }
102:
103: public Token getOperation() {
104: return operation;
105: }
106:
107: public Expression getRightExpression() {
108: return rightExpression;
109: }
110:
111: public String getText() {
112: if (operation.getType() == Types.LEFT_SQUARE_BRACKET) {
113: return leftExpression.getText() + "["
114: + rightExpression.getText() + "]";
115: }
116: return "(" + leftExpression.getText() + " "
117: + operation.getText() + " " + rightExpression.getText()
118: + ")";
119: }
120:
121: /**
122: * Creates an assignment expression in which the specified expression
123: * is written into the specified variable name.
124: */
125:
126: public static BinaryExpression newAssignmentExpression(
127: Variable variable, Expression rhs) {
128: VariableExpression lhs = new VariableExpression(variable);
129: Token operator = Token.newPlaceholder(Types.ASSIGN);
130:
131: return new BinaryExpression(lhs, operator, rhs);
132: }
133:
134: /**
135: * Creates variable initialization expression in which the specified expression
136: * is written into the specified variable name.
137: */
138:
139: public static BinaryExpression newInitializationExpression(
140: String variable, ClassNode type, Expression rhs) {
141: VariableExpression lhs = new VariableExpression(variable);
142:
143: if (type != null) {
144: lhs.setType(type);
145: }
146:
147: Token operator = Token.newPlaceholder(Types.ASSIGN);
148:
149: return new BinaryExpression(lhs, operator, rhs);
150: }
151:
152: }
|