Improving compiler messages for preview API

Jonathan Gibbons jonathan.gibbons at
Mon Aug 5 17:40:01 UTC 2019

On 8/2/19 5:07 PM, Alex Buckley wrote:
> Hi Joe,
> On 6/20/2019 10:18 AM, Joe Darcy wrote:> 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 and applicable to the sort of 
>> declarations @Deprecated can be applied to.
> I think @Preview is the right way to go for JDK 14+. It would underpin 
> a number of scenarios where we wish to call developers' attention to 
> preview features:
> 1. In javadoc -- A casual reader of String::stripIndent's javadoc 
> should realize that this method is special: its association with a 
> preview feature (text blocks) means that it might change or go away in 
> the next release without going through a deprecate-and-wait cycle like 
> normal Java SE methods. An @Documented annotation such as @Preview 
> would let the standard doclet give special visual treatment to 
> types/fields/methods ("API elements") associated with preview features.
> 2. At compile time -- If you compile with --enable-preview, then any 
> source code reference to an API element associated with a preview 
> feature should generate a (non-suppressible) warning. This warning, 
> which would require JLS support, would be distinct from deprecation 
> warnings; we would then be in a position in JDK 14+ to drop the 
> terminally-deprecated-at-birth scheme adopted in JEP 12 as a stopgap.
> 3. At run time -- If you compile without --enable-preview, and the 
> source code refers to an API element associated with a preview 
> feature, then javac could give a (non-suppressible) warning and _mark 
> the class file as depending on preview features_. It is important to 
> handle this scenario firmly because the API element might be gone in a 
> later release. Annotating the type/method gives grounds for javac to 
> explain what's going on: "This method is marked @Preview; your class 
> file is now preview-feature dependent."
> The annotation type that you defined in the webrev 
> (j.l.a.PreviewFeature) looks good. However, I don't think the 
> `release` element is needed. The API in SE $N is what it is; API 
> elements associated with a preview feature are there because a JEP put 
> them there. The `release` element would always be the current JDK 
> release.
> Alex

What are the arguments for and against using a public Java SE annotation 
for this (e.g. j.l.a.PreviewFeature) when the only reasonable/expected 
usage is within Java SE and the JDK implementation.  There's a tiny tiny 
code smell defining an annotation type that no other users of Java SE 
will ever use. That being said, I guess it will enable non-JDK tools to 
behave appropriately when such an annotation is found.

-- Jon

More information about the compiler-dev mailing list