From ac6d1c7018ef715772f43a9ed6e4cef029b17302 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 29 Oct 2023 20:48:15 +0000 Subject: Throw error if function definition is missing param type --- .../compiler/ast/untyped/UntypedFunctionDefinitionNode.java | 9 +++++++++ .../compiler/ast/untyped/UntypedFunctionSignatureNode.java | 9 ++++++++- .../org/shedlang/compiler/ast/untyped/UntypedParamsNode.java | 6 ++++++ .../java/org/shedlang/compiler/typechecker/TypeChecker.java | 6 ++++++ .../errors/FunctionSignatureMissingParamTypeError.java | 10 ++++++++++ 5 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/shedlang/compiler/typechecker/errors/FunctionSignatureMissingParamTypeError.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java index 769861a0..4d23f1c7 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java @@ -6,6 +6,8 @@ import org.shedlang.compiler.sources.Source; import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.types.Visibility; +import java.util.Optional; + public record UntypedFunctionDefinitionNode( String name, Visibility visibility, @@ -48,6 +50,13 @@ public record UntypedFunctionDefinitionNode( } public Builder addPositionalParam(String name, UntypedTypeLevelExpressionNode type) { + return addPositionalParam(name, Optional.of(type)); + } + + public Builder addPositionalParam( + String name, + Optional type + ) { return new Builder( this.name, this.visibility, diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionSignatureNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionSignatureNode.java index 4920e253..d15c699d 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionSignatureNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionSignatureNode.java @@ -40,7 +40,14 @@ public record UntypedFunctionSignatureNode( } public Builder addPositionalParam(String name, UntypedTypeLevelExpressionNode type) { - var paramNode = new UntypedParamNode(name, Optional.of(type), Sources.NULL); + return addPositionalParam(name, Optional.of(type)); + } + + public Builder addPositionalParam( + String name, + Optional type + ) { + var paramNode = new UntypedParamNode(name, type, Sources.NULL); return new Builder( this.positionalParams.plus(paramNode), this.namedParams, diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedParamsNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedParamsNode.java index ced67544..4f964402 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedParamsNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedParamsNode.java @@ -3,10 +3,16 @@ package org.shedlang.compiler.ast.untyped; import org.shedlang.compiler.sources.Source; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; public record UntypedParamsNode( List positional, List named, Source source ) implements UntypedNode { + public Iterable all() { + return Stream.concat(positional.stream(), named.stream()) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index db25ac3b..257aaa18 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -577,6 +577,12 @@ public class TypeChecker { UntypedFunctionDefinitionNode untyped, TypeCheckerContext context ) { + for (var param : untyped.signature().params().all()) { + if (param.type().isEmpty()) { + throw new FunctionSignatureMissingParamTypeError(param.source()); + } + } + var typedSignature = typeCheckFunctionSignature(untyped.signature(), context); var type = new FunctionType( diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/FunctionSignatureMissingParamTypeError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/FunctionSignatureMissingParamTypeError.java new file mode 100644 index 00000000..9aef71ec --- /dev/null +++ b/src/main/java/org/shedlang/compiler/typechecker/errors/FunctionSignatureMissingParamTypeError.java @@ -0,0 +1,10 @@ +package org.shedlang.compiler.typechecker.errors; + +import org.shedlang.compiler.errors.SourceError; +import org.shedlang.compiler.sources.Source; + +public class FunctionSignatureMissingParamTypeError extends SourceError { + public FunctionSignatureMissingParamTypeError(Source source) { + super("Param is missing param type", source); + } +} -- cgit v1.2.3