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

Reply via email to