diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-17 23:21:58 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-17 23:21:58 +0100 |
| commit | db477d8a01c7f4ee200826baaee0342f7f797604 (patch) | |
| tree | a6c22d9cbfb88996ff255841f258b7280503d515 /src/main/java | |
| parent | d1a79b6eff402257720c99ca873af2840f9d2595 (diff) | |
Handle free variables in inner scopes
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java | 19 |
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) { |
