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. ------------- Commit messages: - Merge remote-tracking branch 'upstream/master' into previewfeature-hybrid-enum-exp - Reflecting review feedback. - Correcting dependencies as suggested. - Cleanup comment. - More logging - Adding logging. - Attempting to fix dependencies. - Produce 'hybrid' PreviewFeature.Feature enum for interim javac instead of manually keeping obsolette constants. Changes: https://git.openjdk.org/jdk/pull/30072/files Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=30072&range=00 Issue: https://bugs.openjdk.org/browse/JDK-8379284 Stats: 129 lines in 3 files changed: 97 ins; 19 del; 13 mod Patch: https://git.openjdk.org/jdk/pull/30072.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/30072/head:pull/30072 PR: https://git.openjdk.org/jdk/pull/30072
