Browse Source

Support annotation conversion for class annotation values

Issue: https://bugs.eclipse.org/bugs/show_bug.cgi?id=474165
tags/V1_8_7
Andy Clement 8 years ago
parent
commit
7a61a0d50d

+ 7
- 15
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseAnnotationConvertor.java View File

@@ -14,6 +14,7 @@ package org.aspectj.ajdt.internal.compiler.lookup;
import org.aspectj.apache.bcel.classfile.annotation.ElementValue;
import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation;
import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ArrayInitializer;
import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess;
import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression;
import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MarkerAnnotation;
import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MemberValuePair;
@@ -33,6 +34,7 @@ import org.aspectj.weaver.AnnotationAJ;
import org.aspectj.weaver.AnnotationNameValuePair;
import org.aspectj.weaver.AnnotationValue;
import org.aspectj.weaver.ArrayAnnotationValue;
import org.aspectj.weaver.ClassAnnotationValue;
import org.aspectj.weaver.EnumAnnotationValue;
import org.aspectj.weaver.ResolvedType;
import org.aspectj.weaver.SimpleAnnotationValue;
@@ -218,24 +220,14 @@ public class EclipseAnnotationConvertor {
}
} else {
// class type
if (defaultValue instanceof ClassLiteralAccess) {
ClassLiteralAccess cla = (ClassLiteralAccess)defaultValue;
ClassAnnotationValue cav = new ClassAnnotationValue(new String(cla.targetType.signature()));
return cav;
}
throw new MissingImplementationException(
"Please raise an AspectJ bug. AspectJ does not know how to convert this annotation value [" + defaultValue
+ "]");
// if (contentsOffset + 3 >= this.contents.length) {
// resizeContents(3);
// }
// contents[contentsOffset++] = (byte) 'c';
// if (defaultValue instanceof ClassLiteralAccess) {
// ClassLiteralAccess classLiteralAccess = (ClassLiteralAccess)
// defaultValue;
// final int classInfoIndex =
// constantPool.literalIndex(classLiteralAccess
// .targetType.signature());
// contents[contentsOffset++] = (byte) (classInfoIndex >> 8);
// contents[contentsOffset++] = (byte) classInfoIndex;
// } else {
// contentsOffset = attributeOffset;
// }
}
} else {
throw new MissingImplementationException(

+ 20
- 0
tests/bugs187/474165/B.java View File

@@ -0,0 +1,20 @@
// HasMethod with anno value matching

@interface I {
Class i();
}
aspect A {
declare parents: hasmethod(@I(i=String.class) * *(..)) implements java.io.Serializable;
}

public class B {
@I(i=String.class) public void m() {}
public static void main(String []argv) {
B b = new B();
if (!(b instanceof java.io.Serializable)) throw new IllegalStateException("");
}
}
class C {
@I(i=Integer.class) public void m() {}
}


+ 4
- 0
tests/src/org/aspectj/systemtest/ajc187/Ajc187Tests.java View File

@@ -24,6 +24,10 @@ import org.aspectj.testing.XMLBasedAjcTestCase;
*/
public class Ajc187Tests extends org.aspectj.testing.XMLBasedAjcTestCase {

public void testAnnoConversion_474165() throws Exception {
runTest("anno conversion");
}
public void testLambda_470633() throws Exception {
runTest("lambda");
}

+ 7
- 0
tests/src/org/aspectj/systemtest/ajc187/ajc187.xml View File

@@ -19,4 +19,11 @@
<compile files="Maps.java" options="-1.8"/>
</ajc-test>

<ajc-test dir="bugs187/474165" title="anno conversion">
<compile files="B.java" options="-XhasMember -1.8 -showWeaveInfo">
<message kind="weave" text="Extending interface set for type 'B' (B.java) to include 'java.io.Serializable' (B.java)"/>
</compile>
<run class="B"></run>
</ajc-test>

</suite>

Loading…
Cancel
Save