From 88d38e052ba46a2e3d151c0708287c7956a9f9c1 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 30 May 2026 17:27:25 +0100 Subject: Support parsing namespace name --- .../zwobble/hobgoblin/compiler/parser/Parser.java | 26 ++++++++++++++++++++-- .../compiler/parser/ParserNamespaceNameTests.java | 22 ++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserNamespaceNameTests.java (limited to 'src') 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"))); + } +} -- cgit v1.2.3