summaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-05-03 12:00:38 +0100
committerMichael Williamson <mike@zwobble.org>2026-05-03 12:00:38 +0100
commit3f8039bff09578fc3219503ca34a4d99833a7323 (patch)
treefbbfd3622e0ab81c992e07c31a151e781a3fb86f /src/main/java/org
parentbd7d0b6335238a465090af626a50df5fdfd425be (diff)
Parse constructed types
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedConstructedTypeNode.java12
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java22
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java10
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java3
5 files changed, 48 insertions, 1 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedConstructedTypeNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedConstructedTypeNode.java
new file mode 100644
index 0000000..6615995
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedConstructedTypeNode.java
@@ -0,0 +1,12 @@
+package org.zwobble.hobgoblin.compiler.ast.untyped;
+
+import org.zwobble.hobgoblin.compiler.sources.Source;
+
+import java.util.List;
+
+public record UntypedConstructedTypeNode(
+ UntypedTypeLevelExpressionNode receiver,
+ List<UntypedTypeLevelExpressionNode> args,
+ Source source
+) implements UntypedTypeLevelExpressionNode {
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java
index 871393d..12414c5 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java
@@ -1,4 +1,4 @@
package org.zwobble.hobgoblin.compiler.ast.untyped;
-public sealed interface UntypedTypeLevelExpressionNode extends UntypedNode permits UntypedTypeLevelReferenceNode {
+public sealed interface UntypedTypeLevelExpressionNode extends UntypedNode permits UntypedConstructedTypeNode, UntypedTypeLevelReferenceNode {
}
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 4cd35f8..d60b249 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
@@ -156,6 +156,28 @@ public class Parser {
) {
var start = tokens.startPosition();
+ UntypedTypeLevelExpressionNode expression = parsePrimaryTypeLevelExpression(tokens);
+
+ while (tokens.trySkip(TokenType.SYMBOL_SQUARE_OPEN)) {
+ var args = parseMany(
+ () -> tokens.isNext(TokenType.SYMBOL_SQUARE_CLOSE),
+ () -> parseTypeLevelExpression(tokens),
+ () -> tokens.trySkip(TokenType.SYMBOL_COMMA)
+ );
+ tokens.skip(TokenType.SYMBOL_SQUARE_CLOSE);
+
+ var end = tokens.endPosition();
+ var source = createSource(start, end);
+
+ expression = new UntypedConstructedTypeNode(expression, args, source);
+ }
+
+ return expression;
+ }
+
+ private static UntypedTypeLevelReferenceNode parsePrimaryTypeLevelExpression(TokenIterator tokens) {
+ var start = tokens.startPosition();
+
var name = tokens.next(TokenType.IDENTIFIER);
var end = tokens.endPosition();
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java b/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java
index 0ae3d28..55edd97 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java
@@ -44,6 +44,16 @@ class TokenIterator {
}
}
+ public boolean trySkip(TokenType tokenType) {
+ var token = peek();
+ if (token.tokenType().equals(tokenType)) {
+ this.tokenIndex++;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
private Token getAbsolute(int index) {
if (index < this.tokens.size()) {
return this.tokens.get(index);
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
index c713c70..a535bc8 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
@@ -143,6 +143,9 @@ public class TypeChecker {
TypeCheckerNamespaceContext context
) {
return switch (untyped) {
+ case UntypedConstructedTypeNode untypedConstructedType ->
+ throw new UnsupportedOperationException("TODO");
+
case UntypedTypeLevelReferenceNode untypedTypeLevelReference ->
typeCheckTypeLevelReference(untypedTypeLevelReference, context);
};