From 74b2aa135e2bf1af1ef65476aa03406eaaddd2ab Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 10 Jun 2023 11:00:22 +0100 Subject: Add incomplete type checking for calls --- .../shedlang/compiler/ast/typed/TypedArgsNode.java | 12 +++++++++ .../shedlang/compiler/ast/typed/TypedCallNode.java | 13 ++++++++++ .../compiler/ast/typed/TypedExpressionNode.java | 5 ++-- .../compiler/ast/typed/TypedNamedArgNode.java | 10 ++++++++ .../org/shedlang/compiler/ast/typed/TypedNode.java | 7 ++++++ .../shedlang/compiler/stackir/StackCompiler.java | 3 +++ .../shedlang/compiler/typechecker/TypeChecker.java | 29 +++++++++++++++++++++- 7 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/ast/typed/TypedArgsNode.java create mode 100644 src/main/java/org/shedlang/compiler/ast/typed/TypedCallNode.java create mode 100644 src/main/java/org/shedlang/compiler/ast/typed/TypedNamedArgNode.java create mode 100644 src/main/java/org/shedlang/compiler/ast/typed/TypedNode.java (limited to 'src/main/java') 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 positional, + List 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); -- cgit v1.2.3