From 8296d3c6393e216c10c531f06aa076a72269c958 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 30 May 2026 17:35:39 +0100 Subject: Add parsing for qualified type name --- .../zwobble/hobgoblin/compiler/parser/Parser.java | 16 ++++++++++++++ .../compiler/types/QualifiedTypeName.java | 4 ++++ .../parser/ParserQualifiedTypeNameTests.java | 25 ++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/types/QualifiedTypeName.java create mode 100644 src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserQualifiedTypeNameTests.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 05c429d..4beca21 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java @@ -5,6 +5,7 @@ import org.zwobble.hobgoblin.compiler.ast.untyped.*; import org.zwobble.hobgoblin.compiler.sources.FileFragmentSource; import org.zwobble.hobgoblin.compiler.sources.Source; import org.zwobble.hobgoblin.compiler.types.NamespaceName; +import org.zwobble.hobgoblin.compiler.types.QualifiedTypeName; import org.zwobble.sourcetext.SourcePosition; import org.zwobble.sourcetext.SourceText; @@ -239,6 +240,21 @@ public class Parser { ); } + public static QualifiedTypeName parseQualifiedTypeName(SourceText sourceText) { + var tokens = Tokenizer.tokenize(sourceText); + var tokenIterator = tokens.iterator(); + var namespaceName = parseQualifiedTypeName(tokenIterator); + tokenIterator.skip(TokenType.END); + return namespaceName; + } + + static QualifiedTypeName parseQualifiedTypeName(TokenIterator tokens) { + var namespaceName = parseNamespaceName(tokens); + tokens.skip(TokenType.SYMBOL_DOT); + var typeName = parseIdentifier(tokens); + return new QualifiedTypeName(namespaceName, typeName); + } + public static NamespaceName parseNamespaceName(SourceText sourceText) { var tokens = Tokenizer.tokenize(sourceText); var tokenIterator = tokens.iterator(); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/QualifiedTypeName.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/QualifiedTypeName.java new file mode 100644 index 0000000..b92b690 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/QualifiedTypeName.java @@ -0,0 +1,4 @@ +package org.zwobble.hobgoblin.compiler.types; + +public record QualifiedTypeName(NamespaceName namespaceName, String name) { +} diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserQualifiedTypeNameTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserQualifiedTypeNameTests.java new file mode 100644 index 0000000..7a957e2 --- /dev/null +++ b/src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserQualifiedTypeNameTests.java @@ -0,0 +1,25 @@ +package org.zwobble.hobgoblin.compiler.parser; + +import org.junit.jupiter.api.Test; +import org.zwobble.hobgoblin.compiler.types.NamespaceName; +import org.zwobble.hobgoblin.compiler.types.QualifiedTypeName; + +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 ParserQualifiedTypeNameTests { + @Test + public void canParseQualifiedTypeName() { + var source = "shapes/polygons.Square"; + + var qualifiedTypename = parseString( + source, + Parser::parseQualifiedTypeName + ); + + assertThat(qualifiedTypename, equalTo( + new QualifiedTypeName(NamespaceName.of("shapes", "polygons"), "Square") + )); + } +} -- cgit v1.2.3