From 34b02197132f215f651bb3ee3d54b16cc2fc0836 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 28 Sep 2023 10:25:04 +0100 Subject: Type check struct definition fields --- .../compiler/ast/untyped/UntypedStructDefinitionNode.java | 7 +++++++ .../java/org/shedlang/compiler/typechecker/TypeChecker.java | 12 +++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) (limited to 'src/main/java') 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() { @Override public TypeCheckerResult 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() )); } -- cgit v1.2.3