Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] type pattern not matching when annotation values are enum instances (or psf Strings)

I just tried this sample:

==== C.java ===
package com.foo.bar;

import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Persistable {
        IdType id() default IdType.STRING;
}

enum IdType {
	STRING, LONG;
}

interface I {}

@Persistable()
public class C {}

@Persistable(id=IdType.LONG)
class D {}

aspect X {
	declare parents: (@Persistable(id=IdType.STRING) *) implements I;
}
===

and it does work as expected (C gets the interface). My hunch is that
it is a compilation ordering thing so I might need a real failing
project to show the issue.

Andy

On 17 September 2012 09:06, Andy Clement <andrew.clement@xxxxxxxxx> wrote:
> Supporting all the possible annotation value types is a lot of work
> (for each piece of syntax where they might appear).  Typically the
> most common are added first, and others later.  So usually string
> first, then others on request and I can imagine enum being down the
> list.  However, normally AspectJ throws an error if you use one that
> isn't yet supported (and the exception tells you to go and ask for
> it!), so maybe that isn't what is happening in this case.. (I haven't
> investigated). Please open a bug, but it sounds like your inconsistent
> class file thing is more pressing.
>
> cheers,
> Andy
>
> On 13 September 2012 14:35, Matthew Adams <matthew@xxxxxxxxxxxxxxx> wrote:
>> Consider the following annotation:
>>
>> @Target(TYPE)
>> @Retention(RUNTIME)
>> public @interface Persistable {
>>
>>         StoreType in() default StoreType.MONGO;
>>
>>         IdType id() default IdType.STRING;
>> }
>>
>> I'm attempting to match a type pattern in a declare parents based on
>> the id() property of the annotation:
>>
>>         declare parents :
>>         (@Persistable(id=IdType.LONG) *)
>>         implements L;
>>
>>         declare parents :
>>         (@Persistable(id=IdType.STRING) *)
>>         implements S;
>>
>> These aren't matching successfully.  However, if I change the
>> annotation to use Strings instead (like the following), the matching
>> starts working.
>>
>> @Target(TYPE)
>> @Retention(RUNTIME)
>> public @interface Persistable {
>>
>>         String in() default "MONGO";
>>
>>         String id() default "STRING";
>> }
>> =====
>>         declare parents :
>>         (@Persistable(id="LONG") *)
>>         implements L;
>>
>>         declare parents :
>>         (@Persistable(id="STRING") *)
>>         implements S;
>>
>> Interestingly, if I create psf Strings for the values in the
>> annotation type and try to use those, like I show below, it fails to
>> match again.
>>
>> @Target(TYPE)
>> @Retention(RUNTIME)
>> @Trait
>> public @interface Persistable {
>>
>>         public static final String MONGO = "MONGO";
>>         public static final String JPA = "JPA";
>>         public static final String JDO = "JDO";
>>
>>         public static final String STRING = "STRING";
>>         public static final String LONG = "LONG";
>>
>>         String in() default "MONGO";
>>
>>         String id() default "STRING";
>> }
>> =====
>>         declare parents :
>>         (@Persistable(id=Persistable.LONG) *)
>>         implements L;
>>
>>         declare parents :
>>         (@Persistable(id=Persistable.STRING) *)
>>         implements S;
>>
>> The same is true if I move the psf Strings to an interface as well.
>>
>> Am I doing something wrong?
>>
>> -matthew
>> --
>> mailto:matthew@xxxxxxxxxxxxxxx
>> skype:matthewadams12
>> googletalk:matthew@xxxxxxxxxxxxxxx
>> http://matthewadams.me
>> http://www.linkedin.com/in/matthewadams
>> _______________________________________________
>> aspectj-users mailing list
>> aspectj-users@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/aspectj-users


Back to the top