From db5d22b9761149e5f16c1df4805072547ecf9f1f Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 24 Jul 2023 22:24:42 +0100 Subject: Fix update of top lexical context --- .../typechecker/TypeCheckerContextTests.java | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerContextTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerContextTests.java index 7a2d7d71..a9198b86 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerContextTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerContextTests.java @@ -75,6 +75,30 @@ public class TypeCheckerContextTests { assertThat(error.variableName(), equalTo("x")); } + @Test + public void definingVariableOnlyAffectsTopMostLexicalContext() { + var context = TypeCheckerContext.EMPTY + .enterNamespace(P.map( + Map.entry("x", TypeCheckerContext.undefined()), + Map.entry("y", TypeCheckerContext.undefined()) + )); + + context = context.enterBlock(P.map( + Map.entry("x", TypeCheckerContext.undefined()) + )); + context = context.define("x", Types.STRING, Sources.NULL); + assertThat( + context.runtimeLookup("x", Sources.NULL).value(), + isOptionalOf(equalTo(TypeCheckerContext.defined(Types.STRING))) + ); + + context = context.exit(); + assertThat( + context.runtimeLookup("x", Sources.NULL).value(), + isOptionalOf(equalTo(TypeCheckerContext.undefined())) + ); + } + @Test public void runtimeLookupUpdatesFreeVariablesUntilLexicalContextInWhichVariableIsDefined() { var context = TypeCheckerContext.EMPTY -- cgit v1.2.3