While we are here, I also note that the script does not explicitly take into
account the `default` modifier on an interface method. However, after reading
https://docs.oracle.com/javase/specs/jls/se21/html/jls-9.html#jls-9.4 it seems
that whenever `default` appears, it should be alone one way or another; thus,
ordering is not an issue.
Indeed, here are the modifier possibilities for an interface method declaration:
public private abstract default static strictfp
And here are the relevant constraints:
- explicit public is discouraged
- abstract, default, and static are mutually exclusive
- strictfp is obsolete
- private and default are mutually exclusive
So if `default` appears, except for uncompilable, discouraged, or obsolete
cases, it should be alone. Thoughts?
> On 2 Jan 2024, at 17:23, Roger Riggs <[email protected]> wrote:
>
> Hi Pavel,
>
> I agree, the script should refer to the JLS.
> Some people look to the javadoc but its not authoritative on the language.
>
> Roger
>
> On 1/2/24 12:18 PM, Pavel Rappo wrote:
>> Right, the language model (javax.lang.model) is a better target to refer to
>> when considering _source_ files. However, java.lang.reflect.Modifier
>> corresponds to a set returned by
>> javax.lang.model.element.Element#getModifiers, not to a single instance of
>> javax.lang.model.element.Modifier; the order of that set is unspecified.
>>
>> So perhaps the right thing would be to directly refer to JLS from the
>> script. What do you think?
>>
>>> On 2 Jan 2024, at 16:56, Roger Riggs <[email protected]> wrote:
>>>
>>> Hi Pavel,
>>>
>>> It better to look to javax.lang.model.element.Modifier for the language
>>> view of the class.
>>>
>>> java.lang.reflect.Modifier covers the modifier flags as represented in the
>>> class file and defined in the JVMS.
>>> * The values for the constants
>>> * representing the modifiers are taken from the tables in sections
>>> * {@jvms 4.1}, {@jvms 4.4}, {@jvms 4.5}, and {@jvms 4.7} of
>>> * <cite>The Java Virtual Machine Specification</cite>.
>>> Sealing is represented in the class file as a non-empty list of permitted
>>> classes. Hence the method of java.lang.Class.
>>>
>>> Since java.lang.Modifier.toString is based on the flag bits from the class
>>> file, "sealed" would not appear in any string it generates.
>>>
>>>
>>> It might be possible to inject a comment in the toString method similar to
>>> the comment about interface not being a true modifier and including a
>>> reference to the javax.lang.model.element.Modifier enum.
>>>
>>> Roger
>>>
>>>
>>> On 1/2/24 11:31 AM, Pavel Rappo wrote:
>>>> Hi Roger,
>>>>
>>>> Happy New Year to you too!
>>>>
>>>> Although it's a _somewhat_ separate issue, I found that the shell script
>>>> refers to java.lang.reflect.Modifier#toString which does NOT mention
>>>> either `sealed` or `non-sealed`. More precisely, the script refers to the
>>>> JDK 8 version of that method, but [the
>>>> method](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/reflect/Modifier.html#toString(int))
>>>> hasn't changed since 2009 and states that:
>>>>
>>>> ...The modifier names are returned in an order consistent with the
>>>> suggested modifier orderings given in sections 8.1.1, 8.3.1, 8.4.3, 8.8.3,
>>>> and 9.1.1 of The Java Language Specification. The full modifier ordering
>>>> used by this method is:
>>>>
>>>> public protected private abstract static final transient volatile
>>>> synchronized native strictfp interface
>>>>
>>>> It does not seem like `sealed` and `non-sealed` are even modelled by
>>>> java.lang.reflect.Modifier, although `sealed` is modelled by
>>>> `java.lang.Class#isSealed`. It cannot be overlook, can it?
>>>>
>>>>
>>>>> On 2 Jan 2024, at 14:38, Roger Riggs <[email protected]> wrote:
>>>>>
>>>>> Hi Pavel,
>>>>>
>>>>> yes, a PR would be next.
>>>>>
>>>>> Happy New Year, Roger
>>>>>
>>>>> On 1/2/24 7:08 AM, Pavel Rappo wrote:
>>>>>
>>>>>> I assume the order for `sealed` and `non-sealed` has effectively been
>>>>>> decided by JLS:
>>>>>> https://docs.oracle.com/javase/specs/jls/se21/html/jls-8.html#jls-8.1.1
>>>>>>
>>>>>> 8.1.1. Class Modifiers
>>>>>> ...
>>>>>> ClassModifier:
>>>>>> (one of)
>>>>>> Annotation public protected private
>>>>>> abstract static final sealed non-sealed strictfp
>>>>>> ...
>>>>>>
>>>>>> If two or more (distinct) class modifiers appear in a class declaration,
>>>>>> then it is customary, though not required, that they appear in the order
>>>>>> consistent with that shown above in the production for ClassModifier.
>>>>>>
>>>>>>
>>>>>> Shall I just create a PR?
>>>>>>
>>>>>>
>>>>>>> On 2 Jan 2024, at 11:56, Pavel Rappo <[email protected]> wrote:
>>>>>>>
>>>>>>> I couldn't find any prior discussions on this matter.
>>>>>>>
>>>>>>> I noticed that bin/blessed-modifier-order.sh has not been updated for
>>>>>>> the [recently introduced](https://openjdk.org/jeps/409) `sealed` and
>>>>>>> `non-sealed` keywords. I also note that we already have cases in
>>>>>>> OpenJDK where those keywords are ordered differently. If we have a
>>>>>>> consensus on how to extend the "blessed order" onto those new keywords,
>>>>>>> I can create a PR to update the script.
>>>>>>>
>>>>>>> -Pavel
>>>>>>>
>>>>>>>
>