IDEA-93295 Make: removing reference to supertype from subtype does not make client code re-compiled

This commit is contained in:
Eugene Zhuravlev
2012-11-01 19:16:14 +01:00
parent c77150b37d
commit f87d2034ed
15 changed files with 91 additions and 0 deletions
@@ -0,0 +1,14 @@
Cleaning output files:
out/production/RemoveExtendsAffectsFieldAccess/GoalSwitch.class
End of files
Compiling files:
src/GoalSwitch.java
End of files
Cleaning output files:
out/production/RemoveExtendsAffectsFieldAccess/FarClient.class
out/production/RemoveExtendsAffectsFieldAccess/SwitchProvider.class
End of files
Compiling files:
src/FarClient.java
src/SwitchProvider.java
End of files
@@ -0,0 +1,5 @@
public class FarClient {
public void context() {
FarGoal goal1 = new SwitchProvider().field;
}
}
@@ -0,0 +1,2 @@
public class GoalSwitch extends FarGoal{
}
@@ -0,0 +1,3 @@
public class SwitchProvider {
public GoalSwitch field;
}
@@ -0,0 +1,14 @@
Cleaning output files:
out/production/RemoveExtendsAffectsMethodAccess/GoalSwitch.class
End of files
Compiling files:
src/GoalSwitch.java
End of files
Cleaning output files:
out/production/RemoveExtendsAffectsMethodAccess/FarClient.class
out/production/RemoveExtendsAffectsMethodAccess/SwitchProvider.class
End of files
Compiling files:
src/FarClient.java
src/SwitchProvider.java
End of files
@@ -0,0 +1,5 @@
public class FarClient {
public void context() {
FarGoal goal2 = new SwitchProvider().method();
}
}
@@ -0,0 +1,2 @@
public class GoalSwitch extends FarGoal{
}
@@ -0,0 +1,5 @@
public class SwitchProvider {
public GoalSwitch method() {
return new GoalSwitch();
}
}
@@ -7,9 +7,11 @@ End of files
Cleaning output files:
out/production/Class2Interface1/Client$1.class
out/production/Class2Interface1/Client.class
out/production/Class2Interface1/Main.class
out/production/Class2Interface1/SubClient.class
End of files
Compiling files:
src/Client.java
src/Main.java
src/SubClient.java
End of files
@@ -500,6 +500,11 @@ class ClassfileAnalyzer {
if (opcode == Opcodes.PUTFIELD || opcode == Opcodes.PUTSTATIC) {
myUsages.add(UsageRepr.createFieldAssignUsage(myContext, fieldName, fieldOwner, descr));
}
if (opcode == Opcodes.GETFIELD || opcode == Opcodes.GETSTATIC) {
addClassUsage(TypeRepr.getType(myContext, descr));
}
myUsages.add(UsageRepr.createFieldUsage(myContext, fieldName, fieldOwner, descr));
super.visitFieldInsn(opcode, owner, name, desc);
}
@@ -511,9 +516,27 @@ class ClassfileAnalyzer {
myUsages.add(UsageRepr.createMethodUsage(myContext, methodName, methodOwner, desc));
myUsages.add(UsageRepr.createMetaMethodUsage(myContext, methodName, methodOwner, desc));
addClassUsage(TypeRepr.getType(myContext, Type.getReturnType(desc)));
super.visitMethodInsn(opcode, owner, name, desc);
}
private void addClassUsage(final TypeRepr.AbstractType type) {
TypeRepr.ClassType classType = null;
if (type instanceof TypeRepr.ClassType) {
classType = (TypeRepr.ClassType)type;
}
else if (type instanceof TypeRepr.ArrayType) {
final TypeRepr.AbstractType elemType = ((TypeRepr.ArrayType)type).getDeepElementType();
if (elemType instanceof TypeRepr.ClassType) {
classType = (TypeRepr.ClassType)elemType;
}
}
if (classType != null) {
myUsages.add(UsageRepr.createClassUsage(myContext, classType.myClassName));
}
}
};
}
@@ -28,6 +28,14 @@ public class ClassPropertyTest extends IncrementalTestCase {
doTest();
}
public void testRemoveExtendsAffectsFieldAccess() throws Exception {
doTest();
}
public void testRemoveExtendsAffectsMethodAccess() throws Exception {
doTest();
}
public void testRemoveImplements() throws Exception {
doTest();
}