From 927ae58be68fcf2a541c1af2a7b27d845e97dea6 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 29 Oct 2023 20:42:56 +0000 Subject: Parse params without types --- .../compiler/ast/untyped/UntypedFunctionSignatureNode.java | 6 ++++-- .../org/shedlang/compiler/ast/untyped/UntypedParamNode.java | 4 +++- src/main/java/org/shedlang/compiler/parser/Parser.java | 13 ++++++++----- .../java/org/shedlang/compiler/typechecker/TypeChecker.java | 3 ++- 4 files changed, 17 insertions(+), 9 deletions(-) (limited to 'src/main/java') 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 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.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() ); } -- cgit v1.2.3