diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-12-23 20:47:17 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-12-23 20:47:17 +0000 |
| commit | 66e07897524bf6239eb154c8d548c75bd74c82d0 (patch) | |
| tree | 10a3696985bbe62bbc3abfe04a961cc85a9fea55 /src/main/java | |
| parent | 8a1f0a3f0ecba5a33eb8eacfb16c08461ff974dd (diff) | |
Use type params in struct fields
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 26 |
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(), |
