From f87d2034edeee392bf0c4a260ce5daf1aa02e2cf Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Thu, 1 Nov 2012 19:14:43 +0100 Subject: [PATCH] IDEA-93295 Make: removing reference to supertype from subtype does not make client code re-compiled --- .../removeExtendsAffectsFieldAccess.log | 14 +++++++++++ .../GoalSwitch.java.new | 2 ++ .../src/FarClient.java | 5 ++++ .../src/FarGoal.java | 2 ++ .../src/GoalSwitch.java | 2 ++ .../src/SwitchProvider.java | 3 +++ .../removeExtendsAffectsMethodAccess.log | 14 +++++++++++ .../GoalSwitch.java.new | 2 ++ .../src/FarClient.java | 5 ++++ .../src/FarGoal.java | 2 ++ .../src/GoalSwitch.java | 2 ++ .../src/SwitchProvider.java | 5 ++++ .../incremental/common/class2Interface1.log | 2 ++ .../dependencyView/ClassfileAnalyzer.java | 23 +++++++++++++++++++ .../jetbrains/ether/ClassPropertyTest.java | 8 +++++++ 15 files changed, 91 insertions(+) create mode 100644 java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess.log create mode 100644 java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/GoalSwitch.java.new create mode 100644 java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/src/FarClient.java create mode 100644 java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/src/FarGoal.java create mode 100644 java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/src/GoalSwitch.java create mode 100644 java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/src/SwitchProvider.java create mode 100644 java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess.log create mode 100644 java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/GoalSwitch.java.new create mode 100644 java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/src/FarClient.java create mode 100644 java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/src/FarGoal.java create mode 100644 java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/src/GoalSwitch.java create mode 100644 java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/src/SwitchProvider.java diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess.log b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess.log new file mode 100644 index 000000000000..b5fcfd0775a7 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess.log @@ -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 diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/GoalSwitch.java.new b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/GoalSwitch.java.new new file mode 100644 index 000000000000..16eb722625a9 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/GoalSwitch.java.new @@ -0,0 +1,2 @@ +public class GoalSwitch { +} diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/src/FarClient.java b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/src/FarClient.java new file mode 100644 index 000000000000..ad750043e6b5 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/src/FarClient.java @@ -0,0 +1,5 @@ +public class FarClient { + public void context() { + FarGoal goal1 = new SwitchProvider().field; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/src/FarGoal.java b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/src/FarGoal.java new file mode 100644 index 000000000000..99f01d89acff --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/src/FarGoal.java @@ -0,0 +1,2 @@ +public class FarGoal { +} diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/src/GoalSwitch.java b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/src/GoalSwitch.java new file mode 100644 index 000000000000..0a689b2d1e1c --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/src/GoalSwitch.java @@ -0,0 +1,2 @@ +public class GoalSwitch extends FarGoal{ +} diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/src/SwitchProvider.java b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/src/SwitchProvider.java new file mode 100644 index 000000000000..caa9aed83f3d --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsFieldAccess/src/SwitchProvider.java @@ -0,0 +1,3 @@ +public class SwitchProvider { + public GoalSwitch field; +} diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess.log b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess.log new file mode 100644 index 000000000000..61a328d87b8f --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess.log @@ -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 diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/GoalSwitch.java.new b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/GoalSwitch.java.new new file mode 100644 index 000000000000..16eb722625a9 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/GoalSwitch.java.new @@ -0,0 +1,2 @@ +public class GoalSwitch { +} diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/src/FarClient.java b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/src/FarClient.java new file mode 100644 index 000000000000..2b1cc0e2d1aa --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/src/FarClient.java @@ -0,0 +1,5 @@ +public class FarClient { + public void context() { + FarGoal goal2 = new SwitchProvider().method(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/src/FarGoal.java b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/src/FarGoal.java new file mode 100644 index 000000000000..99f01d89acff --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/src/FarGoal.java @@ -0,0 +1,2 @@ +public class FarGoal { +} diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/src/GoalSwitch.java b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/src/GoalSwitch.java new file mode 100644 index 000000000000..0a689b2d1e1c --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/src/GoalSwitch.java @@ -0,0 +1,2 @@ +public class GoalSwitch extends FarGoal{ +} diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/src/SwitchProvider.java b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/src/SwitchProvider.java new file mode 100644 index 000000000000..7b635d0b24f3 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/removeExtendsAffectsMethodAccess/src/SwitchProvider.java @@ -0,0 +1,5 @@ +public class SwitchProvider { + public GoalSwitch method() { + return new GoalSwitch(); + } +} diff --git a/java/java-tests/testData/compileServer/incremental/common/class2Interface1.log b/java/java-tests/testData/compileServer/incremental/common/class2Interface1.log index 1f086cdfa21c..3770845a4c7a 100644 --- a/java/java-tests/testData/compileServer/incremental/common/class2Interface1.log +++ b/java/java-tests/testData/compileServer/incremental/common/class2Interface1.log @@ -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 diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassfileAnalyzer.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassfileAnalyzer.java index 2a999cfe49b0..5e14ff7d89ed 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassfileAnalyzer.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassfileAnalyzer.java @@ -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)); + } + } + }; } diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/ClassPropertyTest.java b/jps/jps-builders/testSrc/org/jetbrains/ether/ClassPropertyTest.java index 5f12194ac03f..d01110e815a0 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/ClassPropertyTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/ClassPropertyTest.java @@ -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(); }