Skip to content

Commit 5176fb8

Browse files
committed
Possible fix for INRIA#3329
1 parent 7966595 commit 5176fb8

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

src/main/java/spoon/support/compiler/jdt/JDTTreeBuilderHelper.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,11 @@ CtExpression<?> createTargetFieldAccess(QualifiedNameReference qualifiedNameRefe
659659
} else if (ref.isStatic()) {
660660
target = createTypeAccess(qualifiedNameReference, ref);
661661
} else if (!ref.isStatic() && !ref.getDeclaringType().isAnonymous()) {
662-
target = jdtTreeBuilder.getFactory().Code().createThisAccess(jdtTreeBuilder.getReferencesBuilder().<Object>getTypeReference(qualifiedNameReference.actualReceiverType), true);
662+
if (ref.getDeclaringType().getDeclaredField(ref.getSimpleName()) == null) {
663+
target = createTypeAccessNoClasspath(qualifiedNameReference);
664+
} else {
665+
target = jdtTreeBuilder.getFactory().Code().createThisAccess(jdtTreeBuilder.getReferencesBuilder().<Object>getTypeReference(qualifiedNameReference.actualReceiverType), true);
666+
}
663667
}
664668
return target;
665669
}

src/test/java/spoon/test/targeted/TargetedExpressionTest.java

+19
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.junit.Test;
3030

3131
import spoon.Launcher;
32+
import spoon.reflect.CtModel;
3233
import spoon.reflect.code.CtExpression;
3334
import spoon.reflect.code.CtFieldAccess;
3435
import spoon.reflect.code.CtFieldRead;
@@ -282,6 +283,24 @@ public void testStaticTargetsOfFieldAccessNoClasspath() {
282283
assertEqualsFieldAccess(new ExpectedTargetedExpression().declaringType(expectedFiiFuu).target(launcher.getFactory().Code().createTypeAccess(expectedFiiFuu)).result("Fii.Fuu.i"), elements.get(9));
283284
}
284285

286+
@Test
287+
public void testOnlyStaticTargetFieldReadNoClasspath() {
288+
// bug case kindly provided by @slarse
289+
// in https://github.com/INRIA/spoon/issues/3329
290+
final Launcher launcher = new Launcher();
291+
launcher.getEnvironment().setNoClasspath(true);
292+
launcher.addInputResource("./src/test/resources/spoon/test/noclasspath/targeted/StaticFieldReadOnly.java");
293+
CtModel model = launcher.buildModel();
294+
295+
List<CtInvocation<?>> invocations = model.getElements(e -> e.getExecutable().getSimpleName().equals("error"));
296+
CtInvocation<?> inv = invocations.get(0);
297+
CtFieldRead<?> fieldRead = (CtFieldRead<?>) inv.getTarget();
298+
CtExpression<?> target = fieldRead.getTarget();
299+
300+
assertTrue(target instanceof CtTypeAccess);
301+
assertEquals("Launcher", ((CtTypeAccess<?>) target).getAccessedType().getSimpleName());
302+
}
303+
285304
@Test
286305
public void testTargetsOfInv() throws Exception {
287306
// contract: Specify declaring type of the executable of an invocation, the target of the invocation and its result.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import spoon.Launcher;
2+
3+
public class StaticFieldReadOnly {
4+
public static void main(String[] args) {
5+
Launcher.logger.error("Hello :)");
6+
}
7+
}

0 commit comments

Comments
 (0)