diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-31 16:07:19 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-31 16:07:19 +0000 |
| commit | ad4903f04c757779b2e9a875298ef8418cb140b4 (patch) | |
| tree | 49c28509587633d484e6fbcdd8537e15e854a567 /src/main/java/org/zwobble/couscous/frontends | |
| parent | 4e13a3a626f630eb1031f32b1c3405cbf40952bc (diff) | |
Support equality on reference types
Diffstat (limited to 'src/main/java/org/zwobble/couscous/frontends')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java | 52 |
1 files changed, 40 insertions, 12 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 2e1be0c..601e565 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -243,19 +243,36 @@ public class JavaReader { String methodName = expression.getName().getIdentifier(); @SuppressWarnings("unchecked") List<ExpressionNode> arguments = readArguments(expression.arguments()); + final TypeName type = typeOf(expression); if (expression.getExpression() == null) { IMethodBinding methodBinding = expression.resolveMethodBinding(); TypeName receiverType = typeOf(methodBinding.getDeclaringClass()); if ((methodBinding.getModifiers() & Modifier.STATIC) != 0) { - return StaticMethodCallNode.staticMethodCall(receiverType, methodName, arguments); + return StaticMethodCallNode.staticMethodCall( + receiverType, + methodName, + arguments, + type); } else { - return MethodCallNode.methodCall(ThisReferenceNode.thisReference(receiverType), methodName, arguments, typeOf(expression)); + return MethodCallNode.methodCall( + ThisReferenceNode.thisReference(receiverType), + methodName, + arguments, + type); } } else if (expression.getExpression().getNodeType() == ASTNode.SIMPLE_NAME) { Expression receiver = expression.getExpression(); - return StaticMethodCallNode.staticMethodCall(typeOf(receiver), methodName, arguments); + return StaticMethodCallNode.staticMethodCall( + typeOf(receiver), + methodName, + arguments, + type); } else { - return MethodCallNode.methodCall(readExpression(expression.getExpression()), methodName, arguments, typeOf(expression)); + return MethodCallNode.methodCall( + readExpression(expression.getExpression()), + methodName, + arguments, + type); } } @@ -274,15 +291,26 @@ public class JavaReader { private static ExpressionNode readInfixExpression(InfixExpression expression) { final ExpressionNode left = readExpression(expression.getLeftOperand()); final ExpressionNode right = readExpression(expression.getRightOperand()); - if (expression.getOperator() == Operator.NOT_EQUALS) { - return MethodCallNode.not(methodCall(left, "equals", asList(right), BooleanValue.REF)); + + if (left.getType().equals(IntegerValue.REF)) { + if (expression.getOperator() == Operator.NOT_EQUALS) { + return MethodCallNode.not(methodCall(left, "equals", asList(right), BooleanValue.REF)); + } else { + JavaOperator operator = readOperator(expression.getOperator()); + return MethodCallNode.methodCall( + left, + operator.methodName, + asList(right), + operator.returnValue); + } } else { - JavaOperator operator = readOperator(expression.getOperator()); - return MethodCallNode.methodCall( - left, - operator.methodName, - asList(right), - operator.returnValue); + if (expression.getOperator() == Operator.EQUALS) { + return StaticMethodCallNode.same(left, right); + } else if (expression.getOperator() == Operator.NOT_EQUALS) { + return MethodCallNode.not(StaticMethodCallNode.same(left, right)); + } else { + throw new IllegalArgumentException("Unsupported operator: " + expression.getOperator()); + } } } |
