|
View:
New views
5 Messages
—
Rating Filter:
Alert me
|
|
|
Joinpoint method signature matches superclass and not the referenced classHi, 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 aspectj-users@... https://dev.eclipse.org/mailman/listinfo/aspectj-users |
|
|
Re: Joinpoint method signature matches superclass and not the referenced classHello 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 > aspectj-users@... > https://dev.eclipse.org/mailman/listinfo/aspectj-users -- Oliver Böhm http://www.javatux.de _______________________________________________ aspectj-users mailing list aspectj-users@... https://dev.eclipse.org/mailman/listinfo/aspectj-users |
|
|
|
|
|
Re: Joinpoint method signature matches superclass and not the referenced classHi 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 <stevebread@...> wrote:
_______________________________________________ aspectj-users mailing list aspectj-users@... https://dev.eclipse.org/mailman/listinfo/aspectj-users |
|
|
|
| Free embeddable forum powered by Nabble | Forum Help |