On Mon, 9 Mar 2026 08:08:59 GMT, Jan Lahoda <[email protected]> wrote:
>> There's an enum
>> `src/java.base/share/classes/jdk/internal/javac/PreviewFeature.java#PreviewFeature.Feature`
>> that defines the current preview features, in particular those that have an
>> API. The API is then marked with the appropriate enum constant.
>>
>> There's a problem with this enum: javac's APIs may also need to use
>> constants from the enum, and as javac is built twice, once with the
>> bootstrap JDK to get the so called "interim javac" (which is then used to
>> compile nearly all the rest of the JDK), and second time to get the final
>> version of javac, this enum needs to be dragged into the interim compilation
>> as well.
>>
>> As a consequence, the bootstrap JDK classfiles are resolved against this
>> up-to-date feature enum. And if any of the bootstrap JDK classfiles would
>> refer to an enum constant that is not part of this up-to-date feature enum,
>> javac would report a warning, failing the build.
>>
>> As a consequence, the guidance is that when a preview feature ceases to be
>> preview (either by maturing to a final and permanent feature, or by
>> removal), we keep the appropriate enum constant as long as the bootstrap JDK
>> may use it.
>>
>> This works, but causes constant confusion, and unnecessary work, as
>> finalizing a preview feature requires another action in the next release to
>> cleanup the enum constant.
>>
>> This PR is exploring an alternative solution: it takes the up-to-date
>> `Feature` enum, and auto-generates a hybrid enum containing constants both
>> from the up-to-date and bootstrap `Feature` enum. As a consequence, the
>> up-to-date enum does not need to contain any legacy constants, as those are
>> automatically injected for the interim build. This hybrid enum should never
>> be used outside of the interim javac build.
>>
>> As a consequence, when a feature ceases to be a preview feature, we can
>> clean up the feature enum immediately, leading to less confusion and less
>> downstream work.
>
> Jan Lahoda has updated the pull request incrementally with one additional
> commit since the last revision:
>
> Using Path.of as suggested.
make/langtools/tools/previewfeature/SetupPreviewFeature.java line 82:
> 80: if (constantsToAdd.isEmpty()) {
> 81: out.write(sourceCode);
> 82: } else {
**Nit:** It might be better to use [`Files::copy`] (or its variants) for this
when `constantsToAdd` is empty, instead of decoding and re‑encoding the
unmodified file.
[`Files::copy`]:
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/nio/file/Files.html#copy(java.nio.file.Path,java.nio.file.Path,java.nio.file.CopyOption...)
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/30072#discussion_r2906732124