aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-10 11:00:22 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-10 11:01:18 +0100
commit74b2aa135e2bf1af1ef65476aa03406eaaddd2ab (patch)
treec558aa52c7735b52bda18eded51b325111f57aa3 /src/main/java
parent677a2627c238c511b33f7586f97197f5cf3ced5b (diff)
Add incomplete type checking for calls
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedArgsNode.java12
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedCallNode.java13
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedExpressionNode.java5
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedNamedArgNode.java10
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedNode.java7
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/StackCompiler.java3
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java29
7 files changed, 75 insertions, 4 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedArgsNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedArgsNode.java
new file mode 100644
index 00000000..473fa197
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedArgsNode.java
@@ -0,0 +1,12 @@
+package org.shedlang.compiler.ast.typed;
+
+import org.shedlang.compiler.sources.Source;
+
+import java.util.List;
+
+public record TypedArgsNode(
+ List<TypedExpressionNode> positional,
+ List<TypedNamedArgNode> named,
+ Source source
+) implements TypedNode {
+}
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedCallNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedCallNode.java
new file mode 100644
index 00000000..188436f4
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedCallNode.java
@@ -0,0 +1,13 @@
+package org.shedlang.compiler.ast.typed;
+
+import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.types.Type;
+
+public record TypedCallNode(
+ TypedExpressionNode receiver,
+ TypedArgsNode args,
+ boolean hasEffects,
+ Type type,
+ Source source
+) implements TypedExpressionNode {
+}
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedExpressionNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedExpressionNode.java
index 5ec6216b..0c61b3b2 100644
--- a/src/main/java/org/shedlang/compiler/ast/typed/TypedExpressionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedExpressionNode.java
@@ -1,9 +1,8 @@
package org.shedlang.compiler.ast.typed;
-import org.shedlang.compiler.sources.Source;
import org.shedlang.compiler.types.Type;
-public sealed interface TypedExpressionNode permits TypedBoolLiteralNode, TypedIntLiteralNode, TypedReferenceNode, TypedStringLiteralNode {
- Source source();
+public sealed interface TypedExpressionNode
+ permits TypedBoolLiteralNode, TypedCallNode, TypedIntLiteralNode, TypedReferenceNode, TypedStringLiteralNode {
Type type();
}
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedNamedArgNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedNamedArgNode.java
new file mode 100644
index 00000000..c29f3c04
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedNamedArgNode.java
@@ -0,0 +1,10 @@
+package org.shedlang.compiler.ast.typed;
+
+import org.shedlang.compiler.sources.Source;
+
+public record TypedNamedArgNode(
+ String name,
+ TypedExpressionNode expression,
+ Source source
+) implements TypedNode {
+}
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedNode.java
new file mode 100644
index 00000000..d38c6017
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedNode.java
@@ -0,0 +1,7 @@
+package org.shedlang.compiler.ast.typed;
+
+import org.shedlang.compiler.sources.Source;
+
+public interface TypedNode {
+ Source source();
+}
diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
index 8a268c4c..1d6b0a88 100644
--- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
+++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
@@ -18,6 +18,9 @@ public class StackCompiler {
case TypedBoolLiteralNode typedBoolLiteralNode ->
compileBoolLiteral(typedBoolLiteralNode);
+ case TypedCallNode typedCallNode ->
+ throw new UnsupportedOperationException("TODO");
+
case TypedIntLiteralNode typedIntLiteralNode ->
compileIntLiteral(typedIntLiteralNode);
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 73d3b9b6..850929c3 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -2,11 +2,22 @@ package org.shedlang.compiler.typechecker;
import org.shedlang.compiler.ast.typed.*;
import org.shedlang.compiler.ast.untyped.*;
+import org.shedlang.compiler.types.FunctionType;
+
+import java.util.List;
public class TypeChecker {
private TypeChecker() {
}
+ private static TypedArgsNode typeCheckArgs(UntypedArgsNode args, TypeCheckerContext context) {
+ var typedPositional = args.positional().stream()
+ .map(arg -> typeCheckExpression(arg, context))
+ .toList();
+
+ return new TypedArgsNode(typedPositional, List.of(), args.source());
+ }
+
public static TypedExpressionNode typeCheckBoolLiteral(
UntypedBoolLiteralNode untyped
) {
@@ -16,6 +27,22 @@ public class TypeChecker {
);
}
+ private static TypedExpressionNode typeCheckCall(
+ UntypedCallNode untyped,
+ TypeCheckerContext context
+ ) {
+ var typedReceiver = typeCheckExpression(untyped.receiver(), context);
+ var receiverType = (FunctionType) typedReceiver.type();
+
+ return new TypedCallNode(
+ typedReceiver,
+ typeCheckArgs(untyped.args(), context),
+ false,
+ receiverType.returnType(),
+ untyped.source()
+ );
+ }
+
public static TypedExpressionNode typeCheckExpression(
UntypedExpressionNode untyped,
TypeCheckerContext context
@@ -25,7 +52,7 @@ public class TypeChecker {
typeCheckBoolLiteral(untypedBoolLiteral);
case UntypedCallNode untypedCall ->
- throw new UnsupportedOperationException("TODO");
+ typeCheckCall(untypedCall, context);
case UntypedIntLiteralNode untypedIntLiteral ->
typeCheckIntLiteral(untypedIntLiteral);