summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-05-30 17:27:25 +0100
committerMichael Williamson <mike@zwobble.org>2026-05-30 17:27:25 +0100
commit88d38e052ba46a2e3d151c0708287c7956a9f9c1 (patch)
tree79cdbdb07901c3e94f68437fdbee4e72492f45d4 /src
parent57ff00acc01cf5082601cd00a125afa02fa3cba8 (diff)
Support parsing namespace name
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java26
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserNamespaceNameTests.java22
2 files changed, 46 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
index f995ef3..05c429d 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
@@ -228,17 +228,39 @@ public class Parser {
private static UntypedTypeLevelReferenceNode parsePrimaryTypeLevelExpression(TokenIterator tokens) {
var start = tokens.startPosition();
- var name = tokens.next(TokenType.IDENTIFIER);
+ var name = parseIdentifier(tokens);
var end = tokens.endPosition();
var source = createSource(start, end);
return new UntypedTypeLevelReferenceNode(
- name.charSequence().toString(),
+ name,
source
);
}
+ public static NamespaceName parseNamespaceName(SourceText sourceText) {
+ var tokens = Tokenizer.tokenize(sourceText);
+ var tokenIterator = tokens.iterator();
+ var namespaceName = parseNamespaceName(tokenIterator);
+ tokenIterator.skip(TokenType.END);
+ return namespaceName;
+ }
+
+ static NamespaceName parseNamespaceName(TokenIterator tokens) {
+ var namespaceParts = parseMany(
+ () -> !tokens.isNext(TokenType.IDENTIFIER),
+ () -> parseIdentifier(tokens),
+ () -> tokens.trySkip(TokenType.SYMBOL_FORWARD_SLASH)
+ );
+
+ return new NamespaceName(namespaceParts);
+ }
+
+ private static String parseIdentifier(TokenIterator tokens) {
+ return tokens.next(TokenType.IDENTIFIER).charSequence().toString();
+ }
+
/**
* Parse zero, one, or many instances of {@code T} using {@code parseOne}.
* Each instance is expected to be separated by tokens consumed by
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserNamespaceNameTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserNamespaceNameTests.java
new file mode 100644
index 0000000..4fe82fc
--- /dev/null
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserNamespaceNameTests.java
@@ -0,0 +1,22 @@
+package org.zwobble.hobgoblin.compiler.parser;
+
+import org.junit.jupiter.api.Test;
+import org.zwobble.hobgoblin.compiler.types.NamespaceName;
+
+import static org.zwobble.hobgoblin.compiler.parser.ParserTesting.parseString;
+import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.equalTo;
+
+public class ParserNamespaceNameTests {
+ @Test
+ public void canParseTopLevelNamespace() {
+ var source = "shapes";
+
+ var namespaceName = parseString(
+ source,
+ Parser::parseNamespaceName
+ );
+
+ assertThat(namespaceName, equalTo(NamespaceName.of("shapes")));
+ }
+}