[lworld] RFR: 8237072: [lworld] Add support for denoting and deriving the reference projection

Maurizio Cimadamore mcimadamore at openjdk.java.net
Fri May 1 00:54:05 UTC 2020

On Fri, 1 May 2020 00:41:51 GMT, Maurizio Cimadamore <mcimadamore at openjdk.org> wrote:

>>> But I got an NPE where it was expected:
>> My bad - I realized that the test I put together was only compiling and not executing - sorry for the noise.
>> // Problem: 3, we infer a stream of X.ref's causing
>>     // the method reference to not type check.
>>     void unbound_lookup_with_projected_receiver() {
>>         X [] a = new X[0];
>>         Arrays.stream(a).map(X::data).filter(p -> p != null).forEach(System.out::println);
>> /*
>> error: incompatible types: invalid method reference
>>         Arrays.stream(a).map(X::data).filter(p -> p != null).forEach(System.out::println);
>>                              ^
>>     method data in class X cannot be applied to given types
>>       required: no arguments
>>       found:    X$ref
>>       reason: actual and formal argument lists differ in length
> For this one, I think something that an approach that could be discussed would be to consider the method reference
> `V::m`, where `V` is an inline class, in the same way as we consider `List::add`. That is, we have `class name::member
> name`.  In such cases we infer the right parameterization from the context; here it would be nice if we could infer the
> right val/ref from the context too.

Another odd test:

static inline class V  {
        int y = 52;

        class Bar { }
        static class Baz { }

    public static void main(String[] args) {
        new V.ref().new Bar();
        new V().new Bar();
        V.Baz baz1;
        V.ref.Baz baz2;

This gives:

error: cannot find symbol
        new V.ref().new Bar();
  symbol:   class Bar
  location: class V$ref
error: cannot find symbol
        V.ref.Baz baz2;
  symbol:   class Baz
  location: class V$ref
2 errors
Now, I don't know what's the status of inner classes and values - but this seems to suggest that member types are not
copied from one scope to another (since the nested names are only resolved from the `val` projection.


PR: https://git.openjdk.java.net/valhalla/pull/32

More information about the valhalla-dev mailing list