aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-29 20:30:37 +0000
committerMichael Williamson <mike@zwobble.org>2023-10-29 20:34:57 +0000
commit1353fdb3257c2a6c249b4bb11b0f13f382c22459 (patch)
treecf0eebf348f72cfa4c1f6b3a505d22057fd388ef /src/main/java
parent7d1b7f9ac8dbba1ab00a5f712c1f0049215f0e85 (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.java10
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNode.java8
-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.java8
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java14
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