diff options
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) { |
