aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-23 11:50:33 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-23 11:50:33 +0000
commita7c33eef7d2598d5636ff5bcde07da4f9c057184 (patch)
tree43fd9d2e37c9a4b2e8ebc45ab0ba998aca2b62b1 /src/main/java
parent924ae7e0ebfd2abaf320a2ad4f3441e5034ffb91 (diff)
Parse type level params for sum types
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedSumTypeDefinitionNode.java13
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java10
2 files changed, 21 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedSumTypeDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedSumTypeDefinitionNode.java
index a478e588..d727b98e 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedSumTypeDefinitionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedSumTypeDefinitionNode.java
@@ -7,26 +7,35 @@ import org.shedlang.compiler.types.Visibility;
import org.shedlang.compiler.util.P;
import java.util.List;
+import java.util.Optional;
public record UntypedSumTypeDefinitionNode(
String name,
Visibility visibility,
+ Optional<List<UntypedTypeLevelParamNode>> typeLevelParams,
List<UntypedTypeLevelExpressionNode> variants,
Source source
) implements UntypedNamespaceStatementNode, UntypedVariableDeclarationNode {
public static Builder builder() {
- return new Builder("DefaultSumTypeName", Visibility.PRIVATE, P.vector());
+ return new Builder(
+ "DefaultSumTypeName",
+ Visibility.PRIVATE,
+ Optional.empty(),
+ P.vector()
+ );
}
public record Builder(
String name,
Visibility visibility,
+ Optional<List<UntypedTypeLevelParamNode>> typeLevelParams,
PVector<UntypedTypeLevelExpressionNode> variants
) {
public UntypedSumTypeDefinitionNode build() {
return new UntypedSumTypeDefinitionNode(
this.name,
this.visibility,
+ this.typeLevelParams,
this.variants,
Sources.NULL
);
@@ -36,6 +45,7 @@ public record UntypedSumTypeDefinitionNode(
return new Builder(
name,
this.visibility,
+ this.typeLevelParams,
this.variants
);
}
@@ -44,6 +54,7 @@ public record UntypedSumTypeDefinitionNode(
return new Builder(
this.name,
this.visibility,
+ this.typeLevelParams,
this.variants.plus(variant)
);
}
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index 9fb8a93b..753a6d75 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -968,6 +968,8 @@ public class Parser {
var name = tokens.nextValue(TokenType.IDENTIFIER);
+ var typeLevelParams = parseTypeLevelParamsOptional(tokens);
+
tokens.skip(TokenType.SYMBOL_EQUALS);
var variants = parseOneOrMoreNoTrailingSeparator(
@@ -980,7 +982,13 @@ public class Parser {
var end = tokens.position();
var source = start.to(end);
- return new UntypedSumTypeDefinitionNode(name, visibility, variants, source);
+ return new UntypedSumTypeDefinitionNode(
+ name,
+ visibility,
+ typeLevelParams,
+ variants,
+ source
+ );
}
static UntypedExpressionNode parseTopLevelExpression(TokenIterator<TokenType> tokens) {