Invoking code generated by an annotation processor

Jonathan Gibbons jonathan.gibbons at oracle.com
Thu Mar 3 15:37:45 UTC 2016


Stephane,

I will create an issue to track this.  I cannot make promises about 
fixing this, but if we do, it would be fixed in 9 first, and then maybe 
backported to 8.

-- Jon


On 03/02/2016 06:48 PM, Stéphane NICOLAS wrote:
> @jonathan, is there any chance this will get fixed in a future release 
> of javac ? (7 &/or 8+, we actually don't really mind about java 7 on 
> our side).
>
> Thx in advance,
>  Stephane
>
> 2016-02-19 19:50 GMT-08:00 Stéphane NICOLAS <steff.nicolas at gmail.com 
> <mailto:steff.nicolas at gmail.com>>:
>
>     Thx Joe for this historical precision, I appreciate it.
>
>     I read carefully, and when the specs says :
>>     If the source code is not syntactically well-formed or has some
>>     other irrecoverable error that could not be removed by the
>>     generation of new types, a model may or may not be provided as a
>>     quality of implementation issue.
>     In the 2 cases we highlighted : a static import error or an
>     erroneous annotation value, it's hard to say here if a source with
>     those errors is syntactically valid.
>
>     _If we consider it syntactically valid : _then those errors are
>     not recoverable, as they prevent the annotation processor from
>     running. So those errors should be reported. And javac does that.
>     But it also reports all cals to generated code as errors, which is
>     our concern.
>
>     Later, the specs says :
>>     If a program is syntactically valid but erroneous in some other
>>     fashion, any returned model must have no less information than if
>>     all the method bodies in the program were replaced by "throw new
>>     RuntimeException();"
>     Here, javac seems to fail in our case as the source code is
>     syntactically valid, but erroneous in some other fashion, but our
>     generated code is not assumed to have the form of empty classes,
>     methods etc.. The annotation processor is simply not run and those
>     errors are reported.
>
>     So, if such errors are not considered syntax errors, javac doesn't
>     follow the specs.
>
>     _If we consider the program is not syntactically valid : _then we
>     fall in a loophole of fuzzyness of the specs : a model may or may
>     not be provided as a quality of implementation issue. It looks
>     like it's not possible to generate a model that could be passed to
>     annotation processors because of those errors. Then only those
>     should be reported.
>
>     I tend to think there is something missing on this matter in the
>     specs you mention : an intermediary class of error.
>
>     Unrecoverable errors :
>
>       * syntax errors are about the form of the program (missing
>         commas, braces, etc. name it). Those are reported well by
>         javac, and only them are reported. Perfect
>       * model building errors : static imports and annotation values
>         errors. Those are also reported well by javac but they drag
>         along with them error to generated code, the recoverable
>         errors below.
>
>     Recoverable errors :
>
>       * unknown classes or members of known classes : those are not
>         considered as error before annotation processing takes place.
>         Which is OK, but they are reported in case of model building
>         errors, which is our concern.
>
>     So we can say here, to summarize the problem differently that
>     right after parsing a source and considering it valid, javac open
>     a list of errors it finds in the source. It adds all recoverable
>     errors it finds to save them for a next phase of processing after
>     annotation processing. But at that very precise moment, it also
>     adds to the error list the non recoverable model building errors.
>     And if one is found, then all errors are reported, which is not
>     correct.
>
>     The solution would be to separate model building errors and
>     recoverable errors right after having considered a program
>     syntactically valid.
>     Maybe there is an intermediary phase needed to identify strictly
>     non recoverable model building errors and list them, before
>     building the model and detecting recoverable errors, which javac
>     handles well.
>
>     S.
>
>
>     2016-02-19 16:15 GMT-08:00 Joseph D. Darcy <joe.darcy at oracle.com
>     <mailto:joe.darcy at oracle.com>>:
>
>         Hello,
>
>         On 2/17/2016 11:00 AM, Jonathan Gibbons wrote:
>>         Stéphane,
>>
>>         Internally, during the period before anno processing, javac
>>         categorizes errors as recoverable or not, where "recoverable"
>>         means "could this error conceivably be fixed by running
>>         annotation processors, which may generate code."
>>
>>         It may be that we have to examine the scenario you describe
>>         to decide if the error should be marked as recoverable.
>>
>
>         To provide some additional historical context here, the first
>         generation annotation processing of apt in JDK 5 as well as
>         the standardized successor of javax.lang.model and
>         javax.annotation.processing in JDK 6 and later shared a
>         requirement of having to be able to process incomplete
>         programs. In particular, to allow processors to generated
>         missing subclasses and even superclasses of the the initial
>         set of sources.
>
>         In general, it is impractical to describe exactly how a
>         compiler should model an incorrect program. The JSR 269 expert
>         group took some some pains to craft a specification would
>         balance the need for predictability while also allowing some
>         room for implementation-specific behavior: current version of
>         this specification with some refinements [1] over the years:
>
>>         During annotation processing, operating on incomplete or
>>         erroneous programs is necessary; however, there are fewer
>>         guarantees about the nature of the resulting model. If the
>>         source code is not syntactically well-formed or has some
>>         other irrecoverable error that could not be removed by the
>>         generation of new types, a model may or may not be provided
>>         as a quality of implementation issue. If a program is
>>         syntactically valid but erroneous in some other fashion, any
>>         returned model must have no less information than if all the
>>         method bodies in the program were replaced by "throw new
>>         RuntimeException();". If a program refers to a missing type
>>         XYZ, the returned model must contain no less information than
>>         if the declaration of type XYZ were assumed to be "class XYZ
>>         {}", "interface XYZ {}", "enum XYZ {}", or "@interface XYZ
>>         {}". If a program refers to a missing type XYZ<K1, ... ,Kn>,
>>         the returned model must contain no less information than if
>>         the declaration of XYZ were assumed to be "class XYZ<T1, ...
>>         ,Tn> {}" or "interface XYZ<T1, ... ,Tn> {}"
>         http://docs.oracle.com/javase/8/docs/api/javax/lang/model/element/package-summary.html
>
>         As Jon alluded to earlier in this thread, how javac implements
>         this aspect of the spec has evolved over time with the current
>         intention to forge ahead when generating a missing type could
>         allow the whole set of sources to compile successfully.
>
>         Cheers,
>
>         -Joe
>
>         [1] https://bugs.openjdk.java.net/browse/JDK-7003550
>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20160303/0e4ef666/attachment-0001.html>


More information about the compiler-dev mailing list