aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-17 23:21:58 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-17 23:21:58 +0100
commitdb477d8a01c7f4ee200826baaee0342f7f797604 (patch)
treea6c22d9cbfb88996ff255841f258b7280503d515 /src/main/java
parentd1a79b6eff402257720c99ca873af2840f9d2595 (diff)
Handle free variables in inner scopes
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java
index 99357563..c05a2475 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java
@@ -154,10 +154,21 @@ public class TypeCheckerContext {
}
private TypeCheckerContext withVariable(String name) {
- // TODO: walk up stack
- return boundVariables().contains(name)
- ? this
- : updateLexicalContext(lexicalContext -> lexicalContext.withFreeVariable(name));
+ var newLexicalContextStack = this.lexicalContextStack;
+
+ for (var index = 0; index < this.lexicalContextStack.size(); index++) {
+ var lexicalContext = this.lexicalContextStack.get(index);
+ if (lexicalContext.boundVariables.contains(name)) {
+ break;
+ } else{
+ newLexicalContextStack = newLexicalContextStack.with(
+ index,
+ lexicalContext.withFreeVariable(name)
+ );
+ }
+ }
+
+ return new TypeCheckerContext(namespaceTypeInfo, newLexicalContextStack);
}
public Optional<Variable> compileTimeLookup(String name) {