diff options
author | Andy Clement <aclement@pivotal.io> | 2017-11-01 15:08:27 -0700 |
---|---|---|
committer | Andy Clement <aclement@pivotal.io> | 2017-11-01 15:31:10 -0700 |
commit | 6765fdc34c775e99799b36d88cff8ab88dffc8e7 (patch) | |
tree | 13f35d56861a8685bd7bc20db34f3ae99a94bb91 | |
parent | dc89660c13270539cf9ff71d288086631a658665 (diff) | |
download | aspectj-6765fdc34c775e99799b36d88cff8ab88dffc8e7.tar.gz aspectj-6765fdc34c775e99799b36d88cff8ab88dffc8e7.zip |
Fix 526734 - Incorrect generic override decp validation when binary weaving
-rw-r--r-- | tests/bugs1813/generics/A.java | 8 | ||||
-rw-r--r-- | tests/bugs1813/generics/AlreadyImplementsA.java | 15 | ||||
-rw-r--r-- | tests/bugs1813/generics/BaseI.java | 7 | ||||
-rw-r--r-- | tests/bugs1813/generics/BaseT.java | 4 | ||||
-rw-r--r-- | tests/bugs1813/generics/BindInterfaceA.aj | 8 | ||||
-rw-r--r-- | tests/bugs1813/generics/ConcreteIImpl.java | 5 | ||||
-rw-r--r-- | tests/bugs1813/generics/ConcreteTImpl.java | 6 | ||||
-rw-r--r-- | tests/bugs1813/generics/Runner.java | 7 | ||||
-rw-r--r-- | tests/src/org/aspectj/systemtest/ajc1811/Ajc1811Tests.java | 7 | ||||
-rw-r--r-- | tests/src/org/aspectj/systemtest/ajc1811/ajc1811.xml | 17 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java | 15 |
11 files changed, 98 insertions, 1 deletions
diff --git a/tests/bugs1813/generics/A.java b/tests/bugs1813/generics/A.java new file mode 100644 index 000000000..85ec82ea2 --- /dev/null +++ b/tests/bugs1813/generics/A.java @@ -0,0 +1,8 @@ +import java.util.List; + + +public interface A<T extends BaseT, I extends BaseI> { + + public T setInputs(List<I> inputs); + +}
\ No newline at end of file diff --git a/tests/bugs1813/generics/AlreadyImplementsA.java b/tests/bugs1813/generics/AlreadyImplementsA.java new file mode 100644 index 000000000..56f650d03 --- /dev/null +++ b/tests/bugs1813/generics/AlreadyImplementsA.java @@ -0,0 +1,15 @@ + +import java.util.List; + + +public class AlreadyImplementsA { + + + public ConcreteTImpl setInputs(List<ConcreteIImpl> inputs) { + return null; + } + + + + +}
\ No newline at end of file diff --git a/tests/bugs1813/generics/BaseI.java b/tests/bugs1813/generics/BaseI.java new file mode 100644 index 000000000..31f975853 --- /dev/null +++ b/tests/bugs1813/generics/BaseI.java @@ -0,0 +1,7 @@ + + +public interface BaseI { + + + +}
\ No newline at end of file diff --git a/tests/bugs1813/generics/BaseT.java b/tests/bugs1813/generics/BaseT.java new file mode 100644 index 000000000..72046e956 --- /dev/null +++ b/tests/bugs1813/generics/BaseT.java @@ -0,0 +1,4 @@ + +public interface BaseT { + +}
\ No newline at end of file diff --git a/tests/bugs1813/generics/BindInterfaceA.aj b/tests/bugs1813/generics/BindInterfaceA.aj new file mode 100644 index 000000000..2d3e56965 --- /dev/null +++ b/tests/bugs1813/generics/BindInterfaceA.aj @@ -0,0 +1,8 @@ + + +public aspect BindInterfaceA { + + declare parents: AlreadyImplementsA implements A<ConcreteTImpl,ConcreteIImpl>; + + +} diff --git a/tests/bugs1813/generics/ConcreteIImpl.java b/tests/bugs1813/generics/ConcreteIImpl.java new file mode 100644 index 000000000..3cbdac163 --- /dev/null +++ b/tests/bugs1813/generics/ConcreteIImpl.java @@ -0,0 +1,5 @@ + + +public class ConcreteIImpl implements BaseI { + +} diff --git a/tests/bugs1813/generics/ConcreteTImpl.java b/tests/bugs1813/generics/ConcreteTImpl.java new file mode 100644 index 000000000..aba55be3a --- /dev/null +++ b/tests/bugs1813/generics/ConcreteTImpl.java @@ -0,0 +1,6 @@ + + +public class ConcreteTImpl implements BaseT { + + +} diff --git a/tests/bugs1813/generics/Runner.java b/tests/bugs1813/generics/Runner.java new file mode 100644 index 000000000..6d4468b0f --- /dev/null +++ b/tests/bugs1813/generics/Runner.java @@ -0,0 +1,7 @@ +public class Runner { + public static void main(String[] argv) { + if (new AlreadyImplementsA() instanceof A) { + System.out.println("ok"); + } + } +} diff --git a/tests/src/org/aspectj/systemtest/ajc1811/Ajc1811Tests.java b/tests/src/org/aspectj/systemtest/ajc1811/Ajc1811Tests.java index 4e6013507..80729f894 100644 --- a/tests/src/org/aspectj/systemtest/ajc1811/Ajc1811Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc1811/Ajc1811Tests.java @@ -63,6 +63,7 @@ public class Ajc1811Tests extends org.aspectj.testing.XMLBasedAjcTestCase { // public Outer<String>.Inner m2() { ... } } + // // public void testMultiArgs_509235() { // runTest("multiargs"); @@ -72,6 +73,12 @@ public class Ajc1811Tests extends org.aspectj.testing.XMLBasedAjcTestCase { // runTest("multiargs - no ellipsis"); // } + // 1.8.13: + + public void testAjcGenerics() { + runTest("generics"); + } + // --- public static Test suite() { diff --git a/tests/src/org/aspectj/systemtest/ajc1811/ajc1811.xml b/tests/src/org/aspectj/systemtest/ajc1811/ajc1811.xml index f4e321e5c..fe59c3595 100644 --- a/tests/src/org/aspectj/systemtest/ajc1811/ajc1811.xml +++ b/tests/src/org/aspectj/systemtest/ajc1811/ajc1811.xml @@ -6,6 +6,23 @@ <compile options="-1.8" files="Code.java"/> </ajc-test> + <ajc-test dir="bugs1813/generics" title="generics"> + <!-- this order works reliably --> + <compile options="-1.8 -showWeaveInfo" files="A.java AlreadyImplementsA.java BaseI.java BaseT.java BindInterfaceA.aj ConcreteIImpl.java ConcreteTImpl.java Runner.java"> + <message kind="weave" text="Extending interface set for type 'AlreadyImplementsA' (AlreadyImplementsA.java) to include 'A<ConcreteTImpl,ConcreteIImpl>' (BindInterfaceA.aj)"/> + </compile> + + <!-- this order was failing --> + <compile options="-1.8 -showWeaveInfo" files="AlreadyImplementsA.java BaseI.java BaseT.java BindInterfaceA.aj ConcreteIImpl.java ConcreteTImpl.java A.java Runner.java "> + <message kind="weave" text="Extending interface set for type 'AlreadyImplementsA' (AlreadyImplementsA.java) to include 'A<ConcreteTImpl,ConcreteIImpl>' (BindInterfaceA.aj)"/> + </compile> + <run class="Runner"> + <stdout> + <line text="ok"/> + </stdout> + </run> + </ajc-test> + <ajc-test dir="bugs1811/509235" title="multiargs"> <compile options="-1.8" files="Code.java"/> <run class="Code"> diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java b/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java index 9768cb9e4..c82c352ae 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java @@ -352,8 +352,21 @@ public class BcelTypeMunger extends ConcreteTypeMunger { && targetMethod.getBackingGenericMember().getParameterSignature().equals(newParentMethodSig)) { discoveredImpl = targetMethod; } else if (newParentMethod.hasBackingGenericMember()) { - if (newParentMethod.getBackingGenericMember().getParameterSignature().equals(targetMethodSignature)) { + if (newParentMethod.getBackingGenericMember().getParameterSignature().equals(targetMethodSignature)) { // newParentMethod.getBackingGenericMember().getParameterSignature gives: (Pjava/util/List<TI;>;) targetMethodSignature= (Ljava/util/List;) discoveredImpl = targetMethod; + } else if (targetMethod instanceof BcelMethod) { + // BcelMethod does not have backing generic member set (need to investigate why). For now, special case here: + UnresolvedType[] targetMethodGenericParameterTypes = targetMethod.getGenericParameterTypes(); + if (targetMethodGenericParameterTypes !=null) { + StringBuilder b = new StringBuilder("("); + for (UnresolvedType p: targetMethodGenericParameterTypes) { + b.append(p.getSignature()); + } + b.append(')'); + if (b.toString().equals(newParentMethodSig)) { + discoveredImpl = targetMethod; + } + } } } } |