summaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java11
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java13
2 files changed, 23 insertions, 1 deletions
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 97008b6..63fc357 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
@@ -239,8 +239,17 @@ public class TypeChecker {
throw new UnsupportedOperationException("TODO");
};
+ var typeParams = switch (typeOrConstructor) {
+ case TypeOrConstructor.Type<SimpleStructType> _ ->
+ List.<TypeParam>of();
+
+ case TypeOrConstructor.Constructor<SimpleStructType> constructor ->
+ constructor.value().params();
+ };
+ var bodyContext = context.enter(typeParams);
+
var typeCheckedFieldDefinitions = untyped.fields().isPresent()
- ? Optional.of(typeCheckFieldDefinitions(untyped.fields().get(), context))
+ ? Optional.of(typeCheckFieldDefinitions(untyped.fields().get(), bodyContext))
: Optional.<TypeCheckFieldDefinitionsResult>empty();
var typedFields = typeCheckedFieldDefinitions.map(TypeCheckFieldDefinitionsResult::fields);
var typedFieldNodes = typeCheckedFieldDefinitions.map(TypeCheckFieldDefinitionsResult::typedFieldNodes);
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java
index 2c8ad67..ce7153f 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java
@@ -89,4 +89,17 @@ public class TypeCheckerNamespaceContext {
public List<Field> fieldsOf(SumType type) {
return this.typesInfo.fieldsOf(type);
}
+
+ public TypeCheckerNamespaceContext enter(List<TypeParam> typeParams) {
+ var newVariables = new HashMap<>(this.variables);
+ for (var typeParam : typeParams) {
+ newVariables.put(typeParam.name(), Types.metaType(typeParam));
+ }
+
+ return new TypeCheckerNamespaceContext(
+ this.namespaceName,
+ newVariables,
+ this.typesInfo
+ );
+ }
}