aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/frontends
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-03-30 14:16:10 +0100
committerMichael Williamson <mike@zwobble.org>2016-03-30 14:16:10 +0100
commiteda05cc1e2f845b4e7c3eeea505c535432240197 (patch)
treec5fadfec89d5c8aee66d8838456dfe695d6c02b0 /src/main/java/org/zwobble/couscous/frontends
parentdd86a4da8bf2ce24133f6399ede4cd5561d19810 (diff)
Read extended operands in infix operations
Diffstat (limited to 'src/main/java/org/zwobble/couscous/frontends')
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java32
1 files changed, 20 insertions, 12 deletions
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
index 72cba9b..4adb92c 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
@@ -1,5 +1,6 @@
package org.zwobble.couscous.frontends.java;
+import com.google.common.collect.Iterables;
import org.eclipse.jdt.core.dom.*;
import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.types.Type;
@@ -19,8 +20,8 @@ import static org.zwobble.couscous.ast.Operations.not;
import static org.zwobble.couscous.ast.TypeCoercionNode.typeCoercion;
import static org.zwobble.couscous.frontends.java.JavaOperators.readOperator;
import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf;
-import static org.zwobble.couscous.util.ExtraLists.concat;
-import static org.zwobble.couscous.util.ExtraLists.list;
+import static org.zwobble.couscous.util.ExtraLists.*;
+import static org.zwobble.couscous.util.Fold.foldLeft;
public class JavaExpressionReader {
private final Scope scope;
@@ -264,10 +265,7 @@ public class JavaExpressionReader {
private ExpressionNode readInfixExpression(InfixExpression expression) {
if (isPrimitiveOperation(expression)) {
Operator operator = readOperator(expression.getOperator());
- return readPrimitiveOperation(
- operator,
- expression.getLeftOperand(),
- expression.getRightOperand());
+ return readPrimitiveOperation(operator, operands(expression));
} else {
ExpressionNode left = readExpression(Types.OBJECT, expression.getLeftOperand());
ExpressionNode right = readExpression(Types.OBJECT, expression.getRightOperand());
@@ -281,7 +279,17 @@ public class JavaExpressionReader {
}
}
+ private Iterable<Expression> operands(InfixExpression expression) {
+ @SuppressWarnings("unchecked")
+ List<Expression> extendedOperands = expression.extendedOperands();
+ return Iterables.concat(
+ list(expression.getLeftOperand()),
+ list(expression.getRightOperand()),
+ extendedOperands);
+ }
+
private static boolean isPrimitiveOperation(InfixExpression expression) {
+ // TODO: consider expression.extendedOperands
Type leftOperandType = typeOf(expression.getLeftOperand());
Type rightOperandType = typeOf(expression.getRightOperand());
return isPrimitive(leftOperandType)
@@ -329,17 +337,17 @@ public class JavaExpressionReader {
left,
coerceExpression(
left.getType(),
- readPrimitiveOperation(operator, expression.getLeftHandSide(), expression.getRightHandSide())));
+ readPrimitiveOperation(operator, list(expression.getLeftHandSide(), expression.getRightHandSide()))));
}
}
- private ExpressionNode readPrimitiveOperation(Operator operator, Expression leftJava, Expression rightJava) {
- ExpressionNode left = readUnboxedExpression(leftJava);
- ExpressionNode right = readUnboxedExpression(rightJava);
- return operation(
+ private ExpressionNode readPrimitiveOperation(Operator operator, Iterable<Expression> javaOperands) {
+ List<ExpressionNode> operands = eagerMap(javaOperands, operand -> readUnboxedExpression(operand));
+ return foldLeft(operands, (left, right) -> operation(
operator,
list(left, right),
- operator.isBoolean() ? Types.BOOLEAN : left.getType());
+ operator.isBoolean() ? Types.BOOLEAN : left.getType())
+ );
}
private ExpressionNode readCastExpression(CastExpression expression) {