summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedNamespaceNode.java7
-rw-r--r--src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedNamespaceStatementNode.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedNode.java7
-rw-r--r--src/main/java/org/zwobble/hobgoblin/ast/untyped/UntypedStructDefinitionNode.java9
-rw-r--r--src/main/java/org/zwobble/hobgoblin/parser/Parser.java18
-rw-r--r--src/main/java/org/zwobble/hobgoblin/parser/TokenIterator.java14
-rw-r--r--src/main/java/org/zwobble/hobgoblin/sources/FileFragmentSource.java10
-rw-r--r--src/main/java/org/zwobble/hobgoblin/sources/NullSource.java13
-rw-r--r--src/main/java/org/zwobble/hobgoblin/sources/RuntimeSource.java13
-rw-r--r--src/main/java/org/zwobble/hobgoblin/sources/Source.java5
10 files changed, 95 insertions, 3 deletions
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<UntypedNamespaceStatementNode> body) {
+public record UntypedNamespaceNode(
+ NamespaceName namespaceName,
+ List<UntypedNamespaceStatementNode> 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();
+}