See https://bugs.eclipse.org/bugs/show_bug.cgi?id=366085. See https://stackoverflow.com/q/74618269/1082681. The issue described in the Bugzilla issue is about 'declare @type', but similar issues also existed for 'declare @field', 'declare @method', 'declare @constructor'. This fix is rather superficial and leaves things to be desired, because it is rather hacky and simply ignores errors source retention annotation declarations during weaving. A better fix would drop the corresponding declarations while parsing and also issue compiler warnings in each case. Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>tags/V1_9_19
int idx = 0; | int idx = 0; | ||||
if (annos.length > 0 | if (annos.length > 0 | ||||
&& annos[0].getType().getSignature().equals("Lorg/aspectj/internal/lang/annotation/ajcDeclareAnnotation;")) { | && annos[0].getType().getSignature().equals("Lorg/aspectj/internal/lang/annotation/ajcDeclareAnnotation;")) { | ||||
if (annos.length < 2) | |||||
continue; | |||||
idx = 1; | idx = 1; | ||||
} | } | ||||
annotation = annos[idx]; | annotation = annos[idx]; | ||||
int idx = 0; | int idx = 0; | ||||
if (annoTypes[0].getSignature().equals("Lorg/aspectj/internal/lang/annotation/ajcDeclareAnnotation;")) { | if (annoTypes[0].getSignature().equals("Lorg/aspectj/internal/lang/annotation/ajcDeclareAnnotation;")) { | ||||
idx = 1; | idx = 1; | ||||
if (annoTypes.length < 2) | |||||
continue; | |||||
} | } | ||||
annotationType = annoTypes[idx]; | annotationType = annoTypes[idx]; | ||||
break; | break; |
public class Application { | |||||
public int number; | |||||
public Application(int number) { | |||||
this.number = number; | |||||
} | |||||
public int getNumber() { | |||||
return number; | |||||
} | |||||
} |
public aspect DeclareAnnotationsAspect { | |||||
// These should be ignored, because @ToString has SOURCE retention | |||||
declare @type : Application : @ToString; | |||||
declare @method : * Application.*(..) : @ToString; | |||||
declare @constructor : Application.new(..) : @ToString; | |||||
declare @field : * Application.* : @ToString; | |||||
// These should be applied, because @Marker has RUNTIME retention | |||||
declare @type : Application : @Marker; | |||||
declare @method : * Application.*(..) : @Marker; | |||||
declare @constructor : Application.new(..) : @Marker; | |||||
declare @field : * Application.* : @Marker; | |||||
} |
import java.lang.annotation.Retention; | |||||
import java.lang.annotation.RetentionPolicy; | |||||
@Retention(RetentionPolicy.RUNTIME) | |||||
public @interface Marker { } |
import java.lang.annotation.Retention; | |||||
import java.lang.annotation.RetentionPolicy; | |||||
@Retention(RetentionPolicy.SOURCE) | |||||
public @interface ToString { } |
*/ | */ | ||||
public class Bugs1919Tests extends XMLBasedAjcTestCase { | public class Bugs1919Tests extends XMLBasedAjcTestCase { | ||||
public void testDummyBug() { | |||||
//runTest("dummy Java 19 bug"); | |||||
public void testDeclareAnnotationWithSourceRetention() { | |||||
runTest("declare annotation with SOURCE retention"); | |||||
} | } | ||||
public static Test suite() { | public static Test suite() { |
</run> | </run> | ||||
</ajc-test> | </ajc-test> | ||||
<!-- Currently, there are no bugfixes with tests in this AspectJ vesion --> | |||||
<ajc-test dir="bugs1919/github_99999" vm="19" title="dummy Java 19"> | |||||
</ajc-test> | |||||
<!-- Weaver error when declaring annotation with SOURCE retention, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=366085 --> | |||||
<ajc-test dir="bugs1919/366085" vm="1.5" title="declare annotation with SOURCE retention"> | |||||
<compile files="Application.java DeclareAnnotationsAspect.aj ToString.java Marker.java" options="-1.5 -showWeaveInfo"> | |||||
<message kind="weave" text="'Application' (Application.java:1) is annotated with @Marker type annotation from 'DeclareAnnotationsAspect'"/> | |||||
<message kind="weave" text="'public void Application.new(int)' (Application.java:4) is annotated with @Marker constructor annotation from 'DeclareAnnotationsAspect'"/> | |||||
<message kind="weave" text="'public int Application.getNumber()' (Application.java:8) is annotated with @Marker method annotation from 'DeclareAnnotationsAspect'"/> | |||||
<message kind="weave" text="'public int number' of type 'Application' (Application.java) is annotated with @Marker field annotation from 'DeclareAnnotationsAspect'"/> | |||||
</compile> | |||||
</ajc-test> | |||||
</suite> | </suite> |
if (annotationsToAdd == null) { | if (annotationsToAdd == null) { | ||||
annotationsToAdd = new ArrayList<>(); | annotationsToAdd = new ArrayList<>(); | ||||
} | } | ||||
AnnotationGen a = ((BcelAnnotation) decaM.getAnnotation()).getBcelAnnotation(); | |||||
BcelAnnotation decaMAnnotation = (BcelAnnotation) decaM.getAnnotation(); | |||||
if (decaMAnnotation == null) { | |||||
unusedDecams.remove(decaM); | |||||
continue; | |||||
} | |||||
AnnotationGen a = decaMAnnotation.getBcelAnnotation(); | |||||
AnnotationGen ag = new AnnotationGen(a, clazz.getConstantPool(), true); | AnnotationGen ag = new AnnotationGen(a, clazz.getConstantPool(), true); | ||||
annotationsToAdd.add(ag); | annotationsToAdd.add(ag); | ||||
mg.addAnnotation(decaM.getAnnotation()); | mg.addAnnotation(decaM.getAnnotation()); | ||||
// go through all the declare @field statements | // go through all the declare @field statements | ||||
for (DeclareAnnotation decaf : decafs) { | for (DeclareAnnotation decaf : decafs) { | ||||
if (decaf.getAnnotation() == null) { | if (decaf.getAnnotation() == null) { | ||||
return false; | |||||
unusedDecafs.remove(decaf); | |||||
continue; | |||||
} | } | ||||
if (decaf.matches(field, world)) { | if (decaf.matches(field, world)) { | ||||
if (decaf.isRemover()) { | if (decaf.isRemover()) { |