aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-28 10:13:17 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-28 10:13:17 +0100
commit4e34463f83f7ca08070565351df06eb06f67be94 (patch)
treecbbd43b41e1e2b5a04f7217fd6edf1f3a4aa8a26 /src/main/java
parentbc0bbc8fa0d48c1c87244e45908290c4b723d757 (diff)
Add basic type checking for struct definitions
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedNamespaceStatementNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedStructDefinitionNode.java12
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedStructFieldDefinitionNode.java11
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java26
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java17
5 files changed, 66 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedNamespaceStatementNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedNamespaceStatementNode.java
index f2186711..9a5e766a 100644
--- a/src/main/java/org/shedlang/compiler/ast/typed/TypedNamespaceStatementNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedNamespaceStatementNode.java
@@ -1,4 +1,4 @@
package org.shedlang.compiler.ast.typed;
-public sealed interface TypedNamespaceStatementNode extends TypedNode permits TypedAssignNode, TypedFunctionDefinitionNode {
+public sealed interface TypedNamespaceStatementNode extends TypedNode permits TypedAssignNode, TypedFunctionDefinitionNode, TypedStructDefinitionNode {
}
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedStructDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedStructDefinitionNode.java
new file mode 100644
index 00000000..4a956ee3
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedStructDefinitionNode.java
@@ -0,0 +1,12 @@
+package org.shedlang.compiler.ast.typed;
+
+import org.shedlang.compiler.sources.Source;
+
+import java.util.List;
+
+public record TypedStructDefinitionNode(
+ String name,
+ List<TypedStructFieldDefinitionNode> fields,
+ Source source
+) implements TypedNamespaceStatementNode {
+}
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedStructFieldDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedStructFieldDefinitionNode.java
new file mode 100644
index 00000000..a84517a0
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedStructFieldDefinitionNode.java
@@ -0,0 +1,11 @@
+package org.shedlang.compiler.ast.typed;
+
+import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.types.Type;
+
+public record TypedStructFieldDefinitionNode(
+ String name,
+ TypedTypeLevelExpressionNode<Type> type,
+ Source source
+) implements TypedNode {
+}
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java
index 49490b8d..210c29ee 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java
@@ -1,6 +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;
@@ -9,4 +12,27 @@ public record UntypedStructDefinitionNode(
List<UntypedStructFieldDefinitionNode> fields,
Source source
) implements UntypedNamespaceStatementNode {
+ public static Builder builder() {
+ return new Builder("X", P.vector());
+ }
+
+ public record Builder(
+ String name,
+ PVector<UntypedStructFieldDefinitionNode> fields
+ ) {
+ public UntypedStructDefinitionNode build() {
+ return new UntypedStructDefinitionNode(
+ this.name,
+ this.fields,
+ Sources.NULL
+ );
+ }
+
+ public Builder withName(String name) {
+ return new Builder(
+ name,
+ this.fields
+ );
+ }
+ }
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 930efd85..5af83d5f 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -728,7 +728,7 @@ public class TypeChecker {
typeCheckStepsFunctionDefinition(functionDefinition);
case UntypedStructDefinitionNode structDefinition ->
- throw new UnsupportedOperationException("TODO");
+ typeCheckStepsStructDefinition(structDefinition);
};
}
@@ -781,6 +781,21 @@ public class TypeChecker {
));
}
+ private static TypeCheckSteps<TypedStructDefinitionNode> typeCheckStepsStructDefinition(
+ UntypedStructDefinitionNode untyped
+ ) {
+ return new TypeCheckSteps<TypedStructDefinitionNode>() {
+ @Override
+ public TypeCheckerResult<TypedStructDefinitionNode> define(TypeCheckerContext context) {
+ return context.toResult(new TypedStructDefinitionNode(
+ untyped.name(),
+ List.of(),
+ untyped.source()
+ ));
+ }
+ };
+ }
+
@SuppressWarnings("unchecked")
static <T extends TypeLevelValue> TypedTypeLevelExpressionNode<T> typeCheckTypeLevelExpression(
TypeSetTypeLevelValue<T> valueType,