On Tue, 7 Feb 2023 15:47:25 GMT, Maurizio Cimadamore <mcimadam...@openjdk.org> 
wrote:

>> Class `Signature` (aka `JavaTypeSignature`), all subclasses, 
>> `MethodSignature` and `ClassSignature` are designed according to [JVMS 
>> 4.7.9.1 
>> Signatures](https://docs.oracle.com/javase/specs/jvms/se19/html/jvms-4.html#jvms-4.7.9.1)
>
>> Class `Signature` (aka `JavaTypeSignature`), all subclasses, 
>> `MethodSignature` and `ClassSignature` are designed according to [JVMS 
>> 4.7.9.1 
>> Signatures](https://docs.oracle.com/javase/specs/jvms/se19/html/jvms-4.html#jvms-4.7.9.1)
> 
> The production is the same as the one I quoted, but thanks for pointing me at 
> the correct one. So:
> 
> 
> JavaTypeSignature:
>    ReferenceTypeSignature
>    BaseType 
> 
> 
> and
> 
> 
> ReferenceTypeSignature:
>    ClassTypeSignature
>    TypeVariableSignature
>    ArrayTypeSignature
> 
> 
> So, while I can expect that `ArrayTypeSignature` *is a* `Signature` (or 
> `JavaTypeSignature`), I cannot explain why `ThrowsSignature` extends 
> `Signature`. That doesn't seem to follow from the production. That is, if a 
> client obtains a `Signature` and wanted to pattern match, what are the cases 
> it should worry about? I believe the cases are the ones listed above.
> 
> One thing I missed is that e.g. `TypeParam` is *not* a signature (which is 
> the only case among the nested classes in `Signature`). But 
> `ThrowsSignature`, `TypeArg` and `TypeParam` are signatures even though that 
> doesn't seem to be the case when looking at the production in the JVMS. If we 
> want to keep these fine, but I don't think they should extend `Signature`, 
> either directly or indirectly. That is, `Signature` should be a sealed type 
> with 4 leaves (base-type/array/type var/class-type).

**Specification:**

MethodSignature:
[TypeParameters] ( {JavaTypeSignature} ) Result {ThrowsSignature}

Result:
JavaTypeSignature 
VoidDescriptor

ThrowsSignature:
^ ClassTypeSignature 
^ TypeVariableSignature



**Reflect in API mapping:**

    public sealed interface ClassTypeSig
            extends RefTypeSig, ThrowableSig

and

    public sealed interface TypeVarSig
            extends RefTypeSig, ThrowableSig

and

    /**
     * @return method signature
     * @param typeParameters signatures for the type parameters
     * @param exceptions sigantures for the exceptions
     * @param result signature for the return type
     * @param arguments signatures for the method arguments
     */
    public static MethodSignature of(List<Signature.TypeParam> typeParameters,
                                     List<Signature.ThrowableSig> exceptions,
                                     Signature result,
                                     Signature... arguments) {


`Signature.ThrowableSig` is a `Signature` and it is a common super of 
`ClassTypeSig` and `ClassTypeSig`.

-------------

PR: https://git.openjdk.org/jdk/pull/10982

Reply via email to