aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-06-17 21:18:09 +0100
committerMichael Williamson <mike@zwobble.org>2016-06-17 21:18:09 +0100
commit65371fd16808d9c8f34d0e0cd2ba030bcc6a7128 (patch)
treec4cb1e0a9a4a7f57f6e7fe2e51da8272211aba85
parent242350031b18514247d77801509d65ca4e6e769c (diff)
Read Java instanceof expressions
-rw-r--r--src/main/java/org/zwobble/couscous/ast/Operations.java5
-rw-r--r--src/main/java/org/zwobble/couscous/ast/Operator.java4
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java10
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java6
4 files changed, 24 insertions, 1 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/Operations.java b/src/main/java/org/zwobble/couscous/ast/Operations.java
index 04de1de..ca7483f 100644
--- a/src/main/java/org/zwobble/couscous/ast/Operations.java
+++ b/src/main/java/org/zwobble/couscous/ast/Operations.java
@@ -1,8 +1,10 @@
package org.zwobble.couscous.ast;
+import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.types.Types;
import org.zwobble.couscous.values.InternalCouscousValue;
+import static org.zwobble.couscous.ast.LiteralNode.literal;
import static org.zwobble.couscous.ast.MethodCallNode.staticMethodCall;
import static org.zwobble.couscous.ast.TypeCoercionNode.typeCoercion;
import static org.zwobble.couscous.util.ExtraLists.list;
@@ -90,4 +92,7 @@ public class Operations {
return typeCoercion(value, Types.INT);
}
+ public static ExpressionNode instanceOf(ExpressionNode value, ScalarType type) {
+ return booleanOperation(Operator.INSTANCE_OF, value, literal(type));
+ }
}
diff --git a/src/main/java/org/zwobble/couscous/ast/Operator.java b/src/main/java/org/zwobble/couscous/ast/Operator.java
index a77a135..9dc197b 100644
--- a/src/main/java/org/zwobble/couscous/ast/Operator.java
+++ b/src/main/java/org/zwobble/couscous/ast/Operator.java
@@ -16,7 +16,9 @@ public enum Operator {
GREATER_THAN(">", true, OperatorType.INFIX),
GREATER_THAN_OR_EQUAL(">=", true, OperatorType.INFIX),
LESS_THAN("<", true, OperatorType.INFIX),
- LESS_THAN_OR_EQUAL("<=", true, OperatorType.INFIX);
+ LESS_THAN_OR_EQUAL("<=", true, OperatorType.INFIX),
+
+ INSTANCE_OF("instanceof", true, OperatorType.INFIX);
private final String symbol;
private final boolean isBoolean;
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 e6b3822..370719e 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
@@ -19,6 +19,7 @@ import static org.zwobble.couscous.ast.InstanceReceiver.instanceReceiver;
import static org.zwobble.couscous.ast.LiteralNode.literal;
import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
import static org.zwobble.couscous.ast.OperationNode.operation;
+import static org.zwobble.couscous.ast.Operations.instanceOf;
import static org.zwobble.couscous.ast.Operations.not;
import static org.zwobble.couscous.ast.StaticReceiver.staticReceiver;
import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference;
@@ -109,6 +110,9 @@ public class JavaExpressionReader {
case ASTNode.INFIX_EXPRESSION:
return readInfixExpression((InfixExpression)expression);
+ case ASTNode.INSTANCEOF_EXPRESSION:
+ return readInstanceofExpression((InstanceofExpression)expression);
+
case ASTNode.PREFIX_EXPRESSION:
return readPrefixExpression((PrefixExpression)expression);
@@ -376,6 +380,12 @@ public class JavaExpressionReader {
return type.equals(Types.BOOLEAN) || type.equals(Types.INT);
}
+ private ExpressionNode readInstanceofExpression(InstanceofExpression expression) {
+ return instanceOf(
+ readExpressionWithoutBoxing(expression.getLeftOperand()),
+ (ScalarType)typeOf(expression.getRightOperand()));
+ }
+
private ExpressionNode readPrefixExpression(PrefixExpression expression) {
if (expression.getOperator() == PrefixExpression.Operator.NOT) {
return not(readExpression(Types.BOOLEAN, expression.getOperand()));
diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java
index 408c390..1a9414f 100644
--- a/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java
@@ -351,6 +351,12 @@ public class ExpressionReadingTests {
constructorCall(ScalarType.of("java.lang.Object"), emptyList()),
constructorCall(ScalarType.of("java.lang.Object"), emptyList()))),
readBooleanExpression("new Object() != new Object()"));
+
+ assertEquals(
+ instanceOf(
+ constructorCall(ScalarType.of("java.lang.Object"), emptyList()),
+ ScalarType.of("java.lang.Object")),
+ readBooleanExpression("new Object() instanceof Object"));
}
@Test