RFR 8199194: Add javac support for preview features

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Thu Apr 12 13:20:34 UTC 2018


Thanks - pushed

Maurizio


On 11/04/18 21:11, Jonathan Gibbons wrote:
> +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