diff options
Diffstat (limited to 'src/main')
3 files changed, 18 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())); |
