diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-10 11:00:22 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-10 11:01:18 +0100 |
| commit | 74b2aa135e2bf1af1ef65476aa03406eaaddd2ab (patch) | |
| tree | c558aa52c7735b52bda18eded51b325111f57aa3 /src/main/java | |
| parent | 677a2627c238c511b33f7586f97197f5cf3ced5b (diff) | |
Add incomplete type checking for calls
Diffstat (limited to 'src/main/java')
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); |
