diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-07 18:55:57 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-07 18:55:57 +0100 |
| commit | b019bf9cebdea64773836f74c5d7db7623d11b18 (patch) | |
| tree | f64c3e0b51bd1998174d50cb1f1c9fd275efe19e /src/main/java | |
| parent | f0dd2aad3b947c447166b86481955a99e3baf86d (diff) | |
Check operand types for binary operation
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 38 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/errors/UnsupportedBinaryOperationError.java | 31 |
2 files changed, 57 insertions, 12 deletions
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<TypedExpressionNode> 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; + } +} |
