diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-05-30 17:35:39 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-05-30 17:35:39 +0100 |
| commit | 8296d3c6393e216c10c531f06aa076a72269c958 (patch) | |
| tree | cba4656f8af937eb2bbb0a15c363b5be580f671f /src | |
| parent | e7ac0adb6f73784117779d22e6d728378cd00f0e (diff) | |
Add parsing for qualified type name
Diffstat (limited to 'src')
3 files changed, 45 insertions, 0 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 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") + )); + } +} |
