diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-24 15:48:29 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-24 15:48:29 +0000 |
| commit | 3a3f549c3ff0e59bcefef29e1b870686aebec532 (patch) | |
| tree | c0f0644a90ff65a22bd21ac2271f4db9894a0738 /src/main/java/org/zwobble/couscous/ast/OperationNode.java | |
| parent | 5941365d936f73e48381db5eb444345e5f358e75 (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.java | 75 |
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; + } +} |
