[JSR308] Javac Processor API

Niko Matsakis niko at alum.mit.edu
Thu Mar 1 11:16:37 EST 2007


Hello,

It may be better to wait to pose this question until the reference  
implementation is available, but I am wondering whether JSR308 is  
considering any change in the scheduling of Annotation Processors  
within Javac.  In the official document, it seems that no major  
changes are planned to the A.P. interface.

As I understand the javac code --- and my understanding may well be  
limited --- compilation currently takes place in four "main" stages:  
Parsing, Annotation Processing, Attribution, Flow Checking.  These  
stages are then followed by desugaring and code generation.

My concern is that if annotation processors using the Tree API  
attempt to check the additional type annotations, they will run  
before any attribution of the parse trees is done.  As a result,  
these processors have no access to higher-level semantic information  
(in fact, there are no accessors for this kind of information in the  
Tree API).  For example, if they see an expression like "foo.bar",  
they do not know whether foo is a local variable or a field, or what  
the type of "bar" is.  It seems that even the most rudimentary type  
systems will require the ability to trace a field reference to its  
definition.

While it would be possible for every AP to duplicate this same logic,  
it would only be an invitation to bugs.  It would be far superior to  
allow certain annotation processors to run later on fully attributed  
(or even flow-checked) trees.

I can see a couple of concerns right away, but I'm sure there are more:

* Annotation Processors today can create new classes which need to be  
processed in turn.  If annotation processing were added after the  
attribution phase, then there would need to be a way for the  
annotation phase to restart to process these newly created classes.   
Alternatively, annotations could run at both times, and perhaps would  
only be permitted to create new classes in the first phase.

* The Tree API would need to be expanded to include symbol  
information.  This would make it harder to change javac in the  
future.  However, given the amount of information already exposed by  
the Tree API, it seems that any additional dependencies would be  
minimal.  Note that the symbols and types are exposed via the  
javax.lang.* APIs, so all that is required is for the Tree API to  
allow access to that information.

* A.P.s would have greater opportunity to undermine the correctness  
of javac.  I suppose this is probably true, but seems to me like a  
non-issue because the user elects explicitly to include an A.P. in  
his workflow.  Certainly they are no more dangerous than the current  
Java Instrumentation API!

Along those lines, another similar problem is that the Java Messager  
API, used to report warnings etc, currently does not accept Tree  
arguments as a location, and so can only report problems at a method  
resolution, rather than at a precise line.  This seems non-ideal, but  
perhaps I missed a part of the Trees API that provides an alternate  
error reporting mechanism.  It can be hard to collect the entire set  
of Javac APIs into one's head at one time.

Thanks for your time and thoughts.


Niko Matsakis



More information about the JSR308 mailing list