From 66e07897524bf6239eb154c8d548c75bd74c82d0 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 23 Dec 2023 20:47:17 +0000 Subject: Use type params in struct fields --- .../shedlang/compiler/typechecker/TypeChecker.java | 26 ++++++++++++++++++---- 1 file changed, 22 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 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) context.getLexicalState( + TypeOrConstructor.class, + untyped.name() + ); + + var environment = EnvironmentBuilder.EMPTY; + + if (typeOrConstructor instanceof TypeOrConstructor.Constructor 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(); var fieldInfosBuilder = FieldsInfo.builder(); @@ -1453,10 +1474,7 @@ public class TypeChecker { fieldInfosBuilder = fieldInfosBuilder.addField(untypedField.name(), typedFieldNode.type().value()); } - var typeOrConstructor = (TypeOrConstructor) context.getLexicalState( - TypeOrConstructor.class, - untyped.name() - ); + context = context.exit(); context = context.addStructTypeInfo( typeOrConstructor.toType(), -- cgit v1.2.3