RFR 8199194: Add javac support for preview features

Jonathan Gibbons jonathan.gibbons at oracle.com
Wed Apr 11 20:11:46 UTC 2018


+1.

Nice.

-- Jon

On 03/29/2018 10:31 AM, Maurizio Cimadamore wrote:
> Hi,
> Here's a langtools patch to support preview language features as 
> described in JEP 12 [1]. There's also a pending CSR [2] request that 
> describes the set of changes introduced by this patch in great details.
>
> Webrev can be found here (the webrev contains also a preview of the 
> new diagnostics emitted by javac, for a quicker evaluation)
>
> http://cr.openjdk.java.net/~mcimadamore/8199194/
>
>
> Implementation-wise, the main decision was how to model preview 
> support. Should it be an extra source (and target) level? I tried to 
> go there, as it seems the path of least resistance, but was ultimately 
> too messy. The main problem we face is that both Source and Target are 
> enums - completely static entities; so we can't attach a lot of state 
> to them (which is needed to generate some of the diagnostics required 
> by the JEP). At the same time, that seems to break an important 
> invariant, that all Source/Target versions should have a corresponding 
> flag that can be passed to the -source/--release options. That is, if 
> 'preview' is an hidden source level, javac has to start distinguishing 
> about public levels and private ones.
>
> Instead, I came up with a different approach - there is a new Preview 
> class in langtools, which acts as a 'coordinator' for the preview 
> feature. This means that usages of preview features are reported 
> through this Preview class by other javac classes. Thanks to this, we 
> now can collect all uses of preview features in a single place, and 
> generate diagnostics accordingly.
>
> The mapping of which features are preview features is completely 
> ad-hoc, which I think it's desirable. We could add a 'preview' token 
> to Source.Feature - but I think it's best to ask Preview directly if a 
> given Feature is preview or not. This has some advantages:
>
> * when a feature goes from preview to stable, we only need to remove 
> the mapping from Preview - Source stays as is
> * we can exploit the indirection to support test flavors which treat 
> every feature as 'preview'. I used this extensively to be able to 
> generate diagnostic tests.
>
> Diagnostic-wise, using preview features with --enable-preview, will 
> generate a note similar to the one for unchecked warnings; users can 
> recompile with the -Xlint:preview flag to get more detailed messages 
> about preview feature usages. Note that by usages here I also mean 
> attempts to load classfiles which have the minor version set to the 
> special preview value (hence, some changes to ClassReader were needed).
>
> To demonstrate how the preview support could be leveraged, I tweaked 
> the methods in JavacParser::checkSourceLevel and 
> JavaTokenizer::checkSourceLevel - if the feature to be checked is a 
> preview feature (this test can be forced using the -XDforcePreview 
> flag), then extra checks are carried out, to make sure that preview 
> support is indeed enabled.
>
> Since the set of preview features is currently empty, this patch 
> should result in no observable change in the behavior of the javac 
> compiler.
>
>
> Cheers
> Maurizio
>
> [1] - http://openjdk.java.net/jeps/12
> [2] - https://bugs.openjdk.java.net/browse/JDK-8200312
>
>



More information about the compiler-dev mailing list