RFR 8189749: Devise strategy for making source level checks more uniform
Jonathan Gibbons
jonathan.gibbons at oracle.com
Mon Dec 4 17:15:34 UTC 2017
Yes, that was my expectation.
-- Jon
On 12/4/17 4:22 AM, Maurizio Cimadamore wrote:
> Thanks,
> I will make the change ahead of the push (w/o submitting another
> round) if that's ok
>
> Maurizio
>
>
> On 02/12/17 00:29, Jonathan Gibbons wrote:
>> +1. Very nice.
>>
>> Nit: I would suggest changing multi-catch statements to the plural form.
>>
>> tests/MulticatchNotSupported.java:39: error: multi-catch statement is
>> not supported in -source 6
>>
>> -- Jon
>>
>> On 11/28/2017 06:19 AM, Maurizio Cimadamore wrote:
>>> Updated webrev here:
>>>
>>> http://cr.openjdk.java.net/~mcimadamore/8189749-v2/
>>>
>>> I've included a report of the diagnostics that have been tweaked by
>>> this webrev here to make sure that singular vs. plural is used
>>> effectively:
>>>
>>> http://cr.openjdk.java.net/~mcimadamore/8189749-v2/diags.html
>>>
>>> Cheers
>>> Maurizio
>>>
>>>
>>> On 20/10/17 19:07, Maurizio Cimadamore wrote:
>>>> Hi,
>>>> this biggie patch allows the treatment of source level checks to be
>>>> more uniform. The general problem is explained in details here:
>>>>
>>>> https://bugs.openjdk.java.net/browse/JDK-8189749
>>>>
>>>> Webrev is here:
>>>>
>>>> http://cr.openjdk.java.net/~mcimadamore/8189749/
>>>>
>>>> The way I approached this, was to create a first class entity, an
>>>> enum called Feature. Each 'feature' has:
>>>>
>>>> * a min source level (e.g. what is the min source level required to
>>>> compile that feature, meaning that lower levels will result in errors)
>>>> * a max source level (e.g. what is the max source level required to
>>>> compile that feature, meaning that higher levels will result in
>>>> errors)
>>>> * an optional resource key
>>>>
>>>> The first two properties are obviously used to decided if feature
>>>> XYZ can be used given source level N. The last property is used to
>>>> automate generation of source check diagnostics. Note that this
>>>> patch introduce a _single_ source check diagnostic:
>>>>
>>>> # 0: message segment (feature), 1: string (found version), 2:
>>>> string (expected version)
>>>> compiler.misc.feature.not.supported.in.source=\
>>>> {0} not supported in -source {1}\n\
>>>> (use -source {2} or higher to enable {0})
>>>>
>>>> And then there's a bunch of feature fragments, example:
>>>>
>>>> compiler.misc.feature.modules=\
>>>> modules
>>>>
>>>> compiler.misc.feature.diamond.and.anon.class=\
>>>> ''<>'' with anonymous inner classes
>>>>
>>>> compiler.misc.feature.binary.lit=\
>>>> binary literals
>>>>
>>>> (and many more :-))
>>>>
>>>> Since each feature 'knows' its fragment, it is super easy for the
>>>> compiler to generate the source level check diagnostic for any
>>>> feature. And, if you need to add a new feature, you just need to
>>>> add an enum value, and wired it up with the corresponding resource
>>>> key - done :-)
>>>>
>>>> Since this change affects the way in which source check diagnostics
>>>> are generated, quite a lot of changes were required to adjust
>>>> expected output in golden files. Aside from those changes, I also
>>>> addressed the following issues:
>>>>
>>>> * JavaTokenizer was not using SOURCE_LEVEL flags for its
>>>> diagnostics, and it was not using the new diagnostic framework to
>>>> generate errors, which made the porting harder - so I've fixed that
>>>> * CALog in Completeness analyzer required a new override for an
>>>> AbstractLog::error variant that was probably forgotten (this was
>>>> required otherwise CompletenessAnalyzerTest was failing after the
>>>> change above)
>>>> * Log has a 'feature' so that diagnostics marked with the
>>>> SOURCE_LEVEL flag can be reported only once per source. But this
>>>> check was only looking at the 'head' of a diagnostic, ignoring all
>>>> arguments. Since now all source level check diagnostics share the
>>>> same head, I needed to tweak the logic to also compare arguments -
>>>> or else, one source level check error being reported would also
>>>> disable unrelated source level check diags.
>>>>
>>>> Then there were a bunch of mechanical translation, for instance
>>>> idioms such as:
>>>>
>>>> allowSimplifiedVarargs = source.allowSimplifiedVarargs();
>>>>
>>>> Were rewritten as:
>>>>
>>>> allowSimplifiedVarargs = source.allowed(Feature.SIMPLIFIED_VARARGS);
>>>>
>>>> Also, in JavacParser, this idiom:
>>>>
>>>> checkTypeAnnotations();
>>>>
>>>> has been replaced with
>>>>
>>>> checkSourceLevel(Feature.TYPE_ANNOTATIONS);
>>>>
>>>> Where checkSourceLevel is a new general routine that works on any
>>>> Feature.
>>>>
>>>> Finally, where possible, I also got rid of the various boolean
>>>> flags of the kind 'allowPrivateMethodInInterfaces' - if the class
>>>> already had a 'source' field, the boolean flag can be omitted, and
>>>> the check can be performed on the source object itself.
>>>>
>>>> Cheers
>>>> Maurizio
>>>>
>>>>
>>>>
>>>
>>
>
More information about the compiler-dev
mailing list