diff options
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/FreeVariables.java | 8 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/frontends/java/FreeVariablesTests.java | 14 |
2 files changed, 18 insertions, 4 deletions
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/FreeVariables.java b/src/main/java/org/zwobble/couscous/frontends/java/FreeVariables.java index 3e3c7c6..bd55979 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/FreeVariables.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/FreeVariables.java @@ -15,10 +15,10 @@ public class FreeVariables { public static List<VariableDeclaration> findFreeVariables(List<FormalArgumentNode> formalArguments, List<? extends Node> body) { Stream<VariableDeclaration> referencedDeclarations = body.stream() .flatMap(FreeVariables::findReferencedDeclarations); - // TODO: consider nested arguments - // Stream<VariableDeclaration> declarations = body.stream().flatMap(this::findDeclarations); - Stream<VariableDeclaration> declarations = formalArguments.stream() - .map(argument -> argument.getDeclaration()); + Stream<VariableDeclaration> declarations = Stream.concat( + formalArguments.stream() + .map(argument -> argument.getDeclaration()), + body.stream().flatMap(FreeVariables::findDeclarations)); return Sets.difference( referencedDeclarations.collect(Collectors.toSet()), declarations.collect(Collectors.toSet())).stream().collect(Collectors.toList()); diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/FreeVariablesTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/FreeVariablesTests.java index 68cfda7..4461e7c 100644 --- a/src/test/java/org/zwobble/couscous/tests/frontends/java/FreeVariablesTests.java +++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/FreeVariablesTests.java @@ -2,6 +2,7 @@ package org.zwobble.couscous.tests.frontends.java; import org.junit.Test; import org.zwobble.couscous.ast.FormalArgumentNode; +import org.zwobble.couscous.ast.LocalVariableDeclarationNode; import org.zwobble.couscous.ast.VariableDeclaration; import org.zwobble.couscous.values.StringValue; @@ -11,6 +12,8 @@ import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static org.junit.Assert.assertEquals; import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg; +import static org.zwobble.couscous.ast.LiteralNode.literal; +import static org.zwobble.couscous.ast.LocalVariableDeclarationNode.localVariableDeclaration; import static org.zwobble.couscous.ast.VariableDeclaration.var; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; import static org.zwobble.couscous.frontends.java.FreeVariables.findFreeVariables; @@ -31,4 +34,15 @@ public class FreeVariablesTests { asList(reference(declaration))); assertEquals(emptyList(), freeVariables); } + + @Test + public void referenceIsNotFreeIfIsReferenceToLocalDefinedInBody() { + VariableDeclaration declaration = var("[id]", "[name]", StringValue.REF); + List<VariableDeclaration> freeVariables = findFreeVariables( + emptyList(), + asList( + localVariableDeclaration(declaration, literal("[value]")), + reference(declaration))); + assertEquals(emptyList(), freeVariables); + } } |
