diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-10-29 20:30:37 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-10-29 20:34:57 +0000 |
| commit | 1353fdb3257c2a6c249b4bb11b0f13f382c22459 (patch) | |
| tree | cf0eebf348f72cfa4c1f6b3a505d22057fd388ef /src/main/java | |
| parent | 7d1b7f9ac8dbba1ab00a5f712c1f0049215f0e85 (diff) | |
Add separate type for named params in function type
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNamedParamNode.java | 10 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNode.java | 8 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeParamsNode.java (renamed from src/main/java/org/shedlang/compiler/ast/untyped/UntypedParamTypesNode.java) | 4 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/parser/Parser.java | 8 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 14 |
5 files changed, 33 insertions, 11 deletions
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<UntypedTypeLevelExpressionNode> effect, UntypedTypeLevelExpressionNode returnType, Source source @@ -24,13 +24,13 @@ public record UntypedFunctionTypeNode( public record Builder( PVector<UntypedTypeLevelExpressionNode> positionalParams, - PVector<UntypedParamNode> namedParams, + PVector<UntypedFunctionTypeNamedParamNode> namedParams, Optional<UntypedTypeLevelExpressionNode> 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/UntypedParamTypesNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeParamsNode.java index 60fa66c3..4452bfb9 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedParamTypesNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeParamsNode.java @@ -4,9 +4,9 @@ import org.shedlang.compiler.sources.Source; import java.util.List; -public record UntypedParamTypesNode( +public record UntypedFunctionTypeParamsNode( List<UntypedTypeLevelExpressionNode> positional, - List<UntypedParamNode> named, + List<UntypedFunctionTypeNamedParamNode> 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<TokenType> tokens) { + private static UntypedFunctionTypeParamsNode parseParamTypes(TokenIterator<TokenType> tokens) { var paramsStart = tokens.position(); var positional = new ArrayList<UntypedTypeLevelExpressionNode>(); - var named = new ArrayList<UntypedParamNode>(); + var named = new ArrayList<UntypedFunctionTypeNamedParamNode>(); 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<TokenType> 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<? extends TypedExpressionNode> typeCheckIf( UntypedIfNode untyped, TypeCheckerContext context |
