diff --git a/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge.log b/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge.log new file mode 100644 index 000000000000..7e4d3f2324db --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge.log @@ -0,0 +1,12 @@ +Cleaning output files: +out/production/ReplaceMethodWithBridge/stubs/StubBase.class +End of files +Compiling files: +src/stubs/StubBase.java +End of files +Cleaning output files: +out/production/ReplaceMethodWithBridge/ppp/Util.class +End of files +Compiling files: +src/ppp/Util.java +End of files \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/ppp/Util.java b/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/ppp/Util.java new file mode 100644 index 000000000000..cc39da5550aa --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/ppp/Util.java @@ -0,0 +1,11 @@ +package ppp; + +import stubs.StubBase; +import stubs.StubElement; + +public class Util { + public void calcParent(StubBase stub) { // using raw type 'StubBase', this is important! + final StubElement parent = stub.getParentStub(); + } +} + diff --git a/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/stubs/ObjectStubBase.java b/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/stubs/ObjectStubBase.java new file mode 100644 index 000000000000..75f9eb5b445e --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/stubs/ObjectStubBase.java @@ -0,0 +1,9 @@ +package stubs; + +public class ObjectStubBase implements Stub { + protected T myParent; + + public T getParentStub() { + return myParent; + } +} diff --git a/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/stubs/Stub.java b/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/stubs/Stub.java new file mode 100644 index 000000000000..14fa5cd60193 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/stubs/Stub.java @@ -0,0 +1,5 @@ +package stubs; + +public interface Stub { + Stub getParentStub(); +} diff --git a/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/stubs/StubBase.java b/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/stubs/StubBase.java new file mode 100644 index 000000000000..31f8f63bed48 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/stubs/StubBase.java @@ -0,0 +1,7 @@ +package stubs; + +public class StubBase extends ObjectStubBase implements StubElement{ + public StubElement getParentStub() { + return myParent; + } +} diff --git a/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/stubs/StubBase.java.new b/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/stubs/StubBase.java.new new file mode 100644 index 000000000000..d8578927179e --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/stubs/StubBase.java.new @@ -0,0 +1,4 @@ +package stubs; + +public class StubBase extends ObjectStubBase implements StubElement{ +} diff --git a/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/stubs/StubElement.java b/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/stubs/StubElement.java new file mode 100644 index 000000000000..19cf10311339 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/membersChange/replaceMethodWithBridge/src/stubs/StubElement.java @@ -0,0 +1,5 @@ +package stubs; + +public interface StubElement extends Stub{ + StubElement getParentStub(); +} diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Mappings.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Mappings.java index bbdd6d6b900b..1840d40415b5 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Mappings.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Mappings.java @@ -327,7 +327,7 @@ public class Mappings { final MethodRepr memberMethod = (MethodRepr)member; return memberMethod.name == m.name && Arrays.equals(memberMethod.myArgumentTypes, m.myArgumentTypes); } - return member.name == m.name; + return false; } }, className); } @@ -1482,11 +1482,17 @@ public class Mappings { } } else if ((d.base() & Difference.ACCESS) != 0) { - if ((d.addedModifiers() & Opcodes.ACC_STATIC) != 0 || - (d.removedModifiers() & Opcodes.ACC_STATIC) != 0 || - (d.addedModifiers() & Opcodes.ACC_PRIVATE) != 0) { + if ((d.addedModifiers() & (Opcodes.ACC_STATIC | Opcodes.ACC_PRIVATE | Opcodes.ACC_SYNTHETIC | Opcodes.ACC_BRIDGE)) != 0 || + (d.removedModifiers() & Opcodes.ACC_STATIC) != 0) { + + // When synthetic or bridge flags are added, this effectively means that explicitly written in the code + // method with the same signature and return type has been removed and a bridge method has been generated instead. + // In some cases (e.g. using raw types) the presence of such synthetic methods in the bytecode is ignored by the compiler + // so that the code that called such method via raw type reference might not compile anymore => to be on the safe side + // we should recompile all places where the method was used + if (!affected) { - debug("Added static or private specifier or removed static specifier --- affecting method usages"); + debug("Added {static | private | synthetic | bridge} specifier or removed static specifier --- affecting method usages"); myFuture.affectMethodUsages(m, propagated, m.createUsage(myContext, it.name), usages, state.myDependants); state.myAffectedUsages.addAll(usages); affected = true; diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/MemberChangeTest.java b/jps/jps-builders/testSrc/org/jetbrains/ether/MemberChangeTest.java index 4aa6801eb933..e5d75175ef90 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/MemberChangeTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/MemberChangeTest.java @@ -210,4 +210,8 @@ public class MemberChangeTest extends IncrementalTestCase { public void testAddVarargMethod() { doTest(); } + + public void testReplaceMethodWithBridge() { + doTest(); + } }