aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-29 20:42:56 +0000
committerMichael Williamson <mike@zwobble.org>2023-10-29 20:42:56 +0000
commit927ae58be68fcf2a541c1af2a7b27d845e97dea6 (patch)
tree8497dc99343923037f331a129752321ef8a191c0 /src/main/java
parente7e76ee0917f7f77966af69a7bca68ba37e4252e (diff)
Parse params without types
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionSignatureNode.java6
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedParamNode.java4
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java13
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java3
4 files changed, 17 insertions, 9 deletions
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 dea78312..4920e253 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionSignatureNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionSignatureNode.java
@@ -40,8 +40,9 @@ public record UntypedFunctionSignatureNode(
}
public Builder addPositionalParam(String name, UntypedTypeLevelExpressionNode type) {
+ var paramNode = new UntypedParamNode(name, Optional.of(type), Sources.NULL);
return new Builder(
- this.positionalParams.plus(new UntypedParamNode(name, type, Sources.NULL)),
+ this.positionalParams.plus(paramNode),
this.namedParams,
this.effect,
this.returnType,
@@ -50,9 +51,10 @@ public record UntypedFunctionSignatureNode(
}
public Builder addNamedParam(String name, UntypedTypeLevelExpressionNode type) {
+ var paramNode = new UntypedParamNode(name, Optional.of(type), Sources.NULL);
return new Builder(
this.positionalParams,
- this.namedParams.plus(new UntypedParamNode(name, type, Sources.NULL)),
+ this.namedParams.plus(paramNode),
this.effect,
this.returnType,
this.body
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedParamNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedParamNode.java
index 323d9333..366de81c 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedParamNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedParamNode.java
@@ -2,9 +2,11 @@ package org.shedlang.compiler.ast.untyped;
import org.shedlang.compiler.sources.Source;
+import java.util.Optional;
+
public record UntypedParamNode(
String name,
- UntypedTypeLevelExpressionNode type,
+ Optional<UntypedTypeLevelExpressionNode> type,
Source source
) implements UntypedNode {
}
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index a0edcd9b..cf01705d 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -640,15 +640,18 @@ public class Parser {
var isNamed = tokens.trySkip(TokenType.SYMBOL_DOT);
var name = tokens.nextValue(TokenType.IDENTIFIER);
- tokens.skip(TokenType.SYMBOL_COLON);
- var type = parseTopLevelTypeLevelExpression(tokens);
- if (!isNamed && !named.isEmpty()) {
- throw new PositionalParamAfterNamedParamError(type.source());
- }
+
+ var type = tokens.trySkip(TokenType.SYMBOL_COLON)
+ ? Optional.of(parseTopLevelTypeLevelExpression(tokens))
+ : Optional.<UntypedTypeLevelExpressionNode>empty();
var paramEnd = tokens.position();
var paramSource = paramStart.to(paramEnd);
+ if (!isNamed && !named.isEmpty()) {
+ throw new PositionalParamAfterNamedParamError(paramSource);
+ }
+
(isNamed ? named : positional).add(new UntypedParamNode(name, type, paramSource));
return null;
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index ee50f13d..db25ac3b 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -1047,7 +1047,8 @@ public class TypeChecker {
) {
return new TypedParamNode(
untyped.name(),
- typeCheckTypeLevelExpression(TypeSets.META_TYPE, untyped.type(), context),
+ // TODO: handle param without type
+ typeCheckTypeLevelExpression(TypeSets.META_TYPE, untyped.type().orElseThrow(), context),
untyped.source()
);
}