From cb95e58307d8e7f5ba7e0a69ee15301bc1e373ee Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 20 Apr 2026 13:55:18 +0100 Subject: Add source to nodes --- .../hobgoblin/ast/untyped/UntypedNamespaceNode.java | 7 ++++++- .../ast/untyped/UntypedNamespaceStatementNode.java | 2 +- .../org/zwobble/hobgoblin/ast/untyped/UntypedNode.java | 7 +++++++ .../ast/untyped/UntypedStructDefinitionNode.java | 9 +++++++++ src/main/java/org/zwobble/hobgoblin/parser/Parser.java | 18 +++++++++++++++++- .../org/zwobble/hobgoblin/parser/TokenIterator.java | 14 ++++++++++++++ .../zwobble/hobgoblin/sources/FileFragmentSource.java | 10 ++++++++++ .../java/org/zwobble/hobgoblin/sources/NullSource.java | 13 +++++++++++++ .../org/zwobble/hobgoblin/sources/RuntimeSource.java | 13 +++++++++++++ .../java/org/zwobble/hobgoblin/sources/Source.java | 5 +++++ 10 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedNode.java create mode 100644 src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedStructDefinitionNode.java create mode 100644 src/main/java/org/zwobble/hobgoblin/sources/FileFragmentSource.java create mode 100644 src/main/java/org/zwobble/hobgoblin/sources/NullSource.java create mode 100644 src/main/java/org/zwobble/hobgoblin/sources/RuntimeSource.java create mode 100644 src/main/java/org/zwobble/hobgoblin/sources/Source.java (limited to 'src') diff --git a/src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedNamespaceNode.java b/src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedNamespaceNode.java index abcf7cc..0e74a2d 100644 --- a/src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedNamespaceNode.java +++ b/src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedNamespaceNode.java @@ -1,8 +1,13 @@ package org.zwobble.hobgoblin.ast.untyped; +import org.zwobble.hobgoblin.sources.Source; import org.zwobble.hobgoblin.types.NamespaceName; import java.util.List; -public record UntypedNamespaceNode(NamespaceName namespaceName, List body) { +public record UntypedNamespaceNode( + NamespaceName namespaceName, + List body, + Source source +) { } diff --git a/src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedNamespaceStatementNode.java b/src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedNamespaceStatementNode.java index 21c20d9..e1cda4c 100644 --- a/src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedNamespaceStatementNode.java +++ b/src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedNamespaceStatementNode.java @@ -1,4 +1,4 @@ package org.zwobble.hobgoblin.ast.untyped; -public interface UntypedNamespaceStatementNode { +public sealed interface UntypedNamespaceStatementNode extends UntypedNode permits UntypedStructDefinitionNode { } diff --git a/src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedNode.java b/src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedNode.java new file mode 100644 index 0000000..cadc7e4 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedNode.java @@ -0,0 +1,7 @@ +package org.zwobble.hobgoblin.ast.untyped; + +import org.zwobble.hobgoblin.sources.Source; + +public interface UntypedNode { + Source source(); +} diff --git a/src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedStructDefinitionNode.java b/src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedStructDefinitionNode.java new file mode 100644 index 0000000..87f1a8a --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedStructDefinitionNode.java @@ -0,0 +1,9 @@ +package org.zwobble.hobgoblin.ast.untyped; + +import org.zwobble.hobgoblin.sources.Source; + +public record UntypedStructDefinitionNode( + String name, + Source source +) implements UntypedNamespaceStatementNode { +} diff --git a/src/main/java/org/zwobble/hobgoblin/parser/Parser.java b/src/main/java/org/zwobble/hobgoblin/parser/Parser.java index ac391e8..7e6c3fe 100644 --- a/src/main/java/org/zwobble/hobgoblin/parser/Parser.java +++ b/src/main/java/org/zwobble/hobgoblin/parser/Parser.java @@ -1,7 +1,10 @@ package org.zwobble.hobgoblin.parser; import org.zwobble.hobgoblin.ast.untyped.UntypedNamespaceNode; +import org.zwobble.hobgoblin.sources.FileFragmentSource; +import org.zwobble.hobgoblin.sources.Source; import org.zwobble.hobgoblin.types.NamespaceName; +import org.zwobble.sourcetext.SourcePosition; import java.util.List; @@ -13,6 +16,19 @@ public class Parser { TokenIterator tokens, NamespaceName namespaceName ) { - return new UntypedNamespaceNode(namespaceName, List.of()); + var start = tokens.startPosition(); + + var end = tokens.endPosition(); + var source = createSource(start, end); + + return new UntypedNamespaceNode( + namespaceName, + List.of(), + source + ); + } + + private static Source createSource(SourcePosition start, SourcePosition end) { + return new FileFragmentSource(start.to(end)); } } diff --git a/src/main/java/org/zwobble/hobgoblin/parser/TokenIterator.java b/src/main/java/org/zwobble/hobgoblin/parser/TokenIterator.java index b457313..f64d51f 100644 --- a/src/main/java/org/zwobble/hobgoblin/parser/TokenIterator.java +++ b/src/main/java/org/zwobble/hobgoblin/parser/TokenIterator.java @@ -1,5 +1,7 @@ package org.zwobble.hobgoblin.parser; +import org.zwobble.sourcetext.SourcePosition; + import java.util.List; class TokenIterator { @@ -24,4 +26,16 @@ class TokenIterator { return this.tokenEnd; } } + + SourcePosition startPosition() { + return this.peek().sourceRange().start(); + } + + SourcePosition endPosition() { + if (this.tokenIndex == 0) { + return startPosition(); + } else { + return getAbsolute(this.tokenIndex - 1).sourceRange().end(); + } + } } diff --git a/src/main/java/org/zwobble/hobgoblin/sources/FileFragmentSource.java b/src/main/java/org/zwobble/hobgoblin/sources/FileFragmentSource.java new file mode 100644 index 0000000..25116dc --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/sources/FileFragmentSource.java @@ -0,0 +1,10 @@ +package org.zwobble.hobgoblin.sources; + +import org.zwobble.sourcetext.SourceRange; + +public record FileFragmentSource(SourceRange sourceRange) implements Source { + @Override + public String describe() { + return this.sourceRange.describe(); + } +} diff --git a/src/main/java/org/zwobble/hobgoblin/sources/NullSource.java b/src/main/java/org/zwobble/hobgoblin/sources/NullSource.java new file mode 100644 index 0000000..61cc36d --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/sources/NullSource.java @@ -0,0 +1,13 @@ +package org.zwobble.hobgoblin.sources; + +public class NullSource implements Source { + private NullSource() { + } + + public static final NullSource INSTANCE = new NullSource(); + + @Override + public String describe() { + return "(null)"; + } +} diff --git a/src/main/java/org/zwobble/hobgoblin/sources/RuntimeSource.java b/src/main/java/org/zwobble/hobgoblin/sources/RuntimeSource.java new file mode 100644 index 0000000..7c23bfa --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/sources/RuntimeSource.java @@ -0,0 +1,13 @@ +package org.zwobble.hobgoblin.sources; + +public class RuntimeSource implements Source { + private RuntimeSource() { + } + + public static final RuntimeSource INSTANCE = new RuntimeSource(); + + @Override + public String describe() { + return "(runtime)"; + } +} diff --git a/src/main/java/org/zwobble/hobgoblin/sources/Source.java b/src/main/java/org/zwobble/hobgoblin/sources/Source.java new file mode 100644 index 0000000..2debfa6 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/sources/Source.java @@ -0,0 +1,5 @@ +package org.zwobble.hobgoblin.sources; + +public interface Source { + String describe(); +} -- cgit v1.2.3