aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-29 20:48:15 +0000
committerMichael Williamson <mike@zwobble.org>2023-10-29 20:48:15 +0000
commitac6d1c7018ef715772f43a9ed6e4cef029b17302 (patch)
tree90c5aa4f61c09432c7e63bde8e018a9160b8ed24 /src/main/java
parent927ae58be68fcf2a541c1af2a7b27d845e97dea6 (diff)
Throw error if function definition is missing param type
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java9
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionSignatureNode.java9
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedParamsNode.java6
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java6
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/errors/FunctionSignatureMissingParamTypeError.java10
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);
+ }
+}