> 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:

  Removing an unnecessary dependency as suggested.

-------------

Changes:
  - all: https://git.openjdk.org/jdk/pull/30072/files
  - new: https://git.openjdk.org/jdk/pull/30072/files/cf6e6e40..58e0bae4

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=30072&range=01
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=30072&range=00-01

  Stats: 1 line in 1 file changed: 0 ins; 1 del; 0 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