Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Understanding generic types in args(..) construction

Tomorrow night I'll do some more complex tests on it.
Thanks for your help

On Sun, Nov 9, 2008 at 11:28 PM, Fernando Rubbo <fernando.rubbo@xxxxxxxxx> wrote:
I'm so sorry.. That was MY mistake..
I took a look on my tests and I saw I forgot to import java.util.ArrayList. That is why I got the incorrect result.
I just import the java.util.ArrayList and got the same result you just post here.. Again, I apologize.

Tomorrow night I




On Fri, Nov 7, 2008 at 1:31 PM, Andy Clement <andrew.clement@xxxxxxxxx> wrote:
Which dev build did you use?  I downloaded the currently available one (aspectj-DEVELOPMENT-20081103213827.jar) and get different results to you.  My results are on the line before each piece of advice below - the only problem where it does not do as expected is marked ERROR below.

aspect AC{
    // matches

    void around(): execution(* C.m1(..))  && args(List<Integer>){} //: Should match (it does)   

    // matches with runtime check

    void around(): execution(* C.m1(..))  && args(ArrayList<Integer>){}//: Should runtime check (it does not match!)

    // does not match

    void around(): execution(* C.m1(..))  && args(List<Number>){}//: Should not match (it does not!)   

    // does not match
    void around(): execution(* C.m1(..))  && args(ArrayList<Number>){}//: Should not match (it does not)

    // matches

    void around(): execution(* C.m1(..))  && args(List<? extends Number>){}//: Should match (it does)

    // matches with runtime test

    void around(): execution(* C.m1(..))  && args(ArrayList<? extends Number>){}//: Should runtime check (it does not match!)

    // matches

    void around(): execution(* C.m1(..))  && args(List){}//: Should match (it does)   

    // ERROR: currently does not match and should (with runtime test)

    void around(): execution(* C.m1(..))  && args(ArrayList){}//: Should runtime check (it does not match!)   

    // matches

    void around(): execution(* C.m1(..))  && args(List<?>){}//: Should match (it does)   

    // matches with runtime test

    void around(): execution(* C.m1(..))  && args(ArrayList<?>){}//: Should runtime check (it does not match!)   

    // does not match

    void around(): execution(* C.m1(..))  && args(ArrayList<String>){}//: Should not match (it does not match!)
}

And your around advice case return value testcase doesn't match with that current dev build either.

cheers,
Andy.


2008/11/4 Fernando Rubbo <fernando.rubbo@xxxxxxxxx>

Hi Andy,,

I did a simple test on this new aspectj development build and it is not working for runtime check.

public class C {
    void m1(List<Integer> e){}   
}

aspect AC{
    void around(): execution(* C.m1(..))  && args(List<Integer>){} //: Should match (it does)   
    void around(): execution(* C.m1(..))  && args(ArrayList<Integer>){}//: Should runtime check (it does not match!)
    void around(): execution(* C.m1(..))  && args(List<Number>){}//: Should not match (it does not!)   
    void around(): execution(* C.m1(..))  && args(ArrayList<Number>){}//: Should not match (it does not)
    void around(): execution(* C.m1(..))  && args(List<? extends Number>){}//: Should match (it does)
    void around(): execution(* C.m1(..))  && args(ArrayList<? extends Number>){}//: Should runtime check (it does not match!)
    void around(): execution(* C.m1(..))  && args(List){}//: Should match (it does)   
    void around(): execution(* C.m1(..))  && args(ArrayList){}//: Should runtime check (it does not match!)   
    void around(): execution(* C.m1(..))  && args(List<?>){}//: Should match (it does)   
    void around(): execution(* C.m1(..))  && args(ArrayList<?>){}//: Should runtime check (it does not match!)   
    void around(): execution(* C.m1(..))  && args(ArrayList<String>){}//: Should not match (it does not match!)
}

Thanks,
Fernando


On Tue, Nov 4, 2008 at 2:29 PM, Andy Clement <andrew.clement@xxxxxxxxx> wrote:
Try it with the dev build from yesterday that includes the latest set of 253109 fixes

2008/11/3 Fernando Rubbo <fernando.rubbo@xxxxxxxxx>
I think we have a similar issue with the around's return. Look it out.

public class B {
    List<Number> m(){ return null;}
}

aspect AB{
    List<Integer> around() : execution(List<*> B.*(..)) {
        return proceed();
    }
}

List<Integer> is not subtype of List<Number>.

Fernando Rubbo



On Mon, Nov 3, 2008 at 9:08 PM, Fernando Rubbo <fernando.rubbo@xxxxxxxxx> wrote:

On 2-nov-08, at 02:27, Fernando Rubbo wrote:
There exists a formal description saying how args(..) and after(..) returning (..) must works?

The best description is probably:
http://www.eclipse.org/aspectj/doc/released/adk15notebook/generics-inAspectJ5.html#d0e2512

That is quite old, but is currently the best we have written down.  Anyone wishing to help us update the doc, please let me know.

If it will gonna respect Java subtyping it is simple to document. We just need to put a note informing that and a reference for Java spec  (The Java Language Specification Third Edition) chapter 4.10 - Subtyping.

Fernando Rubbo


_______________________________________________
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



_______________________________________________
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




Back to the top