aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-23 20:47:17 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-23 20:47:17 +0000
commit66e07897524bf6239eb154c8d548c75bd74c82d0 (patch)
tree10a3696985bbe62bbc3abfe04a961cc85a9fea55 /src/main/java
parent8a1f0a3f0ecba5a33eb8eacfb16c08461ff974dd (diff)
Use type params in struct fields
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java26
1 files changed, 22 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 54a3722c..964a0000 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -3,6 +3,7 @@ package org.shedlang.compiler.typechecker;
import org.shedlang.compiler.ast.typed.*;
import org.shedlang.compiler.ast.untyped.*;
import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.sources.Sources;
import org.shedlang.compiler.typechecker.errors.NoSuchFieldError;
import org.shedlang.compiler.typechecker.errors.*;
import org.shedlang.compiler.typechecker.typesets.TypeSetTypeLevelValue;
@@ -1440,6 +1441,26 @@ public class TypeChecker {
@Override
public TypeCheckerContext defineTypes(TypeCheckerContext context) {
+ var typeOrConstructor = (TypeOrConstructor<StructType>) context.getLexicalState(
+ TypeOrConstructor.class,
+ untyped.name()
+ );
+
+ var environment = EnvironmentBuilder.EMPTY;
+
+ if (typeOrConstructor instanceof TypeOrConstructor.Constructor<StructType> constructor) {
+ for (var param : constructor.value().params()) {
+ // TODO: proper source
+ environment = environment.add(
+ param.name(),
+ Variable.defined(Types.metaType(param), VariableType.CONSTANT),
+ Sources.NULL
+ );
+ }
+ }
+
+ context = context.enterBlock(environment.build());
+
var typedFieldNodes = new ArrayList<TypedStructFieldDefinitionNode>();
var fieldInfosBuilder = FieldsInfo.builder();
@@ -1453,10 +1474,7 @@ public class TypeChecker {
fieldInfosBuilder = fieldInfosBuilder.addField(untypedField.name(), typedFieldNode.type().value());
}
- var typeOrConstructor = (TypeOrConstructor<StructType>) context.getLexicalState(
- TypeOrConstructor.class,
- untyped.name()
- );
+ context = context.exit();
context = context.addStructTypeInfo(
typeOrConstructor.toType(),