aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-28 10:25:04 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-28 10:25:04 +0100
commit34b02197132f215f651bb3ee3d54b16cc2fc0836 (patch)
tree6a0b88df70893932e2119c4ba78ba706ac720201 /src/main/java
parent4e34463f83f7ca08070565351df06eb06f67be94 (diff)
Type check struct definition fields
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java7
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java12
2 files changed, 18 insertions, 1 deletions
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 210c29ee..706265ba 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java
@@ -34,5 +34,12 @@ public record UntypedStructDefinitionNode(
this.fields
);
}
+
+ public Builder addField(UntypedStructFieldDefinitionNode field) {
+ return new Builder(
+ this.name,
+ this.fields.plus(field)
+ );
+ }
}
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 5af83d5f..1681ac25 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -787,9 +787,19 @@ public class TypeChecker {
return new TypeCheckSteps<TypedStructDefinitionNode>() {
@Override
public TypeCheckerResult<TypedStructDefinitionNode> define(TypeCheckerContext context) {
+ var fieldsResult = context.mapWithContext(untyped.fields(), (untypedField, fieldContext) -> {
+ return fieldContext.toResult(new TypedStructFieldDefinitionNode(
+ untypedField.name(),
+ typeCheckTypeLevelExpression(TypeSets.META_TYPE, untypedField.type(), fieldContext),
+ untypedField.source()
+ ));
+ });
+ var fields = fieldsResult.value();
+ context = fieldsResult.context();
+
return context.toResult(new TypedStructDefinitionNode(
untyped.name(),
- List.of(),
+ fields,
untyped.source()
));
}