diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-31 10:40:17 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-31 10:40:17 +0000 |
| commit | 292834a886ff6a2263ad9878500edec35efb5d60 (patch) | |
| tree | af419dca5aafac35b4d2e660c4c338f074fa497e /src/main/java/org | |
| parent | 12c91d0c9fc8b9e400aae47058ae41d92602f6eb (diff) | |
Read some infix operators for int
Diffstat (limited to 'src/main/java/org')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java index 36c6b9c..baef84a 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -18,6 +18,8 @@ import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.IVariableBinding; +import org.eclipse.jdt.core.dom.InfixExpression; +import org.eclipse.jdt.core.dom.InfixExpression.Operator; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.MethodInvocation; import org.eclipse.jdt.core.dom.Modifier; @@ -48,6 +50,9 @@ import org.zwobble.couscous.ast.StaticMethodCallNode; import org.zwobble.couscous.ast.TernaryConditionalNode; import org.zwobble.couscous.ast.ThisReferenceNode; import org.zwobble.couscous.ast.TypeName; +import org.zwobble.couscous.values.BooleanValue; +import org.zwobble.couscous.values.IntegerValue; + import com.google.common.collect.Lists; import static java.util.Arrays.asList; import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement; @@ -174,6 +179,9 @@ public class JavaReader { case ASTNode.CLASS_INSTANCE_CREATION: return readClassInstanceCreation((ClassInstanceCreation)expression); + case ASTNode.INFIX_EXPRESSION: + return readInfixExpression((InfixExpression)expression); + case ASTNode.CONDITIONAL_EXPRESSION: return readConditionalExpression((ConditionalExpression)expression); @@ -185,7 +193,7 @@ public class JavaReader { } } - + private static ExpressionNode readBooleanLiteral(BooleanLiteral expression) { return LiteralNode.literal(expression.booleanValue()); } @@ -252,6 +260,53 @@ public class JavaReader { return Lists.transform((List<Expression>)javaArguments, JavaReader::readExpression); } + private static ExpressionNode readInfixExpression(InfixExpression expression) { + JavaOperator operator = readOperator(expression.getOperator()); + return MethodCallNode.methodCall( + readExpression(expression.getLeftOperand()), + operator.methodName, + asList(readExpression(expression.getRightOperand())), + operator.returnValue); + } + + private static JavaOperator readOperator(Operator operator) { + if (operator == Operator.PLUS) { + return JavaOperator.of("add", IntegerValue.REF); + } else if (operator == Operator.MINUS) { + return JavaOperator.of("subtract", IntegerValue.REF); + } else if (operator == Operator.TIMES) { + return JavaOperator.of("multiply", IntegerValue.REF); + } else if (operator == Operator.DIVIDE) { + return JavaOperator.of("divide", IntegerValue.REF); + } else if (operator == Operator.REMAINDER) { + return JavaOperator.of("mod", IntegerValue.REF); + } else if (operator == Operator.GREATER) { + return JavaOperator.of("greaterThan", BooleanValue.REF); + } else if (operator == Operator.GREATER_EQUALS) { + return JavaOperator.of("greaterThanOrEqual", BooleanValue.REF); + } else if (operator == Operator.LESS) { + return JavaOperator.of("lessThan", BooleanValue.REF); + } else if (operator == Operator.LESS_EQUALS) { + return JavaOperator.of("lessThanOrEqual", BooleanValue.REF); + } else { + throw new RuntimeException("Unrecognised operator: " + operator); + } + } + + private static class JavaOperator { + private static JavaOperator of(String methodName, TypeName returnValue) { + return new JavaOperator(methodName, returnValue); + } + + private final String methodName; + private final TypeName returnValue; + + private JavaOperator(String methodName, TypeName returnValue) { + this.methodName = methodName; + this.returnValue = returnValue; + } + } + private static ExpressionNode readConditionalExpression(ConditionalExpression expression) { return TernaryConditionalNode.ternaryConditional(readExpression(expression.getExpression()), readExpression(expression.getThenExpression()), readExpression(expression.getElseExpression())); } |
