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)

Bug reported:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=389752

On Mon, Sep 17, 2012 at 1:31 PM, Matthew Adams <matthew@xxxxxxxxxxxxxxx> wrote:
If you get my bitbucket repo at HEAD and try changing the 'declare parents' lines in PersistableJpaAspect and/or PersistableMongoAspect to use the enums instead of the annotations, you should see that the annotations don't match.  AJDT markers don't show outgoing "Declared On" markers and intended ITDs aren't reflected in target classes (JpaLongPerson/JpaStringPerson/MongoLongPerson/MongoStringPerson in src/test/java).

I'll enter bug now & include as much as I can.

-matthew

On Mon, Sep 17, 2012 at 11:30 AM, Andy Clement <andrew.clement@xxxxxxxxx> wrote:
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
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users



--
mailto:matthew@xxxxxxxxxxxxxxx 



--
mailto:matthew@xxxxxxxxxxxxxxx 
skype:matthewadams12
googletalk:matthew@xxxxxxxxxxxxxxx
http://matthewadams.me
http://www.linkedin.com/in/matthewadams


Back to the top