aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-19 17:13:41 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-19 17:13:41 +0100
commit7b395b0ef9409b525799e067130610f2f30dfe2d (patch)
treec127e9bf50d95b9679c21cd76947e17a7ebd39a1 /src/main/java
parent950f2ca528566f71e4becab80fdda25783b3d485 (diff)
Properly distinguish free variables and dependencies
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java33
1 files changed, 16 insertions, 17 deletions
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<Set<String>>();
+ var dependenciesByBodyStatementIndex = new ArrayList<Set<FreeVariable>>();
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<String, Set<String>>();
+ var deferredDependenciesByFunctionName = new HashMap<String, Set<FreeVariable>>();
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())) {