diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-10-29 20:48:15 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-10-29 20:48:15 +0000 |
| commit | ac6d1c7018ef715772f43a9ed6e4cef029b17302 (patch) | |
| tree | 90c5aa4f61c09432c7e63bde8e018a9160b8ed24 /src/main/java | |
| parent | 927ae58be68fcf2a541c1af2a7b27d845e97dea6 (diff) | |
Throw error if function definition is missing param type
Diffstat (limited to 'src/main/java')
5 files changed, 39 insertions, 1 deletions
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<UntypedTypeLevelExpressionNode> 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<UntypedTypeLevelExpressionNode> 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<UntypedParamNode> positional, List<UntypedParamNode> named, Source source ) implements UntypedNode { + public Iterable<UntypedParamNode> 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); + } +} |
