diff --git a/src/main/java/spoon/reflect/factory/CodeFactory.java b/src/main/java/spoon/reflect/factory/CodeFactory.java index c325abbb129..edf4d74807c 100644 --- a/src/main/java/spoon/reflect/factory/CodeFactory.java +++ b/src/main/java/spoon/reflect/factory/CodeFactory.java @@ -314,6 +314,7 @@ public CtLocalVariableReference createLocalVariableReference(CtLocalVaria CtLocalVariableReference ref = factory.Core().createLocalVariableReference(); ref.setType(localVariable.getType() == null ? null : localVariable.getType().clone()); ref.setSimpleName(localVariable.getSimpleName()); + ref.setParent(localVariable); return ref; } diff --git a/src/main/java/spoon/support/reflect/reference/CtLocalVariableReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtLocalVariableReferenceImpl.java index 19d55baa63a..e5b63309a54 100644 --- a/src/main/java/spoon/support/reflect/reference/CtLocalVariableReferenceImpl.java +++ b/src/main/java/spoon/support/reflect/reference/CtLocalVariableReferenceImpl.java @@ -74,7 +74,7 @@ public CtLocalVariable getDeclaration() { // validating that the parent of a finding is parent of this // reference as well for (final CtLocalVariable lv : localVariables) { - if (hasParent(lv.getParent())) { + if (getParent().equals(lv) || hasParent(lv.getParent())) { return lv; } } diff --git a/src/test/java/spoon/test/reference/VariableAccessTest.java b/src/test/java/spoon/test/reference/VariableAccessTest.java index 55c2a94cd0c..8ce19ed8b1a 100644 --- a/src/test/java/spoon/test/reference/VariableAccessTest.java +++ b/src/test/java/spoon/test/reference/VariableAccessTest.java @@ -26,6 +26,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static spoon.testing.utils.ModelUtils.build; @@ -53,7 +54,7 @@ public boolean matches(CtParameterReference reference) { } @Test - public void name() throws Exception { + public void testDeclarationArray() throws Exception { final CtType aPozole = ModelUtils.buildClass(Pozole.class); final CtMethod m2 = aPozole.getMethod("m2"); final CtArrayWrite ctArrayWrite = m2.getElements(new TypeFilter>(CtArrayWrite.class)).get(0); @@ -136,16 +137,36 @@ public void testGetDeclarationAfterClone() throws Exception { final CtLocalVariableReference localVarRefCloned = getLocalVariableRefF1(methodA2Cloned); assertEquals(localVarRef.getDeclaration(), declaration); - assertTrue(localVarRef.getDeclaration() == declaration); + assertSame(localVarRef.getDeclaration(), declaration); assertEquals(localVarRefCloned.getDeclaration(), declarationCloned); - assertTrue(localVarRefCloned.getDeclaration() == declarationCloned); + assertSame(localVarRefCloned.getDeclaration(), declarationCloned); } @Test public void testReferences() throws Exception { + + /* test getReference on local variable + * getReference().getDeclaration() must be circular + */ + final CtType aTortillas = buildClass(Tortillas.class); final CtMethod make = aTortillas.getMethod("make", aTortillas.getFactory().Type().stringType()); - System.out.println(make); + + final CtLocalVariable localVar = make.getBody().getStatement(0); + final CtLocalVariable localVarCloned = localVar.clone(); + + final CtLocalVariableReference localVarRef = localVar.getReference(); + final CtLocalVariableReference localVarRefCloned = localVarCloned.getReference(); + + assertEquals(localVarRef.getDeclaration(), localVar); + assertSame(localVarRef.getDeclaration(), localVar); + assertEquals(localVar.getReference().getDeclaration(), localVar); + assertSame(localVar.getReference().getDeclaration(), localVar); + + assertEquals(localVarRefCloned.getDeclaration(), localVarCloned); + assertSame(localVarRefCloned.getDeclaration(), localVarCloned); + assertEquals(localVarCloned.getReference().getDeclaration(), localVarCloned); + assertSame(localVarCloned.getReference().getDeclaration(), localVarCloned); } @Test @@ -167,6 +188,7 @@ public void visitCtLocalVariableReference( launcher.getEnvironment().setNoClasspath(true); launcher.addInputResource("src/test/resources/reference-test/ChangeScanner.java"); launcher.buildModel(); + new CtLocalVariableReferenceScanner().scan(launcher.getModel().getRootPackage()); } @@ -190,6 +212,7 @@ public void visitCtLocalVariableReference( launcher.getEnvironment().setNoClasspath(true); launcher.addInputResource("src/test/resources/reference-test/MultipleDeclarationsOfLocalVariable.java"); launcher.buildModel(); + new CtLocalVariableReferenceScanner().scan(launcher.getModel().getRootPackage()); }