Improving compiler messages for preview API
Alex Buckley
alex.buckley at oracle.com
Mon Aug 5 17:52:01 UTC 2019
On 8/5/2019 10:40 AM, Jonathan Gibbons wrote:
> 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.
Some preview language features depend inexorably on APIs, so those APIs
need to be in java.* (e.g. String::stripIndent for text blocks).
Use of those APIs when preview features are not enabled is extremely
dangerous, because the APIs might change or disappear depending on the
fate of the associated preview feature.
Leaving the developer notification up to individual compilers is
inadequate. JEP 12 already mandates a policy for highlighting the
changeability of these APIs -- terminal deprecation at birth.
Conveniently, that required no JLS or compiler changes.
Joe has made a number of arguments, that I hope he will record in
JDK-8226585, against using terminal-deprecation-at-birth. Per this
thread, a compile-time error is even better than a warning when the
developer fails to enable preview features.
The only way to get all Java compilers to give an error is with a JLS
change and a Java SE annotation.
It would not be an error to _apply_ this annotation to declarations
outside the Java SE API, but compilers would be required to give an
error only when code uses an annotated element which is part of the Java
SE API.
Alex
More information about the compiler-dev
mailing list