Browse Source

Fix 526734 - Incorrect generic override decp validation when binary weaving

tags/V1_9_0_RC3
Andy Clement 6 years ago
parent
commit
6765fdc34c

+ 8
- 0
tests/bugs1813/generics/A.java View File

@@ -0,0 +1,8 @@
import java.util.List;


public interface A<T extends BaseT, I extends BaseI> {

public T setInputs(List<I> inputs);

}

+ 15
- 0
tests/bugs1813/generics/AlreadyImplementsA.java View File

@@ -0,0 +1,15 @@

import java.util.List;


public class AlreadyImplementsA {


public ConcreteTImpl setInputs(List<ConcreteIImpl> inputs) {
return null;
}




}

+ 7
- 0
tests/bugs1813/generics/BaseI.java View File

@@ -0,0 +1,7 @@


public interface BaseI {



}

+ 4
- 0
tests/bugs1813/generics/BaseT.java View File

@@ -0,0 +1,4 @@

public interface BaseT {

}

+ 8
- 0
tests/bugs1813/generics/BindInterfaceA.aj View File

@@ -0,0 +1,8 @@


public aspect BindInterfaceA {

declare parents: AlreadyImplementsA implements A<ConcreteTImpl,ConcreteIImpl>;


}

+ 5
- 0
tests/bugs1813/generics/ConcreteIImpl.java View File

@@ -0,0 +1,5 @@


public class ConcreteIImpl implements BaseI {

}

+ 6
- 0
tests/bugs1813/generics/ConcreteTImpl.java View File

@@ -0,0 +1,6 @@


public class ConcreteTImpl implements BaseT {


}

+ 7
- 0
tests/bugs1813/generics/Runner.java View File

@@ -0,0 +1,7 @@
public class Runner {
public static void main(String[] argv) {
if (new AlreadyImplementsA() instanceof A) {
System.out.println("ok");
}
}
}

+ 7
- 0
tests/src/org/aspectj/systemtest/ajc1811/Ajc1811Tests.java View File

@@ -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() {

+ 17
- 0
tests/src/org/aspectj/systemtest/ajc1811/ajc1811.xml View File

@@ -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&lt;ConcreteTImpl,ConcreteIImpl&gt;' (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&lt;ConcreteTImpl,ConcreteIImpl&gt;' (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">

+ 14
- 1
weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java View File

@@ -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;
}
}
}
}
}

Loading…
Cancel
Save