From 4e34463f83f7ca08070565351df06eb06f67be94 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 28 Sep 2023 10:13:17 +0100 Subject: Add basic type checking for struct definitions --- .../ast/typed/TypedNamespaceStatementNode.java | 2 +- .../ast/typed/TypedStructDefinitionNode.java | 12 ++++++++++ .../ast/typed/TypedStructFieldDefinitionNode.java | 11 +++++++++ .../ast/untyped/UntypedStructDefinitionNode.java | 26 ++++++++++++++++++++++ .../shedlang/compiler/typechecker/TypeChecker.java | 17 +++++++++++++- 5 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/ast/typed/TypedStructDefinitionNode.java create mode 100644 src/main/java/org/shedlang/compiler/ast/typed/TypedStructFieldDefinitionNode.java (limited to 'src/main/java') 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 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, + 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 fields, Source source ) implements UntypedNamespaceStatementNode { + public static Builder builder() { + return new Builder("X", P.vector()); + } + + public record Builder( + String name, + PVector 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 typeCheckStepsStructDefinition( + UntypedStructDefinitionNode untyped + ) { + return new TypeCheckSteps() { + @Override + public TypeCheckerResult define(TypeCheckerContext context) { + return context.toResult(new TypedStructDefinitionNode( + untyped.name(), + List.of(), + untyped.source() + )); + } + }; + } + @SuppressWarnings("unchecked") static TypedTypeLevelExpressionNode typeCheckTypeLevelExpression( TypeSetTypeLevelValue valueType, -- cgit v1.2.3