On Thu, 5 Mar 2026 22:06:43 GMT, ExE Boss <[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. > > make/langtools/tools/previewfeature/SetupPreviewFeature.java line 85: > >> 83: >> "/*compatibility constants:*/ ", >> 84: >> ",\n")) + >> 85: sourceCode.substring(insertPosition)); > > It might be better to use [`BufferedWriter.write(String s, int off, int > len)`] here: > Suggestion: > > out.write(sourceCode, 0, insertPosition); > out.write(constantsToAdd.stream() > .collect(Collectors.joining(", ", > > "/*compatibility constants:*/ ", > ",\n"))); > out.write(sourceCode, insertPosition, sourceCode.length()); > > > And also handle the case when `constantsToAdd` is empty without producing a > syntax error due to doubled `,`s, but that needs to be done elsewhere in this > method. > > [`BufferedWriter.write(String s, int off, int len)`]: > https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/io/BufferedWriter.html#write(java.lang.String,int,int)
Thanks, reflected. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/30072#discussion_r2894375746
