From 1353fdb3257c2a6c249b4bb11b0f13f382c22459 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 29 Oct 2023 20:30:37 +0000 Subject: Add separate type for named params in function type --- .../ast/untyped/UntypedFunctionTypeNamedParamNode.java | 10 ++++++++++ .../compiler/ast/untyped/UntypedFunctionTypeNode.java | 8 ++++---- .../ast/untyped/UntypedFunctionTypeParamsNode.java | 12 ++++++++++++ .../compiler/ast/untyped/UntypedParamTypesNode.java | 12 ------------ src/main/java/org/shedlang/compiler/parser/Parser.java | 8 ++++---- .../org/shedlang/compiler/typechecker/TypeChecker.java | 14 +++++++++++++- 6 files changed, 43 insertions(+), 21 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNamedParamNode.java create mode 100644 src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeParamsNode.java delete mode 100644 src/main/java/org/shedlang/compiler/ast/untyped/UntypedParamTypesNode.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNamedParamNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNamedParamNode.java new file mode 100644 index 00000000..d74ce4a7 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNamedParamNode.java @@ -0,0 +1,10 @@ +package org.shedlang.compiler.ast.untyped; + +import org.shedlang.compiler.sources.Source; + +public record UntypedFunctionTypeNamedParamNode( + String name, + UntypedTypeLevelExpressionNode type, + Source source +) implements UntypedNode { +} diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNode.java index fd47c7bf..b4a465b3 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNode.java @@ -8,7 +8,7 @@ import org.shedlang.compiler.util.P; import java.util.Optional; public record UntypedFunctionTypeNode( - UntypedParamTypesNode params, + UntypedFunctionTypeParamsNode params, Optional effect, UntypedTypeLevelExpressionNode returnType, Source source @@ -24,13 +24,13 @@ public record UntypedFunctionTypeNode( public record Builder( PVector positionalParams, - PVector namedParams, + PVector namedParams, Optional effect, UntypedTypeLevelExpressionNode returnType ) { public UntypedFunctionTypeNode build() { return new UntypedFunctionTypeNode( - new UntypedParamTypesNode(this.positionalParams, this.namedParams, Sources.NULL), + new UntypedFunctionTypeParamsNode(this.positionalParams, this.namedParams, Sources.NULL), this.effect, this.returnType, Sources.NULL @@ -49,7 +49,7 @@ public record UntypedFunctionTypeNode( public Builder addNamedParam(String name, UntypedTypeLevelExpressionNode type) { return new Builder( this.positionalParams, - this.namedParams.plus(new UntypedParamNode(name, type, Sources.NULL)), + this.namedParams.plus(new UntypedFunctionTypeNamedParamNode(name, type, Sources.NULL)), this.effect, this.returnType ); diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeParamsNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeParamsNode.java new file mode 100644 index 00000000..4452bfb9 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeParamsNode.java @@ -0,0 +1,12 @@ +package org.shedlang.compiler.ast.untyped; + +import org.shedlang.compiler.sources.Source; + +import java.util.List; + +public record UntypedFunctionTypeParamsNode( + List positional, + List named, + Source source +) implements UntypedNode { +} diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedParamTypesNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedParamTypesNode.java deleted file mode 100644 index 60fa66c3..00000000 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedParamTypesNode.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.shedlang.compiler.ast.untyped; - -import org.shedlang.compiler.sources.Source; - -import java.util.List; - -public record UntypedParamTypesNode( - List positional, - List named, - 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 6cb1b134..a0edcd9b 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -662,11 +662,11 @@ public class Parser { return new UntypedParamsNode(positional, named, paramsSource); } - private static UntypedParamTypesNode parseParamTypes(TokenIterator tokens) { + private static UntypedFunctionTypeParamsNode parseParamTypes(TokenIterator tokens) { var paramsStart = tokens.position(); var positional = new ArrayList(); - var named = new ArrayList(); + var named = new ArrayList(); parseMany( () -> tokens.isNext(TokenType.SYMBOL_PAREN_CLOSE), @@ -683,7 +683,7 @@ public class Parser { var paramEnd = tokens.position(); var paramSource = paramStart.to(paramEnd); - named.add(new UntypedParamNode(name, type, paramSource)); + named.add(new UntypedFunctionTypeNamedParamNode(name, type, paramSource)); } else { var type = parseTopLevelTypeLevelExpression(tokens); if (!named.isEmpty()) { @@ -701,7 +701,7 @@ public class Parser { var paramsEnd = tokens.position(); var paramsSource = paramsStart.to(paramsEnd); - return new UntypedParamTypesNode(positional, named, paramsSource); + return new UntypedFunctionTypeParamsNode(positional, named, paramsSource); } private static UntypedExpressionNode parsePrimaryExpression(TokenIterator tokens) { diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 17cf42a3..ee50f13d 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -781,7 +781,7 @@ public class TypeChecker { var namedParams = untyped.params().named().stream() .map(param -> { - var typedParamNode = typeCheckParam(param, context); + var typedParamNode = typeCheckFunctionTypeNamedParam(param, context); return new NamedParam(typedParamNode.name(), typedParamNode.type().value()); }) .toList(); @@ -821,6 +821,18 @@ public class TypeChecker { ); } + private static TypedParamNode typeCheckFunctionTypeNamedParam( + UntypedFunctionTypeNamedParamNode untyped, + TypeCheckerContext context + ) { + return new TypedParamNode( + untyped.name(), + typeCheckTypeLevelExpression(TypeSets.META_TYPE, untyped.type(), context), + untyped.source() + ); + } + + private static TypeCheckerResult typeCheckIf( UntypedIfNode untyped, TypeCheckerContext context -- cgit v1.2.3