aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-07 18:43:53 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-07 18:43:53 +0100
commit98e60278cd3e2dfffc4f5202de45518714d9402c (patch)
tree5fd48799b6a45ee29d0dcb684432d90763cd4021 /src/main/java
parent616f475a4cf4c3296028c1fe89e17e0105898f3c (diff)
Type check integer addition
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedBinaryOperationNode.java11
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedBinaryOperator.java5
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java23
4 files changed, 40 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBinaryOperationNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBinaryOperationNode.java
new file mode 100644
index 00000000..c9ac56ad
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBinaryOperationNode.java
@@ -0,0 +1,11 @@
+package org.shedlang.compiler.ast.untyped;
+
+import org.shedlang.compiler.sources.Source;
+
+public record UntypedBinaryOperationNode(
+ UntypedBinaryOperator operator,
+ UntypedExpressionNode left,
+ UntypedExpressionNode right,
+ Source source
+) implements UntypedExpressionNode {
+}
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBinaryOperator.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBinaryOperator.java
new file mode 100644
index 00000000..0a14b547
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBinaryOperator.java
@@ -0,0 +1,5 @@
+package org.shedlang.compiler.ast.untyped;
+
+public enum UntypedBinaryOperator {
+ ADD
+}
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java
index 10f3f010..cabf5876 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java
@@ -1,5 +1,5 @@
package org.shedlang.compiler.ast.untyped;
public sealed interface UntypedExpressionNode extends UntypedNode
- permits UntypedBoolLiteralNode, UntypedCallNode, UntypedIntLiteralNode, UntypedReferenceNode, UntypedStringLiteralNode {
+ permits UntypedBinaryOperationNode, UntypedBoolLiteralNode, UntypedCallNode, UntypedIntLiteralNode, UntypedReferenceNode, UntypedStringLiteralNode {
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 9aca796e..d3d0ef81 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -146,6 +146,26 @@ public class TypeChecker {
return context.toResult(new TypedArgsNode(typedPositionalArgs, typedNamedArgs, args.source()));
}
+ private static TypeCheckerResult<TypedExpressionNode> typeCheckBinaryOperation(
+ UntypedBinaryOperationNode untyped,
+ TypeCheckerContext context
+ ) {
+ var leftResult = typeCheckExpression(untyped.left(), context);
+ var left = leftResult.value();
+ context = leftResult.context();
+
+ var rightResult = typeCheckExpression(untyped.right(), context);
+ var right = rightResult.value();
+ context = rightResult.context();
+
+ return context.toResult(new TypedBinaryOperationNode(
+ TypedBinaryOperator.INT_ADD,
+ left,
+ right,
+ untyped.source()
+ ));
+ }
+
public static TypeCheckerResult<TypedExpressionNode> typeCheckBoolLiteral(
UntypedBoolLiteralNode untyped,
TypeCheckerContext context
@@ -215,6 +235,9 @@ public class TypeChecker {
TypeCheckerContext context
) {
return switch (untyped) {
+ case UntypedBinaryOperationNode untypedBinaryOperation ->
+ typeCheckBinaryOperation(untypedBinaryOperation, context);
+
case UntypedBoolLiteralNode untypedBoolLiteral ->
typeCheckBoolLiteral(untypedBoolLiteral, context);