aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-30 17:41:04 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-30 17:41:04 +0100
commita1806b32dc21709d81e2378923910b100145cf90 (patch)
tree4dbcfd48351cecd64d29712219ff516c204b9266 /src/main/java
parentce8dfcfecd0937fbf2f4d5b941517f3750f29af2 (diff)
Construct typed node for sum type definitions
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedSumTypeDefinitionNode.java3
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedSumTypeDefinitionNode.java15
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java7
3 files changed, 20 insertions, 5 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedSumTypeDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedSumTypeDefinitionNode.java
index 851e64e8..cb6b6418 100644
--- a/src/main/java/org/shedlang/compiler/ast/typed/TypedSumTypeDefinitionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedSumTypeDefinitionNode.java
@@ -1,9 +1,10 @@
package org.shedlang.compiler.ast.typed;
import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.types.SumType;
public record TypedSumTypeDefinitionNode(
- String name,
+ SumType type,
Source source
) implements TypedNamespaceStatementNode {
}
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 84f46711..e6900457 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedSumTypeDefinitionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedSumTypeDefinitionNode.java
@@ -1,7 +1,9 @@
package org.shedlang.compiler.ast.untyped;
+import org.pcollections.PVector;
import org.shedlang.compiler.sources.Source;
import org.shedlang.compiler.sources.Sources;
+import org.shedlang.compiler.util.P;
import java.util.List;
@@ -11,10 +13,13 @@ public record UntypedSumTypeDefinitionNode(
Source source
) implements UntypedNamespaceStatementNode {
public static Builder builder() {
- return new Builder("DefaultSumTypeName");
+ return new Builder("DefaultSumTypeName", P.vector());
}
- public record Builder(String name) {
+ public record Builder(
+ String name,
+ PVector<UntypedTypeLevelExpressionNode> variants
+ ) {
public UntypedSumTypeDefinitionNode build() {
return new UntypedSumTypeDefinitionNode(
name,
@@ -24,7 +29,11 @@ public record UntypedSumTypeDefinitionNode(
}
public Builder withName(String name) {
- return new Builder(name);
+ return new Builder(name, this.variants);
+ }
+
+ public Builder addVariant(UntypedTypeLevelExpressionNode variant) {
+ return new Builder(this.name, this.variants.plus(variant));
}
}
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index f754d0d0..e184e26b 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -926,7 +926,12 @@ public class TypeChecker {
@Override
public TypeCheckerResult<TypedNamespaceStatementNode> finish(TypeCheckerContext context) {
- return context.toResult(null);
+ var type = context.getLexicalState(SumType.class, untyped.name());
+
+ return context.toResult(new TypedSumTypeDefinitionNode(
+ type,
+ untyped.source()
+ ));
}
};
}