Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Parameters

I should have spoken more carefully.  In AspectJ 1.0,
given

    someMethod(Type a, Type b) { ... }

, with the code

   before() : args(.., Type, ..) ...

there is no error and the pointcut matches, but with

   before(Type t) : args(.., t, ..) ...

there is an incompatible bindings error.

Wes

Gregor Kiczales wrote:
Mumble, I should have checked that before sending mail.

But it seems odd for this to generate a compiler warning. When pointcuts
don't match, they usually just don't match. They don't issue a warning
that says they might match, if only things were a little different.

This probably requires re-examination at some point.


-----Original Message-----
From: aspectj-users-admin@xxxxxxxxxxx [mailto:aspectj-users-admin@xxxxxxxxxxx] On Behalf Of Wes Isberg
Sent: Wednesday, August 20, 2003 11:50 AM
To: aspectj-users@xxxxxxxxxxx
Subject: Re: [aspectj-users] Parameters


Works for me in AspectJ 1.0; see below.

For Gregor's case "foo(Type, Type)", the compiler issues
an error message about incompatible bindings.

Wes

----- output
 src $ aspectj-1.0 -d classes -classpath $ajrt Args.java
 src $ j4 -classpath "classes;$ajrt" Args
call(void Args.one(String)): Hello, World!
execution(void Args.one(String)): Hello, World!
call(void Args.first(String, int, long)): Hello, World!
execution(void Args.first(String, int, long)): Hello, World!
call(void Args.middle(int, String, long)): Hello, World!
execution(void Args.middle(int, String, long)): Hello, World!
call(void Args.last(int, long, String)): Hello, World!
execution(void Args.last(int, long, String)): Hello, World!
call(void java.io.PrintStream.println(String)): Hello, World!
Hello, World!

----- Args.java

public class Args {
    public static void main(String[] a) {
        one("Hello, World!");
    }
    static void none() {
        throw new Error("here");
    }
    static void one(String s) {
        first(s, 0, 0l);
    }
    static void first(String s, int i, long j) {
        middle(i, s, j);
    }
    static void middle(int i, String s, long j) {
        last(i, j, s);
    }
    static void last(int i, long j, String s) {
        System.out.println(s);
    }
    // would get compiler error here
//    static void last(String s, String t) {
//        System.out.println(s);
//    }
}
aspect A {
    before(String s) : !within(A) && args(..,s,..) {
        System.out.println(thisJoinPointStaticPart + ": " + s);
    }
}

DiFrango, Ron wrote:

Wes,

Thanks for your answer and it does not work in 1.0 as that

is the version I

am on currently. Actually it was what I expected. I am

surprised that I am

one of the first to bring this up.

I personally would like to see the ability to use multiple

wildcards in a

PCD. The main driver for me is that I am retrofitting old

code and I would

prefer to keep the pre-existing interfaces as much intact

as possible.

Should I submit a bug report on this?

Thanks,

Ron DiFrango


-----Original Message-----
From: Wes Isberg [mailto:wes@xxxxxxxxxxxxxx] Sent: Wednesday, August 20, 2003 12:03 AM
To: aspectj-users@xxxxxxxxxxx
Subject: Re: [aspectj-users] Parameters


  args(.., ClassX, ..)

should have worked in AspectJ 1.0, but, as Erik noted for 1.1,

  We did not implement the handling of more than one ..
  wildcard in args PCDs (rarely encountered in the wild)
  because we didn't have the time. This might be available
  in later releases if there is significant outcry



http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/aspect
j-home/doc/REA

DME-11.html#language

I'm not sure if a bug would qualify as a significant

outcry, but it would be

a place others could chime in.

(Also, it's a doc bug that ".." in args(...) is not better

documented. I

couldn't find it in either quick reference or the programming guide
semantics appendix; perhaps my search was bad.)

A workaround for now is to test the args directly, perhaps

even in an if

pointcut:

aspect A {
   private static boolean hasArg(Class c, Object[] args) {
        for (int i = 0; i < args.length; i++) {
           if ((null != args[i]) &&
              c.isAssignableFrom(args[i].getClass())) {
              return true;
           }
        }
        return false;
   }
before() : ... && if(hasArg(ClassX.class,

thisJoinPoint.getArgs()) {

       ...
   }
}

Obviously, that won't pick out a null ClassX arg, and it
can be expensive, depending on the rest of your pointcut.

Wes


DiFrango, Ron wrote:



All,

I could not find an answer to this in any of the old

postings. I have
methods that take a common parameter. The problem is that

depending
on the method call this parameter may be listed anywhere in

the method
signature. So for example:

	public class ParametersInMethodCalls
	{
		public void example1(ClassX x, double I, String s)
		{
		}

		public void example2(int I, ClassX x, double d)
		{
		}

		public void example2(float I, String s, ClassX x)
		{
		}
	}

My question is can I define a pointcuts that picks out all

the above
combinations without having to "code if you will" the different permutations possible? I have tried the following examples/permutations:

pointcut examples(ClassX x) : execution(public * ParametersInMethodCalls.*(..))
		&& args(.., x);

	==> Afected example2

pointcut examples(ClassX x) : execution(public * ParametersInMethodCalls.*(..))
		&& args(x, ..);

	==> Afected example1

pointcut examples(ClassX x) : execution(public * ParametersInMethodCalls.*(..))
		&& args(*, x);

	==> Affect nothing

The important thing to note is that all the methods I want

to pick out
have the common input of ClassX, but there is an

indeterminate number
of other parameters to these methods. Furthermore, I would

prefer to
avoid having to change the underlying code as it affects a

large body
of code.

Thanks in advance,

Ron DiFrango

************************************************************

**********

****
The information transmitted herewith is sensitive

information intended

only


for use by the individual or entity to which it is addressed. If the

reader


of this message is not the intended recipient, you are

hereby notified

that


any review, retransmission, dissemination, distribution,

copying or other

use of, or taking of any action in reliance upon this information is
strictly prohibited. If you have received this

communication in error,

please contact the sender and delete the material from your

computer.

_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users



_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users



**************************************************************
************

The information transmitted herewith is sensitive

information intended only

for use by the individual or entity to which it is

addressed. If the reader

of this message is not the intended recipient, you are

hereby notified that

any review, retransmission, dissemination, distribution,

copying or other

use of, or taking of any action in reliance upon this information is
strictly prohibited. If you have received this

communication in error,

please contact the sender and delete the material from your

computer.

_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users


_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users




_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users




Back to the top