summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-05-30 17:35:39 +0100
committerMichael Williamson <mike@zwobble.org>2026-05-30 17:35:39 +0100
commit8296d3c6393e216c10c531f06aa076a72269c958 (patch)
treecba4656f8af937eb2bbb0a15c363b5be580f671f /src
parente7ac0adb6f73784117779d22e6d728378cd00f0e (diff)
Add parsing for qualified type name
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java16
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/QualifiedTypeName.java4
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserQualifiedTypeNameTests.java25
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")
+ ));
+ }
+}