From 8a1f0a3f0ecba5a33eb8eacfb16c08461ff974dd Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 23 Dec 2023 16:56:20 +0000 Subject: Set correct type for generic struct in environment --- .../java/org/shedlang/compiler/typechecker/TypeChecker.java | 7 +++++-- .../java/org/shedlang/compiler/types/TypeOrConstructor.java | 11 +++++++++++ src/main/java/org/shedlang/compiler/types/Types.java | 6 ++++-- 3 files changed, 20 insertions(+), 4 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 7c0dc632..54a3722c 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -1431,8 +1431,11 @@ public class TypeChecker { context = context.addLexicalState(untyped.name(), typeOrConstructor); - // TODO: set correct type for type constructor in environment - return context.declareVariableType(untyped.name(), Types.metaType(type), untyped.source()); + return context.declareVariableType( + untyped.name(), + typeOrConstructor.toMetaType(), + untyped.source() + ); } @Override diff --git a/src/main/java/org/shedlang/compiler/types/TypeOrConstructor.java b/src/main/java/org/shedlang/compiler/types/TypeOrConstructor.java index fea54044..6c512117 100644 --- a/src/main/java/org/shedlang/compiler/types/TypeOrConstructor.java +++ b/src/main/java/org/shedlang/compiler/types/TypeOrConstructor.java @@ -10,12 +10,18 @@ public sealed interface TypeOrConstructor { } T toType(); + org.shedlang.compiler.types.Type toMetaType(); record Type(T value) implements TypeOrConstructor { @Override public T toType() { return value; } + + @Override + public org.shedlang.compiler.types.Type toMetaType() { + return Types.metaType(value); + } } record Constructor(TypeConstructor value) implements TypeOrConstructor { @@ -23,5 +29,10 @@ public sealed interface TypeOrConstructor { public T toType() { return value.genericType(); } + + @Override + public org.shedlang.compiler.types.Type toMetaType() { + return Types.typeConstructorType(value); + } } } diff --git a/src/main/java/org/shedlang/compiler/types/Types.java b/src/main/java/org/shedlang/compiler/types/Types.java index b2303558..76c02f07 100644 --- a/src/main/java/org/shedlang/compiler/types/Types.java +++ b/src/main/java/org/shedlang/compiler/types/Types.java @@ -1,7 +1,5 @@ package org.shedlang.compiler.types; -import org.shedlang.compiler.ast.untyped.UntypedTypeLevelParamNode; - import java.util.List; import java.util.stream.Collectors; @@ -40,6 +38,10 @@ public class Types { return new TypeLevelValueType(effect); } + public static Type typeConstructorType(TypeConstructor typeConstructor) { + return new TypeLevelValueType(typeConstructor); + } + public static Type commonSupertype(List subtypes) { var uniqueSubtypes = subtypes.stream() .filter(subtype -> subtype != Types.BOTTOM) -- cgit v1.2.3