Plug-in system limitations and internal documentation
Jonathan Gibbons
jonathan.gibbons at oracle.com
Mon Feb 25 11:04:40 PST 2013
Daniel,
The plugin system is more flexible than the current annotation system,
at the cost of being javac-specific. It supports a somewhat simpler
command line interface. It also allows access to the full AST, via the
com.sun.source.* API.
javac does not support any public form of AST modification within a
running compilation. You can only do code transformations by creating
new source code, possibly from new ASTs, and compiling the generated code.
-- Jon
On 02/25/2013 09:59 AM, Daniel Parreira wrote:
> Hello compiler-dev,
>
> This might appear to be an unorthodox request, but I have found no
> other place to express this doubt about javac internals (openjdk8). I
> am currently developing a plugin for javac that will add annotations
> for a recent genre of concurrency control that will be the focus of my
> Master Thesis. Since I require type annotations, I have turned myself
> into openjdk8 as my developing platform since bare-java7 does not
> support them.
>
> The recent plugin system introduced in java8 (contrasting with the
> previous annotation processors) is useful for me in this perspective.
> However, as far as I could see, the plugin system public APIs does not
> allow :
> - seeing AST nodes at the method level
> - modifying the AST, by adding or removing nodes
>
> As such, how is this plugin system different from the previous
> annotation processor? As far as I can see, the functionalities offered
> are the same. In order to modify the AST/see method level AST nodes, I
> had to resort to some well known "hacks", namely the cast of the
> public APIs interfaces to the compiler inner classes. (references :
> http://scg.unibe.ch/archive/projects/Erni08b.pdf ,
> http://weblogs.java.net/blog/tball/archive/2006/09/hacking_javac.html)
>
> Is this the only way to achieve this? Shouldn't the public API also
> supply functionalities for modification? According to the article in
> page 55 of the Oracle Java Magazine from February 2013
> (http://www.oraclejavamagazine-digital.com/javamagazine/20130102#pg56), it
> should be supported. Quoting :
> "
> Java 8 will bring a new mechanism that allows you to write plug-ins
> for the Java compiler (javac). A compiler plug-in lets you add new
> phases to javac without making changes to its code base.
> New behavior can be encapsulated in a plug-in and distributed for
> other people to use. For example, javac plug-ins could be used to do
> the following:
> - Add extra compile-time checks
> - Add code transformations <------
> - Perform customized analysis of source code
> "
>
> At last, is there any kind of internal documentation besides the
> javadoc in the source files? Information about the internal
> functioning of javac in openjdk8 is extremely limited and most of the
> information has to be inferred by digging into the JavacParse.java /
> TreeMaker.java / JavacCompiler source files. The most difficult aspect
> to infer is how to symbol table works and how to actually create valid
> AST nodes. I couldn't quite understand how, for example, a reference
> to a method is passed into a JCMethodInvokation.
>
> Thank you for your time,
> Daniel Parreira - nº 36780 - CS Bsc - Faculdade de Ciências e
> Tecnologias da Universidade Nova de Lisboa, Portugal
> (http://www.fct.unl.pt/)
More information about the compiler-dev
mailing list