diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-28 11:57:36 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-28 11:57:36 +0100 |
| commit | b1ca0653b7bd80302a287faef3a7c7647f92d23a (patch) | |
| tree | 4c5d219f68d8b3d9f4e9e4d6a575d8e4fd1f121f /src/main/java | |
| parent | a409b4f6576980f876ec880ddf24dadc5d418c58 (diff) | |
Define struct type info earlier
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeCheckSteps.java | 6 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 22 |
2 files changed, 23 insertions, 5 deletions
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<T> { return context; } + default TypeCheckerContext defineTypes(TypeCheckerContext context) { + return context; + } + default TypeCheckerContext declareFunctions(TypeCheckerContext context) { return context; } @@ -12,6 +16,6 @@ public interface TypeCheckSteps<T> { TypeCheckerResult<T> finish(TypeCheckerContext context); default TypeCheckerResult<T> 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 @@ -676,6 +676,10 @@ public class TypeChecker { } 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<TypedStructDefinitionNode> finish(TypeCheckerContext context) { + public TypeCheckerContext defineTypes(TypeCheckerContext context) { var typedFieldNodes = new ArrayList<TypedStructFieldDefinitionNode>(); var fieldTypes = OrderedPMap.<String, Type>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<TypedStructDefinitionNode> finish(TypeCheckerContext context) { + var typedNode = context.getLexicalState(TypedStructDefinitionNode.class, untyped.name()); + + return context.toResult(typedNode); } }; } |
