Improving compiler messages for preview API
Jonathan Gibbons
jonathan.gibbons at oracle.com
Wed Aug 7 20:30:55 UTC 2019
On 8/7/19 1:22 PM, Alex Buckley wrote:
> On 8/7/2019 11:52 AM, Joe Darcy wrote:
>> To be precise on terminology, if compiling with --enable-preview, I
>> think the warnings generated for using preview languages feature and
>> associated API elements should be a little-w warnings. That is,
>> messages from the compiler that still allows the compile to exist
>> with a zero exit code. Operationally, such messages would be
>> Diagnostic.Kind.NOTE rather than Diagnostic.Kind.{WARNING,
>> MANDATORY_WARNING}.
> Sure, that is a decision for javac.
>
>>> 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."
>>
>> As I understand it, currently the call file target to use in javac is
>> determined solely from the command line arguments at the start of the
>> compile. It may be awkward to change this during the compile. (And
>> would it change only for the for the types using the preview feature
>> or fall all types in the compile?)
>
> Does "call file target" mean "class file target", e.g. 57.0 versus
> 57.65535? I suspect it's moot anyway -- this thread has already moved
> on from "give a warning, and mark the class file as depending on
> preview features", to "give an error, so no class file to worry about."
>
>>> 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.
>>>
>> It isn't necessarily the case an API associated with a preview
>> feature will have been introduced in the most recent JDK. For
>> example, treating JEP 325: "Switch Expressions (Preview)" in 12 and
>> JEP 354: "Switch Expressions (Preview)" in 13 as iterations of the
>> same feature, the tree API has methods to support switch expression
>> support from both JDK 12 and 13:
>>
>> SwitchExpressionTree introduced in 12, still in use in 13:
>> https://download.java.net/java/early_access/jdk13/docs/api/jdk.compiler/com/sun/source/tree/SwitchExpressionTree.html
>>
>> YieldTree introduced in 13:
>> https://download.java.net/java/early_access/jdk13/docs/api/jdk.compiler/com/sun/source/tree/YieldTree.html
>> >
>> This situation hasn't occurred yet in the Java SE APIs, but if the
>> iterations of a feature are previewed over multiple releases, it
>> certainly could.
>>
>> The "release" element was modeled after the "since" element in
>> java.lang.Deprecated. It isn't essential information, but I think it
>> is useful to have it presented.
>
> Sorry, I am not concerned with how to mark compiler-internal APIs that
> support preview features, whether in javac or in any other compiler.
> The audience of developers who might accidentally over-rely on such
> APIs is tiny. I am concerned about how to mark Java SE APIs as being
> associated with preview features, because the audience of developers
> who might accidentally over-rely on them is enormous. In that vein, if
> an SE 12 preview feature re-previews in SE 13, then any associated API
> in 13 should NOT say @PreviewFeature(release="12") -- even if the API
> is unchanged between 12's preview feature and 13's preview feature.
> The JEP which does the re-previewing is responsible for saying how
> associated APIs from the first round evolve in the second round, so by
> definition, any associated API present in 13 is the 13 version, and
> `release="13"` is unnecessary.
>
> Alex
While I accept that you may not be concerned with non-SE API, I note
that the APIs I'm talking about are public documented supported JDK
APIs, and not just compiler-internal APIs.
https://docs.oracle.com/en/java/javase/11/docs/api/jdk.compiler/com/sun/source/tree/package-summary.html
-- Jon
More information about the compiler-dev
mailing list