From b019bf9cebdea64773836f74c5d7db7623d11b18 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 7 Jul 2023 18:55:57 +0100 Subject: Check operand types for binary operation --- .../shedlang/compiler/typechecker/TypeChecker.java | 38 +++++++++++++++------- .../errors/UnsupportedBinaryOperationError.java | 31 ++++++++++++++++++ 2 files changed, 57 insertions(+), 12 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/typechecker/errors/UnsupportedBinaryOperationError.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 89650a53..db7becc3 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -158,7 +158,12 @@ public class TypeChecker { var right = rightResult.value(); context = rightResult.context(); - var operator = typeCheckBinaryOperator(untyped.operator(), left.type(), right.type()); + var operator = typeCheckBinaryOperator( + untyped.operator(), + left.type(), + right.type(), + untyped.source() + ); return context.toResult(new TypedBinaryOperationNode( operator, @@ -168,20 +173,29 @@ public class TypeChecker { )); } - private static TypedBinaryOperator typeCheckBinaryOperator(UntypedBinaryOperator operator, Type left, Type right) { - return switch (operator) { - case ADD -> - TypedBinaryOperator.INT_ADD; + private static TypedBinaryOperator typeCheckBinaryOperator( + UntypedBinaryOperator operator, + Type left, + Type right, + Source source + ) { + if (left.equals(Types.INT) && right.equals(Types.INT)) { + return switch (operator) { + case ADD -> + TypedBinaryOperator.INT_ADD; - case EQUALS -> - TypedBinaryOperator.INT_EQUALS; + case EQUALS -> + TypedBinaryOperator.INT_EQUALS; - case NOT_EQUAL -> - TypedBinaryOperator.INT_NOT_EQUAL; + case NOT_EQUAL -> + TypedBinaryOperator.INT_NOT_EQUAL; - case SUB -> - TypedBinaryOperator.INT_SUB; - }; + case SUB -> + TypedBinaryOperator.INT_SUB; + }; + } else { + throw new UnsupportedBinaryOperationError(operator, left, right, source); + } } public static TypeCheckerResult typeCheckBoolLiteral( diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/UnsupportedBinaryOperationError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/UnsupportedBinaryOperationError.java new file mode 100644 index 00000000..fe826531 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/typechecker/errors/UnsupportedBinaryOperationError.java @@ -0,0 +1,31 @@ +package org.shedlang.compiler.typechecker.errors; + +import org.shedlang.compiler.ast.untyped.UntypedBinaryOperator; +import org.shedlang.compiler.errors.SourceError; +import org.shedlang.compiler.sources.Source; +import org.shedlang.compiler.types.Type; + +public class UnsupportedBinaryOperationError extends SourceError { + private final UntypedBinaryOperator operator; + private final Type left; + private final Type right; + + public UnsupportedBinaryOperationError(UntypedBinaryOperator operator, Type left, Type right, Source source) { + super("Unsupported binary operation: " + operator + " " + left + " " + right, source); + this.operator = operator; + this.left = left; + this.right = right; + } + + public UntypedBinaryOperator operator() { + return operator; + } + + public Type left() { + return left; + } + + public Type right() { + return right; + } +} -- cgit v1.2.3