aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/FreeVariables.java8
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/FreeVariablesTests.java14
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);
+ }
}