diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-28 10:25:04 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-28 10:25:04 +0100 |
| commit | 34b02197132f215f651bb3ee3d54b16cc2fc0836 (patch) | |
| tree | 6a0b88df70893932e2119c4ba78ba706ac720201 /src/main/java | |
| parent | 4e34463f83f7ca08070565351df06eb06f67be94 (diff) | |
Type check struct definition fields
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java | 7 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 12 |
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() )); } |
