Hi Steve,

The problem is that the signature at the C.doIt() method call matches *both*
the method declaration on C and the method declaration on IC.

http://www.eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html#signatures

So, the pointcut is behaving as spec-ed.

Because of how method call signatures are matched, I do not think it is
possible to do exactly what you want using declare warning only.

However, you can try doing this using a before advice:

before() : !...@target(PublicAPI) && (call(* (!...@publicapi *).*())) {
        throw new RuntimeException("Non public API usage");
}

Notice how this becomes a runtime test.  This will look at the concrete type
of the target at runtime and throw an exception if it does not have the
annotation.

eg-

interface IC
@PublicAPI class C implements IC
class D extends C

IC ic = new C();
ic.doIt();  // OK!   with gutter marker signifying runtime test
ic = new D();
ic.doIt(); // Exception!!! with gutter marker signifying runtime test

This is the best I can do.  Can anyone else do better?

Feel free to raise an enhancement request for your particular situation.


On Tue, Jun 23, 2009 at 8:01 AM, Steve reds <[email protected]> wrote:

>
> Hi Oliver, its not the constructor because if I have another class
>
> @PublicAPI
> class B
> {
>    public void doIt() {
>    }
> }
>
> and call
> new B().doIt();
>
> that does not give me a warning.
>
> I can even have
> @PublicAPI
> class B implements IB
> {
>    public void doIt() {
>    }
> }
>
> public interface IB
> {
> }
>
> and that does not give a warning.
>
> Thanks,
> Steve
>
> --- On Tue, 6/23/09, Oliver Böhm <[email protected]> wrote:
>
> > From: Oliver Böhm <[email protected]>
> > Subject: Re: [aspectj-users] Joinpoint method signature matches
> superclass and not the referenced class
> > To: [email protected]
> > Date: Tuesday, June 23, 2009, 7:09 AM
> > Hello Steve,
> >
> > I guess, it is the constructor call "new C()" who causes
> > the warning, because it has no annotation.
> >
> > rggards
> > Oliver
> >
> >
> >
> > Steve reds schrieb:
> > > Hi, I'm having trouble creating a method signature and
> > I wonder if it is FaD.
> > >
> > > I'm trying to create a pattern for 'declare warning'
> > that identifies all method calls to classes that do not have
> > the annotation - @PublicAPI. The annotation is on the
> > referenced class, not its methods.
> > >
> > > The pattern I am using is:
> > > declare warning : call(* (!...@publicapi *).*(..)) : "Non
> > public API usage";
> > >
> > > In the following case I don't expect a warning but one
> > is generated:
> > >
> > > public class Main
> > > {
> > >     public static void
> > main(String[] args) {
> > >         // Generates
> > warning even though C is @PublicAPI
> > >         new C().doIt();
> > >     }
> > > }
> > >
> > > @PublicAPI
> > > class C implements IC
> > > {
> > >     public void doIt() {
> > >     }
> > > }
> > >
> > > public interface IC
> > > {
> > >     public void doIt();
> > > }
> > >
> > > Shouldn't the signature match doIt() in C and not the
> > one in IC since only C is referenced in Main?
> > >
> > > Thanks,
> > > Steve
> > >
> > >
> > >
> >    _______________________________________________
> > > aspectj-users mailing list
> > > [email protected]
> > > https://dev.eclipse.org/mailman/listinfo/aspectj-users
> >
> > -- Oliver Böhm
> > http://www.javatux.de
> > _______________________________________________
> > aspectj-users mailing list
> > [email protected]
> > https://dev.eclipse.org/mailman/listinfo/aspectj-users
> >
>
>
>
> _______________________________________________
> aspectj-users mailing list
> [email protected]
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
_______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to