From b1ca0653b7bd80302a287faef3a7c7647f92d23a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 28 Sep 2023 11:57:36 +0100 Subject: Define struct type info earlier --- .../compiler/typechecker/TypeCheckSteps.java | 6 +++++- .../shedlang/compiler/typechecker/TypeChecker.java | 22 ++++++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckSteps.java b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckSteps.java index be94fb24..db9789e3 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckSteps.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckSteps.java @@ -5,6 +5,10 @@ public interface TypeCheckSteps { return context; } + default TypeCheckerContext defineTypes(TypeCheckerContext context) { + return context; + } + default TypeCheckerContext declareFunctions(TypeCheckerContext context) { return context; } @@ -12,6 +16,6 @@ public interface TypeCheckSteps { TypeCheckerResult finish(TypeCheckerContext context); default TypeCheckerResult typeCheckAllPhases(TypeCheckerContext context) { - return finish(declareFunctions(declareTypes(context))); + return finish(declareFunctions(defineTypes(declareTypes(context)))); } } diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index bd5b43fd..54e9d9b9 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -675,6 +675,10 @@ public class TypeChecker { context = typeCheckSteps.declareTypes(context); } + for (var typeCheckSteps : typeCheckStepSets) { + context = typeCheckSteps.defineTypes(context); + } + for (var typeCheckSteps : typeCheckStepSets) { context = typeCheckSteps.declareFunctions(context); } @@ -836,7 +840,7 @@ public class TypeChecker { } @Override - public TypeCheckerResult finish(TypeCheckerContext context) { + public TypeCheckerContext defineTypes(TypeCheckerContext context) { var typedFieldNodes = new ArrayList(); var fieldTypes = OrderedPMap.empty(); @@ -852,14 +856,24 @@ public class TypeChecker { var type = context.getLexicalState(StructType.class, untyped.name()); - // TODO: this needs to happen before type-checking function bodies context = context.addStructTypeInfo(type, new StructTypeInfo(fieldTypes)); - return context.toResult(new TypedStructDefinitionNode( + var typedNode = new TypedStructDefinitionNode( untyped.name(), typedFieldNodes, untyped.source() - )); + ); + + context = context.addLexicalState(untyped.name(), typedNode); + + return context; + } + + @Override + public TypeCheckerResult finish(TypeCheckerContext context) { + var typedNode = context.getLexicalState(TypedStructDefinitionNode.class, untyped.name()); + + return context.toResult(typedNode); } }; } -- cgit v1.2.3