From 724823aa185922c9d2fd13a0c56049862d3ec0bb Mon Sep 17 00:00:00 2001 From: Andy Clement Date: Wed, 11 Apr 2012 17:33:59 -0700 Subject: [PATCH] declare annotation on type XML support --- .../loadtime/ConcreteAspectCodeGen.java | 37 +++++++++++------- tests/bugs170/xmldefs/Anno7.java | 5 +++ tests/bugs170/xmldefs/Hello7.java | 39 +++++++++++++++++++ tests/bugs170/xmldefs/aop7.xml | 13 +++++++ 4 files changed, 80 insertions(+), 14 deletions(-) create mode 100644 tests/bugs170/xmldefs/Anno7.java create mode 100644 tests/bugs170/xmldefs/Hello7.java create mode 100644 tests/bugs170/xmldefs/aop7.xml diff --git a/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java b/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java index bc6695e3e..620b84874 100644 --- a/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java +++ b/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java @@ -63,6 +63,7 @@ import org.aspectj.weaver.patterns.NamePattern; import org.aspectj.weaver.patterns.PatternParser; import org.aspectj.weaver.patterns.PerClause; import org.aspectj.weaver.patterns.PerSingleton; +import org.aspectj.weaver.patterns.TypePattern; /** * Generates bytecode for concrete-aspect. @@ -551,23 +552,31 @@ public class ConcreteAspectCodeGen { if (constructedAnnotation==null) { return; // error occurred (and was reported), do not continue } + + String nameComponent = da.declareAnnotationKind.name().toLowerCase(); + String declareName = new StringBuilder("ajc$declare_at_").append(nameComponent).append("_").append(decCounter).toString(); + LazyMethodGen declareMethod = new LazyMethodGen(Modifier.PUBLIC, Type.VOID, declareName, Type.NO_ARGS, EMPTY_STRINGS, cg); + InstructionList declareMethodBody = declareMethod.getBody(); + declareMethodBody.append(InstructionFactory.RETURN); + declareMethod.addAnnotation(constructedAnnotation); + + DeclareAnnotation deca = null; + ITokenSource tokenSource = BasicTokenSource.makeTokenSource(da.pattern,null); + PatternParser pp = new PatternParser(tokenSource); + if (da.declareAnnotationKind==DeclareAnnotationKind.Method || da.declareAnnotationKind==DeclareAnnotationKind.Field) { - String declareName = new StringBuilder("ajc$declare_at_").append(da.declareAnnotationKind==DeclareAnnotationKind.Method?"method":"field").append("_").append(decCounter).toString(); - LazyMethodGen declareMethod = new LazyMethodGen(Modifier.PUBLIC, Type.VOID, declareName, Type.NO_ARGS, EMPTY_STRINGS, cg); - InstructionList declareMethodBody = declareMethod.getBody(); - declareMethodBody.append(InstructionFactory.RETURN); - declareMethod.addAnnotation(constructedAnnotation); - - ITokenSource tokenSource = BasicTokenSource.makeTokenSource(da.pattern,null); - PatternParser pp = new PatternParser(tokenSource); ISignaturePattern isp = (da.declareAnnotationKind==DeclareAnnotationKind.Method?pp.parseCompoundMethodOrConstructorSignaturePattern(true):pp.parseCompoundFieldSignaturePattern()); - DeclareAnnotation deca = new DeclareAnnotation(da.declareAnnotationKind==DeclareAnnotationKind.Method?DeclareAnnotation.AT_METHOD:DeclareAnnotation.AT_FIELD, isp); - deca.setAnnotationMethod(declareName); - deca.setAnnotationString(da.annotation); - AjAttribute attribute = new AjAttribute.DeclareAttribute(deca); - cg.addAttribute(attribute); - cg.addMethodGen(declareMethod); + deca = new DeclareAnnotation(da.declareAnnotationKind==DeclareAnnotationKind.Method?DeclareAnnotation.AT_METHOD:DeclareAnnotation.AT_FIELD, isp); + } else if (da.declareAnnotationKind==DeclareAnnotationKind.Type) { + TypePattern tp = pp.parseTypePattern(); + deca = new DeclareAnnotation(DeclareAnnotation.AT_TYPE,tp); } + + deca.setAnnotationMethod(declareName); + deca.setAnnotationString(da.annotation); + AjAttribute attribute = new AjAttribute.DeclareAttribute(deca); + cg.addAttribute(attribute); + cg.addMethodGen(declareMethod); } /** diff --git a/tests/bugs170/xmldefs/Anno7.java b/tests/bugs170/xmldefs/Anno7.java new file mode 100644 index 000000000..36fdeb361 --- /dev/null +++ b/tests/bugs170/xmldefs/Anno7.java @@ -0,0 +1,5 @@ +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Anno7 { +} diff --git a/tests/bugs170/xmldefs/Hello7.java b/tests/bugs170/xmldefs/Hello7.java new file mode 100644 index 000000000..ed43f0145 --- /dev/null +++ b/tests/bugs170/xmldefs/Hello7.java @@ -0,0 +1,39 @@ +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.util.Collections; +import java.util.*; + +public class Hello7 { + + + public static void main(String[] args) { + printAnnos(Hello7.class); + } + + public static void printAnnos(Class clazz) { + try { + Annotation[] annos = clazz.getAnnotations(); + System.out.println("Annotations on "+clazz.getName()+"? "+(annos!=null && annos.length!=0)); + if (annos!=null && annos.length>0) { + List la = new ArrayList(); + for (Annotation anno: annos) { + la.add(anno); + } + Collections.sort(la,new AnnoComparator()); + + System.out.println("Annotation count is "+annos.length); + for (Annotation anno: la) { + System.out.println(anno); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + static class AnnoComparator implements Comparator { + public int compare(Annotation a, Annotation b) { + return a.toString().compareTo(b.toString()); + } + } +} diff --git a/tests/bugs170/xmldefs/aop7.xml b/tests/bugs170/xmldefs/aop7.xml new file mode 100644 index 000000000..048163f3a --- /dev/null +++ b/tests/bugs170/xmldefs/aop7.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + -- 2.39.5