question about JDK-8063054 (incorrect raw type warnings for method references)
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Fri Mar 24 16:26:02 UTC 2017
On 24/03/17 15:56, B. Blaser wrote:
> Hi Maurizio,
>
> On 23 March 2017 at 12:58, Maurizio Cimadamore
> <maurizio.cimadamore at oracle.com> wrote:
>> Hi Bernard,
>>
>> [...]
>>
>> I think the lines in bold are the ones we need to pay attention to; in other
>> words, if the receiver type is raw and the type of the first search is
>> identical to the type of the second search, then it means no inference
>> occurred. I think something like this could easily be achieved w/o any
>> visitors, with something like this:
>>
>> if (that.getMode() == ReferenceMode.INVOKE &&
>> TreeInfo.isStaticSelector(that.expr, names) &&
>> that.kind.isUnbound() &&
>> types.isSameTypes(lookupHelper.site, that.expr.type)
>> {
>> chk.checkRaw(that.expr, localEnv);
>> }
>>
>> I did some quick tests and this simple patch seems to remove the undesired
>> warnings in the examples we have seen so far, but retains them where they
>> are truly deserved. What do you think?
>>
>> Maurizio
> Fine, nice solution... I would simply rewrite it as follows (
> lookupHelper.site.isRaw() ):
>
> if (that.getMode() == ReferenceMode.INVOKE &&
> TreeInfo.isStaticSelector(that.expr, names) &&
> that.kind.isUnbound() &&
> lookupHelper.site.isRaw()) {
> chk.checkRaw(that.expr, localEnv);
> }
>
> This would avoid some redundant checks if "ReferenceType" isn't raw (I
> think), for example:
>
> class Test10 {
> interface Consumer<T> { void accept(T arg); }
> interface Parent<P> { void foo(); }
> interface Child extends Parent<String> {}
> static <T> void m(T arg, Consumer<T> f) {}
> public void test(Child c) { m(c, Parent<String>::foo); }
> }
>
> Here, "types.isSameType(lookupHelper.site, that.expr.type)" would
> verify if "Parent<String> == Parent<String>" and then "chk.checkRaw()"
> would check if "Parent<String>" is raw...
>
> But, at first sight, this looks good. I'll try to do some more testing...
>
> What do you think of this small rewriting?
Yeah - I think that could work too (not that I'm too worried about
performances here - we're outside overload resolution at this stage).
Maurizio
>
> Bernard
More information about the compiler-dev
mailing list