From 7bbb27312bf0d28bc0230f0a1e58354e8feef13d Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 24 Apr 2026 13:15:25 +0100 Subject: Add typed AST for struct definitions --- .../compiler/ast/typed/TypedNamespaceStatementNode.java | 4 ++++ .../compiler/ast/typed/TypedStructDefinitionNode.java | 13 +++++++++++++ .../compiler/ast/typed/TypedStructFieldDefinitionNode.java | 11 +++++++++++ .../org/zwobble/hobgoblin/compiler/types/StructType.java | 8 ++++++++ .../java/org/zwobble/hobgoblin/compiler/types/Type.java | 2 +- 5 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedNamespaceStatementNode.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedStructDefinitionNode.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedStructFieldDefinitionNode.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/types/StructType.java (limited to 'src/main/java') diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedNamespaceStatementNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedNamespaceStatementNode.java new file mode 100644 index 0000000..79dc0bb --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedNamespaceStatementNode.java @@ -0,0 +1,4 @@ +package org.zwobble.hobgoblin.compiler.ast.typed; + +public sealed interface TypedNamespaceStatementNode extends TypedNode permits TypedStructDefinitionNode { +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedStructDefinitionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedStructDefinitionNode.java new file mode 100644 index 0000000..0f966ab --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedStructDefinitionNode.java @@ -0,0 +1,13 @@ +package org.zwobble.hobgoblin.compiler.ast.typed; + +import org.zwobble.hobgoblin.compiler.sources.Source; +import org.zwobble.hobgoblin.compiler.types.StructType; + +import java.util.List; + +public record TypedStructDefinitionNode( + StructType type, + List fields, + Source source +) implements TypedNamespaceStatementNode { +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedStructFieldDefinitionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedStructFieldDefinitionNode.java new file mode 100644 index 0000000..739ea63 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedStructFieldDefinitionNode.java @@ -0,0 +1,11 @@ +package org.zwobble.hobgoblin.compiler.ast.typed; + +import org.zwobble.hobgoblin.compiler.sources.Source; +import org.zwobble.hobgoblin.compiler.types.Type; + +public record TypedStructFieldDefinitionNode( + String name, + TypedTypeLevelExpressionNode type, + Source source +) implements TypedNode { +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/StructType.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/StructType.java new file mode 100644 index 0000000..a5b50ab --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/StructType.java @@ -0,0 +1,8 @@ +package org.zwobble.hobgoblin.compiler.types; + +public record StructType(NamespaceName namespaceName, String name) implements Type { + @Override + public String describe() { + return namespaceName.toString() + "." + name; + } +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/Type.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/Type.java index 2692261..f7b6833 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/types/Type.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/Type.java @@ -1,4 +1,4 @@ package org.zwobble.hobgoblin.compiler.types; -public sealed interface Type extends TypeLevelValue permits ScalarType, TypeLevelValueType { +public sealed interface Type extends TypeLevelValue permits ScalarType, StructType, TypeLevelValueType { } -- cgit v1.2.3