summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedConstructedTypeNode.java10
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedTypeLevelExpressionNode.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java21
3 files changed, 31 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedConstructedTypeNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedConstructedTypeNode.java
new file mode 100644
index 0000000..5567516
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedConstructedTypeNode.java
@@ -0,0 +1,10 @@
+package org.zwobble.hobgoblin.compiler.ast.typed;
+
+import org.zwobble.hobgoblin.compiler.sources.Source;
+import org.zwobble.hobgoblin.compiler.types.ConstructedNativeType;
+
+public record TypedConstructedTypeNode(
+ ConstructedNativeType value,
+ Source source
+) implements TypedTypeLevelExpressionNode<ConstructedNativeType> {
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedTypeLevelExpressionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedTypeLevelExpressionNode.java
index c588f95..e80635d 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedTypeLevelExpressionNode.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedTypeLevelExpressionNode.java
@@ -2,6 +2,6 @@ package org.zwobble.hobgoblin.compiler.ast.typed;
import org.zwobble.hobgoblin.compiler.types.TypeLevelValue;
-public sealed interface TypedTypeLevelExpressionNode<T extends TypeLevelValue> extends TypedNode permits TypedTypeLevelReferenceNode {
+public sealed interface TypedTypeLevelExpressionNode<T extends TypeLevelValue> extends TypedNode permits TypedConstructedTypeNode, TypedTypeLevelReferenceNode {
T value();
}
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 a535bc8..5219d4d 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
@@ -144,13 +144,32 @@ public class TypeChecker {
) {
return switch (untyped) {
case UntypedConstructedTypeNode untypedConstructedType ->
- throw new UnsupportedOperationException("TODO");
+ typeCheckConstructedType(untypedConstructedType, context);
case UntypedTypeLevelReferenceNode untypedTypeLevelReference ->
typeCheckTypeLevelReference(untypedTypeLevelReference, context);
};
}
+ private static TypedTypeLevelExpressionNode<? extends TypeLevelValue> typeCheckConstructedType(
+ UntypedConstructedTypeNode untyped,
+ TypeCheckerNamespaceContext context
+ ) {
+ var typedReceiver = typeCheckTypeLevelExpression(untyped.receiver(), context);
+ var receiver = (TypeConstructor<SimpleNativeType>) typedReceiver.value();
+
+ var args = untyped.args().stream()
+ .map(untypedArg -> typeCheckMetaType(untypedArg, context).value())
+ .toList();
+
+ var constructedType = new ConstructedNativeType(receiver, args);
+
+ return new TypedConstructedTypeNode(
+ constructedType,
+ untyped.source()
+ );
+ }
+
private static TypedTypeLevelExpressionNode<? extends TypeLevelValue> typeCheckTypeLevelReference(
UntypedTypeLevelReferenceNode untyped,
TypeCheckerNamespaceContext context