In the 1.0 language 
  design we decided that you could only use statically resolvable pcds in 
  declare eow statements.  It’s possible that this didn’t make it into the 
  docs, but this was a clear part of the language design for 
  1.0.
   
  The 1.0 version of 
  ajc would detect any use of if, cflow, this, target or args for a declare eow 
  and produce a compile time error.  Apparently, when we did the re-write 
  for 1.1, we neglected to include this error check.
   
  I think that for 1.2 
  we should restore the simple error check of 1.0 that forbids the use of these 
  non-statically resolvable pcds.  This might break some existing programs 
  that are “getting away with it”, but that seems a small price to pay for 
  keeping this simple and understandable rule about what can and can’t be used 
  in declare eow.  Any programs that might break will do so in a clear and 
  unambiguous way with this new error message, so it won’t cause any subtle 
  problems for people.
   
  If you decide to 
  allow the special cases where this, target and args ARE statically 
  determinable you’ll have to go through the implementation and make sure that’s 
  what you’re doing.  The current implementation was not designed to 
  support this because I had assumed that the original test from 1.1 prohibiting 
  any use of these pcds in declare eow was in place.
   
  BTW – dynamic residue 
  is a term used for the implementation of AspectJ.  It’s used in Erik’s 
  and my implementation paper.  I think it does a great job of describing 
  the runtime tests that can be left over when weaving join point shadows in the 
  implementation.  This term was never intended for user-level 
  docs.
   
  -Jim
   
  
  
  
  
  
  From: 
  aspectj-dev-admin@xxxxxxxxxxx [mailto:aspectj-dev-admin@xxxxxxxxxxx] On Behalf Of Adrian Colyer
Sent: Monday, February 23, 2004 9:05 
  AM
To: 
  aspectj-dev@xxxxxxxxxxx
Subject: Re: [aspectj-dev] Use of 
  non-statically resolvable pointcut designators in declare 
  error/warning.
 
   
  
As a follow-up - 
  Andy & I went searching all through our docs looking for the place where 
  we say that you can only use statically evaluable pointcuts in declare eow 
  statements, but I couldn't find it clearly stated anywhere. (I half recall 
  seeing a list that said "You can only use the following pcds..." but if it's 
  there, I couldn't find it). 
I think the 
  simplest thing for users to understand is a compilation error if any of this, 
  target, args, cflow, cflowbelow or 'if' are used in the pointcut _expression_ 
  associated with a deow. But, this might break many existing programs that are 
  currently "getting away with it." 
The next best 
  option seems to me to be to emit a compiler warning saying that "xxx pcd 
  cannot be used in declare error or warning statements and will be ignored." 
  (And then of course, make sure that we really do ignore it). Given our current 
  position, this is possibly what we should do for 1.2 (leaving us the option to 
  make it an error in 1.3 once programs have been tidied up 
  perhaps?). 
Both of these options have 
  the drawback of not supporting some deow tests that would have succumbed to 
  full static evaluation. If that's important enough, we could consider warning 
  only when a non-statically determinable situation occurs - but what I dislike 
  about this option is that this can't be determined when compiling the aspect, 
  but only during shadow matching (which could be at a completely different time 
  if e.g. you are binary weaving). 
So I think at 
  the moment I'm leaning towards:= 
1) making the 
  docs clearer about exactly which pcds are supported for deow, 
  and 
2) following a 
  warn-and-ignore strategy for violations of that policy 
  
Open to counter-arguments 
  though... 
-- 
  Adrian
Adrian_Colyer@xxxxxxxxxx 
  
    
    
      |   | Andrew 
        Clement/UK/IBM@IBMGB Sent by: 
        aspectj-dev-admin@xxxxxxxxxxx
 23/02/2004 
        16:16 Please respond to 
        aspectj-dev
 |         
        To:       
         aspectj-dev@xxxxxxxxxxx
 cc:
 Subject:        [aspectj-dev] Use of 
        non-statically resolvable pointcut designators in declare 
        error/warning.
 | 
  
Hi, 
  
I'm looking at a bug 
  on this - and I noticed someone else mailed 
the list on a similar topic 
  earlier today. 
Eric Bodden reported a 
  problem with using if() in a declare 
warning/error message.  This was 
  a ClassCastException - which of 
course 
  I'll fix - but it made me think more about what our 
position is on 
  allowing users to use pointcuts that can't 
be wholely resolved at 
  compile time with the declare error/warning 
mechanism. 
  
At the moment, if a 
  pointcut cannot be entirely statically 
evaluated 
  then it will behave as if it has matched and the error 
or warning message 
  will be produced.  I don't think this is 
quite what we 
  want. 
However, it is not 
  clear whether we should be flagging an 
error if any of the designators 
  that exhibit this behavior 
are used against declare error/warning or if we 
  should be 
flagging an error/warning if it just the case that the entire 
  
pointcut cannot be completely resolved statically.  There are 
  
some designators that *could* lead to runtime tests but might 
not if 
  there is enough static info around.  For example 
target()/this() may 
  or may not create an instanceof test for 
execution at runtime depending on 
  what the compiler can 
determine statically. 
So, we have the 
  options: 
Error/Warning if we 
  see a declare error/warning statement whose 
pointcut uses any of 
  the designators that *might* 
lead to 
  dynamic residue. 
Error/Warning if we 
  see a declare error/warning statement whose 
pointcut cannot be 
  completely statically evaluated. 
Any 
  comments? 
Andy. 
  
--- 
  
Andy 
  Clement 
AJDT/AspectJ 
  Development