aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-23 16:56:20 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-23 16:56:20 +0000
commit8a1f0a3f0ecba5a33eb8eacfb16c08461ff974dd (patch)
treed2c2c387e69157fe6b2b569ca7b7f17b86bc82cd /src/main/java
parent6ea1e107ed1358e809e24681bc22284d4aa7e630 (diff)
Set correct type for generic struct in environment
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java7
-rw-r--r--src/main/java/org/shedlang/compiler/types/TypeOrConstructor.java11
-rw-r--r--src/main/java/org/shedlang/compiler/types/Types.java6
3 files changed, 20 insertions, 4 deletions
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 extends Type> {
}
T toType();
+ org.shedlang.compiler.types.Type toMetaType();
record Type<T extends org.shedlang.compiler.types.Type>(T value) implements TypeOrConstructor<T> {
@Override
public T toType() {
return value;
}
+
+ @Override
+ public org.shedlang.compiler.types.Type toMetaType() {
+ return Types.metaType(value);
+ }
}
record Constructor<T extends org.shedlang.compiler.types.Type>(TypeConstructor<T> value) implements TypeOrConstructor<T> {
@@ -23,5 +29,10 @@ public sealed interface TypeOrConstructor<T extends Type> {
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<Type> subtypes) {
var uniqueSubtypes = subtypes.stream()
.filter(subtype -> subtype != Types.BOTTOM)