aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-07 18:55:57 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-07 18:55:57 +0100
commitb019bf9cebdea64773836f74c5d7db7623d11b18 (patch)
treef64c3e0b51bd1998174d50cb1f1c9fd275efe19e /src/main/java
parentf0dd2aad3b947c447166b86481955a99e3baf86d (diff)
Check operand types for binary operation
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java38
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/errors/UnsupportedBinaryOperationError.java31
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;
+ }
+}