@Test public void testShadowingScopeShadowsEnclosingScope() { CommonScope enclosingScope = new CommonScope(false); // is shadowing scope CommonScope scope = new CommonScope(Optional.of(enclosingScope), true); JTypeReference intReference = new CommonJTypeReference<>("int", JTypeSymbol.KIND, scope); JTypeReference stringReference = new CommonJTypeReference<>("String", JTypeSymbol.KIND, scope); PropertySymbol v1 = new PropertySymbol("var", intReference); enclosingScope.add(v1); PropertySymbol x = new PropertySymbol("x", intReference); enclosingScope.add(x); PropertySymbol v2 = new PropertySymbol("var", stringReference); scope.add(v2); PropertySymbol y = new PropertySymbol("y", stringReference); scope.add(y); ResolvingFilter<PropertySymbol> variableResolvingFilter = CommonResolvingFilter.create(PropertySymbol.KIND); enclosingScope.addResolver(variableResolvingFilter); scope.addResolver(variableResolvingFilter); assertSame(v1, enclosingScope.resolve("var", PropertySymbol.KIND).get()); assertSame(x, enclosingScope.resolve("x", PropertySymbol.KIND).get()); assertSame(x, scope.resolve("x", PropertySymbol.KIND).get()); assertSame(y, scope.resolve("y", PropertySymbol.KIND).get()); // shadows enclosing var assertSame(v2, scope.resolve("var", PropertySymbol.KIND).get()); }
@Test public void testLocalScopeDoesNotShadowEnclosingScope() { CommonScope enclosingScope = new CommonScope(false); CommonScope scope = new CommonScope(Optional.of(enclosingScope), false); JTypeReference intReference = new CommonJTypeReference<>("int", JTypeSymbol.KIND, scope); JTypeReference stringReference = new CommonJTypeReference<>("String", JTypeSymbol.KIND, scope); PropertySymbol v1 = new PropertySymbol("var", intReference); enclosingScope.add(v1); PropertySymbol x = new PropertySymbol("x", intReference); enclosingScope.add(x); PropertySymbol v2 = new PropertySymbol("var", stringReference); scope.add(v2); PropertySymbol y = new PropertySymbol("y", stringReference); scope.add(y); ResolvingFilter<PropertySymbol> variableResolvingFilter = CommonResolvingFilter.create(PropertySymbol.KIND); enclosingScope.addResolver(variableResolvingFilter); scope.addResolver(variableResolvingFilter); assertSame(v1, enclosingScope.resolve("var", PropertySymbol.KIND).get()); assertSame(x, enclosingScope.resolve("x", PropertySymbol.KIND).get()); assertSame(x, scope.resolve("x", PropertySymbol.KIND).get()); assertSame(y, scope.resolve("y", PropertySymbol.KIND).get()); try { scope.resolve("var", PropertySymbol.KIND); fail(); } catch (ResolvedSeveralEntriesException e) { assertEquals(2, e.getSymbols().size()); assertTrue(e.getSymbols().contains(v2)); assertTrue(e.getSymbols().contains(v1)); } }