From 7b395b0ef9409b525799e067130610f2f30dfe2d Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 19 Jul 2023 17:13:41 +0100 Subject: Properly distinguish free variables and dependencies --- .../shedlang/compiler/typechecker/TypeChecker.java | 33 +++++++++++----------- 1 file changed, 16 insertions(+), 17 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 fe844d66..f4c0af7f 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -589,7 +589,7 @@ public class TypeChecker { context = typeCheckSteps.declareFunctions(context); } - var dependencies = new ArrayList>(); + var dependenciesByBodyStatementIndex = new ArrayList>(); var variableNames = untyped.body().stream() .flatMap(untypedStatement -> declaredVariables(untypedStatement, P.vector()).stream()) .map(declaration -> declaration.name()) @@ -608,19 +608,18 @@ public class TypeChecker { typedBody.add(typedStatement); - var freeVariableNames = freeVariables.stream() + var dependencies = freeVariables.stream() .filter(freeVariable -> variableNames.contains(freeVariable.name())) - .map(freeVariable -> freeVariable.name()) .collect(Collectors.toSet()); - dependencies.add(freeVariableNames); + dependenciesByBodyStatementIndex.add(dependencies); } - var deferredDependencies = new HashMap>(); + var deferredDependenciesByFunctionName = new HashMap>(); for (var i = 0; i < untyped.body().size(); i++) { var untypedStatement = untyped.body().get(i); if (untypedStatement instanceof UntypedFunctionDefinitionNode functionDefinition) { - var freeVariables = dependencies.get(i); - deferredDependencies.put(functionDefinition.name(), freeVariables); + var dependencies = dependenciesByBodyStatementIndex.get(i); + deferredDependenciesByFunctionName.put(functionDefinition.name(), dependencies); } } @@ -631,34 +630,34 @@ public class TypeChecker { defined.add(name); } - void require(String name) { - if (defined.contains(name)) { + void require(FreeVariable dependency) { + if (defined.contains(dependency.name())) { return; } - var freeVariables = deferredDependencies.get(name); + var subdependencies = deferredDependenciesByFunctionName.get(dependency.name()); - if (freeVariables == null) { + if (subdependencies == null) { // TODO: fix source - throw new ReferenceBeforeDefinitionError(name, Sources.NULL); + throw new ReferenceBeforeDefinitionError(dependency.name(), Sources.NULL); } - for (var dependency : freeVariables) { - require(dependency); + for (var subdependency : subdependencies) { + require(subdependency); } } }; for (var i = 0; i < untyped.body().size(); i++) { var untypedStatement = untyped.body().get(i); - var freeVariables = dependencies.get(i); + var dependencies = dependenciesByBodyStatementIndex.get(i); switch (untypedStatement) { case UntypedFunctionDefinitionNode functionDefinition -> { } case UntypedValNode val -> { - for (var freeVariable : freeVariables) { - state.require(freeVariable); + for (var dependency : dependencies) { + state.require(dependency); } for (var declaredVariable : declaredVariables(val, P.vector())) { -- cgit v1.2.3