diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-19 17:32:29 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-19 17:32:29 +0100 |
| commit | 4127cff475a54e9d92d21ae238b74e9af3dd0d23 (patch) | |
| tree | 7e181923394bdbdd3f8868c45fb6d64f1a1145ac /src/main/java | |
| parent | f0bcf07aaac58308bf31c97b5d1f9dc9c18d17b0 (diff) | |
Extract checkDependenciesBetweenNamespaceStatements()
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 51 |
1 files changed, 29 insertions, 22 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index af843021..1cc7a7d6 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -614,6 +614,35 @@ public class TypeChecker { dependenciesByBodyStatementIndex.add(dependencies); } + checkDependenciesBetweenNamespaceStatements(untyped, dependenciesByBodyStatementIndex); + + var fieldTypes = typedBody.stream() + .flatMap(bodyStatement -> + bodyStatement instanceof TypedFunctionDefinitionNode functionDefinition + ? Stream.of(Map.<String, Type>entry(functionDefinition.name(), functionDefinition.type())) + : Stream.of() + ) + .collect(PCollectors.toOrderedMap()); + + var fieldNames = fieldTypes.keys(); + + var typed = new TypedNamespaceNode( + untyped.namespaceName(), + typedBody, + fieldNames, + untyped.source() + ); + + return context + .exit() + .addNamespaceFields(typed.namespaceName(), fieldTypes) + .toResult(typed); + } + + private static void checkDependenciesBetweenNamespaceStatements( + UntypedNamespaceNode untyped, + List<Set<FreeVariable>> dependenciesByBodyStatementIndex + ) { var deferredDependenciesByFunctionName = new HashMap<String, Set<FreeVariable>>(); for (var i = 0; i < untyped.body().size(); i++) { var untypedStatement = untyped.body().get(i); @@ -668,28 +697,6 @@ public class TypeChecker { } } } - - var fieldTypes = typedBody.stream() - .flatMap(bodyStatement -> - bodyStatement instanceof TypedFunctionDefinitionNode functionDefinition - ? Stream.of(Map.<String, Type>entry(functionDefinition.name(), functionDefinition.type())) - : Stream.of() - ) - .collect(PCollectors.toOrderedMap()); - - var fieldNames = fieldTypes.keys(); - - var typed = new TypedNamespaceNode( - untyped.namespaceName(), - typedBody, - fieldNames, - untyped.source() - ); - - return context - .exit() - .addNamespaceFields(typed.namespaceName(), fieldTypes) - .toResult(typed); } static TypeCheckSteps<? extends TypedNamespaceStatementNode> typeCheckNamespaceStatement( |
