Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: fix regression when rewriting static field access #3115

Merged
merged 36 commits into from
Sep 23, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
24fd54d
@monperrus at work 😺
monperrus Sep 15, 2019
99de49e
@monperrus at work 😺
monperrus Sep 15, 2019
bfdd8e0
@monperrus at work 😺
monperrus Sep 15, 2019
eecccc7
@monperrus at work 😺
monperrus Sep 15, 2019
a4c2252
@monperrus at work 😺
monperrus Sep 15, 2019
2cc7112
@monperrus at work 😺
monperrus Sep 15, 2019
7c3d8f9
@monperrus at work 😺
monperrus Sep 15, 2019
1ab81a9
@monperrus at work 😺
monperrus Sep 15, 2019
8ed4feb
@monperrus at work 😺
monperrus Sep 15, 2019
1f39867
@monperrus at work 😺
monperrus Sep 15, 2019
9b315be
@monperrus at work 😺
monperrus Sep 15, 2019
b30abae
@monperrus at work 😺
monperrus Sep 15, 2019
7509808
@monperrus at work 😺
monperrus Sep 15, 2019
198d5fa
up
monperrus Sep 15, 2019
6e7bb85
@monperrus at work 😺
monperrus Sep 15, 2019
fe84afd
@monperrus at work 😺
monperrus Sep 15, 2019
5f21d0c
Merge branch 'master' into fix-reg-toString
monperrus Sep 19, 2019
0313e1b
up
monperrus Sep 19, 2019
9f36a08
@monperrus at work 📚
monperrus Sep 19, 2019
d4d3886
Merge branch 'ref-toStringWithImport' into fix-reg-toString
monperrus Sep 19, 2019
476b1c5
up
monperrus Sep 19, 2019
e10a1d6
Merge branch 'master' into fix-reg-toString
monperrus Sep 20, 2019
8cdc9b1
@monperrus at work 🧢
monperrus Sep 20, 2019
a6c2bb4
@monperrus at work 🃏
monperrus Sep 20, 2019
0219011
@monperrus at work 🎶
monperrus Sep 20, 2019
808bdb7
@monperrus at work 🎑
monperrus Sep 21, 2019
dd02b70
@monperrus at work 💸
monperrus Sep 21, 2019
ee1cfcf
@monperrus at work 📈
monperrus Sep 21, 2019
6f1cd56
@monperrus at work 😛
monperrus Sep 21, 2019
dfcf3cf
@monperrus at work 👕
monperrus Sep 21, 2019
85e6e0f
@monperrus at work ☸
monperrus Sep 22, 2019
725c638
@monperrus at work 🤺
monperrus Sep 22, 2019
6629df9
@monperrus at work 🎍
monperrus Sep 22, 2019
cfb58f8
@monperrus at work 🚧
monperrus Sep 22, 2019
6e843d7
@monperrus at work ➖
monperrus Sep 22, 2019
4550c5e
Merge branch 'master' into fix-reg-toString
monperrus Sep 23, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@ private boolean isSupertypeOfNewClass(CtTypeReference<?> typeRef) {
@Override
protected void handleTargetedExpression(CtTargetedExpression<?, ?> targetedExpression, LexicalScope nameScope) {
CtExpression<?> target = targetedExpression.getTarget();
if (target == null) {
return;
}
if (!target.isImplicit()) {
return;
}
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/spoon/reflect/visitor/ForceImportProcessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
package spoon.reflect.visitor;

import spoon.reflect.code.CtExpression;
import spoon.reflect.code.CtFieldAccess;
import spoon.reflect.code.CtTargetedExpression;
import spoon.reflect.code.CtThisAccess;
import spoon.reflect.code.CtTypeAccess;
Expand Down Expand Up @@ -67,6 +68,12 @@ protected void handleTypeReference(CtTypeReference<?> reference, LexicalScope na
@Override
protected void handleTargetedExpression(CtTargetedExpression<?, ?> targetedExpression, LexicalScope nameScope) {
CtExpression<?> target = targetedExpression.getTarget();
if (target == null) {
if (targetedExpression instanceof CtFieldAccess && ((CtFieldAccess) targetedExpression).getVariable().getDeclaringType() != null) {
((CtFieldAccess) targetedExpression).getVariable().getDeclaringType().setSimplyQualified(true);
}
return;
}
if (target.isImplicit()) {
return;
}
Expand Down
5 changes: 0 additions & 5 deletions src/main/java/spoon/reflect/visitor/ImportAnalyzer.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import spoon.processing.AbstractProcessor;
import spoon.processing.Processor;
import spoon.reflect.code.CtConstructorCall;
import spoon.reflect.code.CtExpression;
import spoon.reflect.code.CtTargetedExpression;
import spoon.reflect.declaration.CtCompilationUnit;
import spoon.reflect.declaration.CtElement;
Expand Down Expand Up @@ -191,10 +190,6 @@ protected void onEnter(U context, CtRole role, CtElement element) {

if (element instanceof CtTargetedExpression) {
CtTargetedExpression<?, ?> targetedExpression = (CtTargetedExpression<?, ?>) element;
CtExpression<?> target = targetedExpression.getTarget();
if (target == null) {
return;
}
handleTargetedExpression(targetedExpression, context);
} else if (element instanceof CtTypeReference<?>) {
//we have to visit only PURE CtTypeReference. No CtArrayTypeReference, CtTypeParameterReference, ...
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/spoon/reflect/visitor/ImportCleaner.java
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,14 @@ protected void handleTargetedExpression(CtTargetedExpression<?, ?> targetedExpre
return;
}
CtExpression<?> target = targetedExpression.getTarget();
if (target == null) {
if (targetedExpression instanceof CtFieldAccess
&& ((CtFieldAccess) targetedExpression).getVariable().getDeclaringType() != null
&& ((CtFieldAccess) targetedExpression).getVariable().getDeclaringType().isSimplyQualified()) {
context.addImport(((CtFieldAccess) targetedExpression).getVariable().getDeclaringType());
}
return;
}

if (target != null && target.isImplicit()) {
if (target instanceof CtTypeAccess) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ protected LexicalScope getScannerContextInformation() {
@Override
protected void handleTargetedExpression(CtTargetedExpression<?, ?> targetedExpression, LexicalScope nameScope) {
CtExpression<?> target = targetedExpression.getTarget();
if (target == null) {
return;
}
if (targetedExpression instanceof CtFieldAccess<?>) {
CtFieldAccess<?> fieldAccess = (CtFieldAccess<?>) targetedExpression;
if (target.isImplicit()) {
Expand Down
35 changes: 35 additions & 0 deletions src/test/java/spoon/test/field/FieldTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,15 @@
import spoon.reflect.CtModel;
import spoon.reflect.code.CtFieldRead;
import spoon.reflect.code.CtReturn;
import spoon.reflect.code.CtVariableAccess;
import spoon.reflect.declaration.CtClass;
import spoon.reflect.declaration.CtField;
import spoon.reflect.declaration.CtMethod;
import spoon.reflect.declaration.ModifierKind;
import spoon.reflect.factory.Factory;
import spoon.reflect.reference.CtFieldReference;
import spoon.reflect.reference.CtTypeReference;
import spoon.reflect.reference.CtVariableReference;
import spoon.reflect.visitor.filter.TypeFilter;
import spoon.support.reflect.eval.VisitorPartialEvaluator;
import spoon.test.field.testclasses.A;
Expand Down Expand Up @@ -174,4 +176,37 @@ public void getFQNofFieldReference() {
assertEquals("field", fieldReference.getSimpleName());
assertEquals("<unknown>#field", fieldReference.getQualifiedName());
}

@Test
public void bugAfterRefactoringImports() {
Launcher launcher = new Launcher();
Factory factory = launcher.getFactory();
final CtClass<?> klass = factory.createClass("foo.A");

final CtFieldRead<Object> fieldRead = factory.createFieldRead();

final CtField<Object> negative_infinity = (CtField<Object>) factory.Class().get(Double.class).getField("NEGATIVE_INFINITY");
fieldRead.setVariable(negative_infinity.getReference());

launcher.getEnvironment().setAutoImports(false);
assertEquals("java.lang.Double.NEGATIVE_INFINITY", fieldRead.toString());

launcher.getEnvironment().setAutoImports(true);
assertEquals("Double.NEGATIVE_INFINITY", fieldRead.toString());

final CtField<Object> field = (CtField<Object>) factory.Class().get(File.class).getField("separator");
fieldRead.setVariable(field.getReference());
field.setDefaultExpression(fieldRead);
klass.addField(field);

launcher.getEnvironment().setAutoImports(true);
assertEquals("package foo;\n" +
"import java.io.File;\n" +
"class A {\n" +
" public static final String separator = File.separator;\n" +
"}", klass.toStringWithImports());

}


}