Improving compiler messages for preview API

Joe Darcy joe.darcy at oracle.com
Fri Jun 21 17:38:34 UTC 2019


PS Prototype version of what this sort of message improvement could look 
like, initially coded with a JDK-internal annotation type as opposed to 
one in java.lang:

     http://cr.openjdk.java.net/~darcy/8226585.0/

When compiling the code

public class Test {
     public static void main(String... args) {
         String message = "Hello, world.";

         System.out.println(message.stripIndent()); //String.stripIndent 
in preview
     }
}

the revised compiler gives the following messages

# Without --enable-preview

 > javac --release 13 Test.java
Test.java:5: warning: [removal] stripIndent() in String has been 
deprecated and marked for removal as a preview API
         System.out.println(message.stripIndent()); //String.stripIndent 
in preview
                                   ^
1 warning

# With --enable-preview

 > javac --release 13 --enable-preview Test.java
Test.java:5: Note: stripIndent() in String is a preview API and may be 
removed in a future release
         System.out.println(message.stripIndent()); //String.stripIndent 
in preview
                                   ^
All langtools tests pass with the patch applied.

Cheers,

-Joe

On 6/20/2019 10:18 AM, Joe Darcy wrote:
>
> Hello,
>
> In JDK 13, as part of the text blocks preview feature 
> (http://openjdk.java.net/jeps/355), there are now several preview API 
> methods in java.lang.String. Preview API handling is discussed in JEP 
> 12: "Preview Language and VM Features" (http://openjdk.java.net/jeps/12):
>
>> This JEP does not propose a new mechanism for flagging "preview 
>> APIs", but rather, proposes to reuse the deprecation mechanism:
>>
>> 1.
>>
>>     Essential and reflective APIs that are connected with a preview
>>     feature should be terminally deprecated at birth, that is,
>>     annotated |@Deprecated(forRemoval=true, since=...)| when they are
>>     introduced.
>>
> Accordingly, the declaration of the three preview API methods includes 
> javadoc and annotations like:
>
>> + * @since 13 + * + * @deprecated This method is associated with text 
>> blocks, a preview language feature. + * Text blocks and/or this 
>> method may be changed or removed in a future release. + */ + 
>> @Deprecated(forRemoval=true, since="13") + public String stripIndent()
>
> Using JDK 13 b25 to compile code using both the preview language 
> feature and preview API
>
> public class Test {
>     public static void main(String... args) {
>         String message = """
>                          Hello, world.
>                          """;
>         System.out.println(message.stripIndent()); 
> //String.stripIndent in preview
>     }
> }
>
> the resulting compiler messages are
>
>  ../jdk-13/bin/javac --release 13 --enable-preview Test.java
> Test.java:7: warning: [removal] stripIndent() in String has been 
> deprecated and marked for removal
>         System.out.println(message.stripIndent());
>                                   ^
> Note: Test.java uses preview language features.
> Note: Recompile with -Xlint:preview for details.
> 1 warning
>
> The removal warning for using the preview API element stripIndent is a 
> bit harsh, after all the compilation has explicitly enabled preview 
> features. However, strictly speaking such a warning is required by the 
> JLS for a terminally deprecated item. [1]
>
> I think more reasonable messaging for this program would be something 
> like:
>
>     Note: Test.java uses preview language features and preview API 
> elements.
>     ...
>
> or just omitting mention of using preview API elements if compiling 
> under --enable-preview. Emitting a warning for using preview API 
> elements when *not* running under --enable-preview is important for 
> the reasons discussed in JEP 12.
>
> Refined error messages for preview API elements could be given by the 
> compiler if preview API elements were marked in some way to reliably 
> distinguish them from other terminally deprecated items.
>
> Time is late in JDK 13, but for, say, JDK 14 it may be reasonable to 
> add a java.lang.Preview annotation type to mark preview API elements 
> rather than relying on overloading the deprecation mechanism. Such an 
> annotation type would be @Documented an applicable to the sort of 
> declarations @Deprecated can be applied to.
>
> If this kind of approach seems reasonable, core-libs will be brought 
> in too.
>
> Comments?
>
> Cheers,
>
> -Joe
>
> [1] 
> https://docs.oracle.com/javase/specs/jls/se12/html/jls-9.html#jls-9.6.4.6
>
>> A Java compiler must produce a /removal warning/ when a terminally 
>> deprecated program element is used (overridden, invoked, or 
>> referenced by name) in the declaration of a program element (whether 
>> explicitly or implicitly declared), unless:
>>
>>  *
>>
>>      The use is within a declaration that is annotated to suppress
>>     removal warnings; or
>>
>>  *
>>
>>     The use and declaration are both within the same outermost class; or
>>
>>  *
>>
>>      The use is within an |import| declaration that imports the
>>     terminally deprecated type or member.
>>
>>  *
>>
>>     The use is within an |exports| or |opens| directive.
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20190621/f6fedb80/attachment.html>


More information about the compiler-dev mailing list