aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast/OperationNode.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-24 15:48:29 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-24 15:48:29 +0000
commit3a3f549c3ff0e59bcefef29e1b870686aebec532 (patch)
treec0f0644a90ff65a22bd21ac2271f4db9894a0738 /src/main/java/org/zwobble/couscous/ast/OperationNode.java
parent5941365d936f73e48381db5eb444345e5f358e75 (diff)
Introduce separate OperationNode that can be desugarred
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast/OperationNode.java')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/OperationNode.java75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/OperationNode.java b/src/main/java/org/zwobble/couscous/ast/OperationNode.java
new file mode 100644
index 0000000..c3447ef
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/ast/OperationNode.java
@@ -0,0 +1,75 @@
+package org.zwobble.couscous.ast;
+
+import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
+import org.zwobble.couscous.ast.visitors.NodeTransformer;
+
+import java.util.List;
+
+public class OperationNode implements ExpressionNode {
+ public static OperationNode operation(Operator operator, List<ExpressionNode> arguments, TypeName type) {
+ return new OperationNode(operator, arguments, type);
+ }
+
+ private final Operator operator;
+ private final List<ExpressionNode> arguments;
+ private TypeName type;
+
+ OperationNode(Operator operator, List<ExpressionNode> arguments, TypeName type) {
+ this.operator = operator;
+ this.arguments = arguments;
+ this.type = type;
+ }
+
+ public ExpressionNode desugar() {
+ return MethodCallNode.methodCall(
+ arguments.get(0),
+ operator.getMethodName(),
+ arguments.subList(1, arguments.size()),
+ type);
+ }
+
+ @Override
+ public TypeName getType() {
+ return type;
+ }
+
+ @Override
+ public <T> T accept(ExpressionNodeMapper<T> visitor) {
+ return desugar().accept(visitor);
+ }
+
+ @Override
+ public ExpressionNode transform(NodeTransformer transformer) {
+ return desugar().transform(transformer);
+ }
+
+ @Override
+ public String toString() {
+ return "OperationNode(" +
+ "operator=" + operator +
+ ", arguments=" + arguments +
+ ", type=" + type +
+ ')';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ OperationNode that = (OperationNode) o;
+
+ if (operator != that.operator) return false;
+ if (!arguments.equals(that.arguments)) return false;
+ return type.equals(that.type);
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = operator.hashCode();
+ result = 31 * result + arguments.hashCode();
+ result = 31 * result + type.hashCode();
+ return result;
+ }
+}