Generation of synthesized parameters

Alex Buckley alex.buckley at oracle.com
Tue Jan 29 17:14:07 PST 2013


I have been looking into the JLS treatment of the constructs mentioned 
below, with an eye to clarifying matters in JLS8.

I think a construct emitted by javac should be marked as synthesized if 
it corresponds to a construct declared implicitly in source code. 
Constructs declared implicitly in source code are:

- default constructors (8.8.9)
- the initial parameters of constructors for non-private inner member 
classes and anonymous classes (13.1, 15.9.5.1)
- the values and valueOf methods of enums (8.9.2)
- certain public fields of enums (8.9.2)
- certain public methods of interfaces (9.2)

So for the purpose of this thread, only the second item need be marked 
synthesized.

Alex

On 1/29/2013 12:14 PM, Joe Darcy wrote:
> Hello,
>
> On 1/29/2013 11:40 AM, Eric McCorkle wrote:
>> In order to facilitate writing tests for the MethodParameters feature,
>> I'd like to get a complete list of all the cases when javac can generate
>> synthesized parameters.
>>
>> Here is a list I've put together from email discussions and comments
>> in JBS:
>>
>> 1) outer "this" parameters
>
> Arguably, some outer this parameters would be *synthesized* with others
> would be *synthetic*.
>
> Inner classes that are also member classes, (see diagram in "Nested,
> Inner, Member, and Top-Level Classes,"
> https://blogs.oracle.com/darcy/entry/nested_inner_member_and_top), are
> potentially callable from outside of the enclosing class and are
> required to have an outer this parameter as the first parameter so that
> code from different compilers can call each other.  The other this
> parameter in this case is *synthesized* as it is mandated or implied by
> the JLS.
>
> On the other hand, named inner classes defined inside a method or
> constructor as well as anonymous classes only need to obey a
> compiler-internal contract and any extra parameters in this case are
> *synthetic*.  (Not all anonymous classes have an outer; an anonymous
> class created inside a static initializer block does not.)
>
>
>> 2) extra values passed to constructor for enum values
>
> Such parameters are *synthetic*, they are a javac implementation
> artifact not mandated or implied by the JLS.
>
>> 3) hidden values passed to constructors of inner classes for final
>> variables
>
> You'll can check the JLS regarding whether these are synthesized or
> synthetic, but I would assume they are synthetic.
>
>> 4) JLS mandated public no-arg constructors added by the compiler to
>> classes with no declared constructor: synthesized
>
> This is not a parameter, but another language structure.
>
> HTH,
>
> -Joe
>
>> 5) The two parameters pre-ended to enum constructors by javac
>>
>>
>> Does this capture everything, or does it miss something?
>>
>> Ideally, I would like to put together a complete list of all cases that
>> should generate synthesized parameters.  (If one already exists, then
>> that's great).
>>
>> Thanks,
>> Eric
>



More information about the compiler-dev mailing list