Fields and methods of a record are marked MANDATED

Joe Darcy joe.darcy at oracle.com
Fri Oct 11 17:16:03 UTC 2019


Hello,

Some modifiers are implementation properties, like strictfp, native, and 
synchronized  -- they not part of the "interface" of the method per se, 
but still useful to apply and query in some circumstances. The 
"mandated" property can have a similar character as partially a function 
of the particulars of how the record was declared.

The mandated information about records is used by the printing 
processor, javac -Xprint, to provide a more source-faithful 
representation of a record by eliding the mandated elements. The 
regression tests

test/langtools/tools/javac/processing/model/element/TestRecordDesugar.java

also looks at mandated vs explicit for record elements. At present, the 
test is only run against the source version of a record as the the 
information isn't (yet) available to the same degree from class file.

Cheers,

-Joe

PS Lack of consistent mandated information around method parameters has 
made it difficult to address several long-standing issue in the core 
reflection API.

On 10/10/2019 10:41 AM, Alex Buckley wrote:
> Enum types are specified such that a `values` method is always 
> implicitly declared. (If you declare one explicitly, you have two 
> method declarations with override-equivalent signatures, which is an 
> error per JLS 8.4.) Accordingly, the corresponding method in the class 
> file should always be marked as mandated. Sadly we don't have room for 
> an ACC_MANDATED flag in `method_info`, but morally the method is 
> mandated and Core Reflection should expose that fact.
>
> Record types are specified more sensitively: a component's accessor is 
> implicitly declared if and only if it isn't explicitly declared. (Same 
> deal as the default constructor of a class.) If a component's accessor 
> is explicitly declared, then there's nothing more to say; if it's 
> implicitly declared, then it should be marked as mandated.
>
> I wouldn't characterize this as member descriptor v. member 
> implementation, because that sounds like "the signature" v. "the 
> body". Fundamentally, the topic at hand is component accessors, which 
> are non-abstract methods of non-abstract classes; for such methods of 
> such classes, EITHER you declare both the signature and the body (in 
> which case there's an explicit declaration of both signature and body) 
> OR you declare neither (in which case there's an implicit declaration 
> of both signature and body). Ordinary consumers of the record type are 
> happy because they can be assured that component accessors are always 
> declared (i.e., the compiler will always find the signature, the VM 
> will always link the descriptor, and the subsequent execution of the 
> linked method will always do something useful), while reflective 
> consumers of the record type are happy because they can tell whether a 
> component accessor (the signature and body as one undivided entity) 
> was declared explicitly or implicitly. You say "random", I say 
> "accurate".
>
> Alex
>
> On 10/10/2019 9:09 AM, Brian Goetz wrote:
>> Under that interpretation, that leaves record members in a funny 
>> place, since a given mandated member (e.g., an accessor for a 
>> component) _might_ have been explicit in the source, or might not 
>> have been.  Should ACC_MANDATED describe the member descriptor (“spec 
>> mandates a member with this descriptor”) or only the implementation 
>> (“the source didn’t have it, but its here in the byte code”)?  In the 
>> latter interpretation, the presence of ACC_MANDATED on a mandated 
>> member would basically be random, based on implementation-of-the-day, 
>> which seems wrong.
>>
>>> On Oct 10, 2019, at 12:06 PM, Joe Darcy <joe.darcy at oracle.com> wrote:
>>>
>>> A mandated construct is one that is mandated by the specification, 
>>> but not explicitly declared. Constructs of that sort have been in 
>>> the platform since the beginning, such as default constructors. 
>>> ACC_MANDATED was added to the platform only more recently and has 
>>> some exposure through javax.lang.model.
>>>
>>> I recommend going forward ACC_MANDATED to be used more widely, on 
>>> all the mandated structures, including the values methods on enum 
>>> types, etc.
>>>
>>> Cheers,
>>>
>>> -Joe
>>>
>>> On 10/10/2019 8:50 AM, Brian Goetz wrote:
>>>> We should match the behavior of methods like `Enum::values`.
>>>>
>>>>> On Oct 10, 2019, at 10:15 AM, Remi Forax <forax at univ-mlv.fr> wrote:
>>>>>
>>>>> Hi all,
>>>>> fields and methods of a record are marked ACC_MANDATED which 
>>>>> contradict JLS 13.1.12 that explains that you can not use 
>>>>> ACC_MANDATED on field and method.
>>>>>
>>>>> regards,
>>>>> Rémi
>>>>>
>>


More information about the amber-spec-experts mailing list