From db477d8a01c7f4ee200826baaee0342f7f797604 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 17 Jul 2023 23:21:58 +0100 Subject: Handle free variables in inner scopes --- .../compiler/typechecker/TypeCheckerContext.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'src/main/java') 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 compileTimeLookup(String name) { -- cgit v1.2.3