@@ -1161,6 +1161,7 @@ public class ReferenceType extends ResolvedType { | |||
annotations = null; | |||
annotationTypes = null; | |||
newSuperclass = null; | |||
bits = 0; // clears the hierarchy complete tag (amongst other things) | |||
newInterfaces = null; | |||
typeVariables = null; | |||
parameterizedInterfaces.clear(); | |||
@@ -1168,7 +1169,7 @@ public class ReferenceType extends ResolvedType { | |||
if (getDelegate() != null) { | |||
delegate.ensureConsistent(); | |||
} | |||
if (isRawType()) { | |||
if (isParameterizedOrRawType()) { | |||
ReferenceType genericType = getGenericType(); | |||
if (genericType != null) { | |||
genericType.ensureConsistent(); |
@@ -50,7 +50,7 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl | |||
protected World world; | |||
private int bits; | |||
protected int bits; | |||
private static int AnnotationBitsInitialized = 0x0001; | |||
private static int AnnotationMarkedInherited = 0x0002; | |||
@@ -2803,10 +2803,18 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl | |||
} | |||
public void tagAsTypeHierarchyComplete() { | |||
if (isParameterizedOrRawType()) { | |||
ReferenceType genericType = this.getGenericType(); | |||
genericType.tagAsTypeHierarchyComplete(); | |||
return; | |||
} | |||
bits |= TypeHierarchyCompleteBit; | |||
} | |||
public boolean isTypeHierarchyComplete() { | |||
if (isParameterizedOrRawType()) { | |||
return this.getGenericType().isTypeHierarchyComplete(); | |||
} | |||
return (bits & TypeHierarchyCompleteBit) != 0; | |||
} | |||
@@ -0,0 +1,8 @@ | |||
package test; | |||
public abstract class ClassProj1<T> implements InterfaceProj1<String> { | |||
public int aMethod() { | |||
return 1; | |||
} | |||
} |
@@ -0,0 +1,9 @@ | |||
package test.extender; | |||
public abstract class ClassProj2<T> implements InterfaceProj2<T> { | |||
public int bMethod() { | |||
return 2; | |||
} | |||
} |
@@ -0,0 +1,10 @@ | |||
package test.extender; | |||
import test.*; | |||
public aspect Extender2 { | |||
declare parents: InterfaceProj1 extends java.io.Serializable; | |||
// declare parents: test.ClassProj1 extends ClassProj2; | |||
} |
@@ -0,0 +1,10 @@ | |||
package test.extender; | |||
import test.*; | |||
public aspect Extender3 { | |||
declare parents: InterfaceProj1 extends InterfaceProj2; | |||
declare parents: test.ClassProj1 extends ClassProj2; | |||
} |
@@ -21,10 +21,6 @@ import org.aspectj.testing.XMLBasedAjcTestCase; | |||
* @author Andy Clement | |||
*/ | |||
public class Ajc181Tests extends org.aspectj.testing.XMLBasedAjcTestCase { | |||
public void testJarWeaving_433351() { | |||
runTest("jar weaving"); | |||
} | |||
public void testParameterNamesAttribute_436531() { | |||
runTest("parameter names attribute"); |
@@ -2,13 +2,6 @@ | |||
<suite> | |||
<ajc-test dir="bugs181/433351" title="jar weaving"> | |||
<compile options="-1.5" files="InterfaceProj1.java" outjar="code.jar"/> | |||
<compile options="-1.5 -showWeaveInfo" inpath="code.jar" files="Extender.aj InterfaceProj2.java"> | |||
<message kind="weave" text="Extending interface set for type 'test.InterfaceProj1' (InterfaceProj1.java) to include 'test.extender.InterfaceProj2' (Extender.aj)"/> | |||
</compile> | |||
</ajc-test> | |||
<ajc-test dir="bugs181/436531" title="parameter names attribute"> | |||
<compile options="-1.8" files="Azpect.java" inpath="code.jar"/> | |||
</ajc-test> |
@@ -22,6 +22,22 @@ import org.aspectj.testing.XMLBasedAjcTestCase; | |||
*/ | |||
public class Ajc189Tests extends org.aspectj.testing.XMLBasedAjcTestCase { | |||
public void testJarWeaving_433351() { | |||
runTest("jar weaving"); | |||
} | |||
public void testJarWeaving_433351_4() { | |||
runTest("jar weaving 4"); | |||
} | |||
public void testJarWeaving_433351_3() { | |||
runTest("jar weaving 3"); | |||
} | |||
public void testJarWeaving_433351_2() { | |||
runTest("jar weaving 2"); | |||
} | |||
public void testNPEAtAspectJ() throws Exception { | |||
runTest("NPE at aspectj"); | |||
} |
@@ -12,7 +12,6 @@ package org.aspectj.systemtest.ajc189; | |||
import junit.framework.Test; | |||
import junit.framework.TestSuite; | |||
import org.aspectj.systemtest.apt.AptTests; | |||
public class AllTestsAspectJ189 { | |||
@@ -2,6 +2,35 @@ | |||
<suite> | |||
<ajc-test dir="bugs189/433351" title="jar weaving"> | |||
<compile options="-1.5" files="InterfaceProj1.java" outjar="code.jar"/> | |||
<compile options="-1.5 -showWeaveInfo" inpath="code.jar" files="Extender.aj InterfaceProj2.java"> | |||
<message kind="weave" text="Extending interface set for type 'test.InterfaceProj1' (InterfaceProj1.java) to include 'test.extender.InterfaceProj2' (Extender.aj)"/> | |||
</compile> | |||
</ajc-test> | |||
<ajc-test dir="bugs189/433351" title="jar weaving 2"> | |||
<compile options="-1.5" files="InterfaceProj1.java ClassProj1.java" outjar="code.jar"/> | |||
<compile options="-1.5 -showWeaveInfo" inpath="code.jar" files="Extender2.aj" outjar="code2.jar"> | |||
<message kind="weave" text="Extending interface set for type 'test.InterfaceProj1' (InterfaceProj1.java) to include 'java.io.Serializable' (Extender2.aj)"/> | |||
</compile> | |||
</ajc-test> | |||
<ajc-test dir="bugs189/433351" title="jar weaving 3"> | |||
<compile options="-1.5" files="InterfaceProj1.java ClassProj1.java" outjar="code.jar"/> | |||
<compile options="-1.5 -showWeaveInfo" inpath="code.jar" files="Extender3.aj InterfaceProj2.java ClassProj2.java" outjar="code2.jar"> | |||
<message kind="weave" text="Setting superclass of type 'test.ClassProj1' (ClassProj1.java) to 'test.extender.ClassProj2' (Extender3.aj)"/> | |||
<message kind="weave" text="Extending interface set for type 'test.InterfaceProj1' (InterfaceProj1.java) to include 'test.extender.InterfaceProj2' (Extender3.aj)"/> | |||
</compile> | |||
</ajc-test> | |||
<ajc-test dir="bugs189/433351" title="jar weaving 4"> | |||
<compile options="-1.5" files="ClassProj1.java InterfaceProj1.java" outjar="code.jar"/> | |||
<compile options="-1.5 -showWeaveInfo" inpath="code.jar" files="Extender2.aj" outjar="code2.jar"> | |||
<message kind="weave" text="Extending interface set for type 'test.InterfaceProj1' (InterfaceProj1.java) to include 'java.io.Serializable' (Extender2.aj)"/> | |||
</compile> | |||
</ajc-test> | |||
<ajc-test dir="bugs189/485583" title="NPE at aspectj"> | |||
<compile files="Foo.aj Bar.aj" options="-1.8"> | |||
<message kind="error" text="The abstract pointcut deprecatedCode can only be defined in an aspect"/> |
@@ -1323,7 +1323,11 @@ public class BcelWeaver { | |||
} | |||
ContextToken tok = CompilationAndWeavingContext.enteringPhase(CompilationAndWeavingContext.PROCESSING_DECLARE_PARENTS, | |||
resolvedTypeToWeave.getName()); | |||
weaveParentTypeMungers(resolvedTypeToWeave); | |||
// If A was processed before B (and was declared 'class A implements B') then there is no need to complete B again, it | |||
// will have been done whilst processing A. | |||
if (!resolvedTypeToWeave.isTypeHierarchyComplete()) { | |||
weaveParentTypeMungers(resolvedTypeToWeave); | |||
} | |||
CompilationAndWeavingContext.leavingPhase(tok); | |||
typesForWeaving.remove(typeToWeave); | |||
resolvedTypeToWeave.tagAsTypeHierarchyComplete(); |