RFR: JDK-8187950: javax.lang.model APIs throws CompletionFailure or a subtype of CompletionFailure.

Liam Miller-Cushon cushon at google.com
Wed Feb 14 06:52:39 UTC 2018


I did some more testing and am seeing regressions with a few existing
annotation processors. In some cases the processors relied on a completion
failure being thrown, and adding explicit checks for error types fixes them.

There was another example I'm less sure about, where a compilation that
previously failed with a 'class file not found' error now succeeds but the
processor sees incorrect information. In the example below the class file
for the interface B is missing, and its element kind is reported as CLASS.

=== L.java
class A {}
interface B {}
class L extends A implements B {}
=== T.java
class T {}
=== P.java
import java.util.Set;
import javax.annotation.processing.*;
import javax.lang.model.*;
import javax.lang.model.element.*;
import javax.lang.model.type.*;

@SupportedAnnotationTypes("*")
public class P extends AbstractProcessor {

  @Override
  public SourceVersion getSupportedSourceVersion() {
    return SourceVersion.latest();
  }

  @Override
  public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
    for (TypeMirror st :
        processingEnv
            .getTypeUtils()
            .directSupertypes(processingEnv.getElementUtils(
).getTypeElement("L").asType())) {
      System.err.println(st.getKind() + ": " + st);
      Element te = ((DeclaredType) st).asElement();
      System.err.println(" " + te.getKind() + ": " + te);
    }
    return false;
  }
}
===

$ javac *.java && rm B.class
# with JDK 10+43
$ javac -fullversion -implicit:none -sourcepath : -processor P T.java
javac full version "10+43"
DECLARED: A
 CLASS: A
DECLARED: B
error: cannot access B
  class file for B not found
  Consult the following stack trace for details.
  com.sun.tools.javac.code.Symbol$CompletionFailure: class file for B not
found
...
$ echo $?
1

# with http://cr.openjdk.java.net/~jlahoda/8187950/webrev.01/
$ javac  -implicit:none -sourcepath : -processor P T.java
DECLARED: A
 CLASS: A
DECLARED: B
 CLASS: B
...
$ echo $?
0

On Tue, Feb 13, 2018 at 4:26 AM, Jan Lahoda <jan.lahoda at oracle.com> wrote:

> On 12.2.2018 19:50, Liam Miller-Cushon wrote:
>
>> Hi Jan,
>>
>> I've run into the same problem a few times, and made some half-baked
>> experiments around not caching completion failures [1]. The approach you
>> describe sounds good to me. Also,
>>
>
> Thanks.
>
> * this will fix JDK-8177436 [2] too
>>
>
> I double-checked, and it indeed fixes that.
>
> * there's a minor typo in the javadoc
>> for DeferredCompletionFailureHandler - "throw the the client code"
>>
>
> Fixed in the updated webrev.
>
> Thanks for the feedback,
>     Jan
>
>
>> [1]
>> http://mail.openjdk.java.net/pipermail/compiler-dev/2017-Mar
>> ch/010883.html
>> <http://mail.openjdk.java.net/pipermail/compiler-dev/2017-Ma
>> rch/010883.html>
>> [2] https://bugs.openjdk.java.net/browse/JDK-8177436
>> <https://bugs.openjdk.java.net/browse/JDK-8177436>
>>
>> On Mon, Feb 12, 2018 at 4:43 AM, Jan Lahoda <jan.lahoda at oracle.com
>> <mailto:jan.lahoda at oracle.com>> wrote:
>>
>>     Hi,
>>
>>     Currently, when a calling some API methods, the client (e.g.
>>     TaskListener, an annotation Processor or a JavacTask client) may get
>>     a CompletionFailure, if the given Symbol was not completed yet. This
>>     is not only problematic for the clients, but if the client catches
>>     and ignores the exception, the javac may be unable to report an
>>     appropriate error.
>>
>>     The proposed patch here:
>>     -separates "user " and "javac" modes, in which CompletionFailure
>>     handling differs a bit
>>     -in javac mode, CompletionFailures should be handled as they are
>>     currently
>>     -in user (code) mode, when a CompletionFailure is thrown (and would
>>     go outside of an API method), the API method will suppress the
>>     exception, and the Symbol's state (completer, kind, type) will be
>>     restored to original when the mode is switched back to javac mode.
>>     If the Symbol is then completed again inside javac, the
>>     CompletionFailure is thrown again and the appropriate errors are
>>     reported.
>>
>>     Bug: https://bugs.openjdk.java.net/browse/JDK-8187950
>>     <https://bugs.openjdk.java.net/browse/JDK-8187950>
>>     Webrev: http://cr.openjdk.java.net/~jlahoda/8187950/webrev.00/
>>     <http://cr.openjdk.java.net/~jlahoda/8187950/webrev.00/>
>>
>>     How does this look?
>>
>>     Thanks,
>>          Jan
>>
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20180213/a21d7808/attachment.html>


More information about the compiler-dev mailing list