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 <roger.ri...@oracle.com> 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 <roger.ri...@oracle.com> 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 <pavel.ra...@oracle.com> 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
>>>>> 
>>>>> 
>>> 
>> 
> 

Reply via email to