@@ -0,0 +1,8 @@ | |||
import java.util.List; | |||
public interface A<T extends BaseT, I extends BaseI> { | |||
public T setInputs(List<I> inputs); | |||
} |
@@ -0,0 +1,15 @@ | |||
import java.util.List; | |||
public class AlreadyImplementsA { | |||
public ConcreteTImpl setInputs(List<ConcreteIImpl> inputs) { | |||
return null; | |||
} | |||
} |
@@ -0,0 +1,7 @@ | |||
public interface BaseI { | |||
} |
@@ -0,0 +1,4 @@ | |||
public interface BaseT { | |||
} |
@@ -0,0 +1,8 @@ | |||
public aspect BindInterfaceA { | |||
declare parents: AlreadyImplementsA implements A<ConcreteTImpl,ConcreteIImpl>; | |||
} |
@@ -0,0 +1,5 @@ | |||
public class ConcreteIImpl implements BaseI { | |||
} |
@@ -0,0 +1,6 @@ | |||
public class ConcreteTImpl implements BaseT { | |||
} |
@@ -0,0 +1,7 @@ | |||
public class Runner { | |||
public static void main(String[] argv) { | |||
if (new AlreadyImplementsA() instanceof A) { | |||
System.out.println("ok"); | |||
} | |||
} | |||
} |
@@ -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() { |
@@ -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"> |
@@ -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; | |||
} | |||
} | |||
} | |||
} | |||
} |