RFR 8144903: JShell: determine incorrectly the type of the expression which is array type of captured type

Jan Lahoda jan.lahoda at oracle.com
Fri Dec 11 16:56:11 UTC 2015


Looks good to me too. Robert, I can push this, unless you want to.

Jan

On 11.12.2015 11:54, Maurizio Cimadamore wrote:
> Looks good to me; also good point about lower bounds... lower bounds are
> no good for LHS in assigments (and I shouldn't make type-system comments
> too late at night) :-)
>
> Maurizio
>
> On 11/12/15 10:06, ShinyaYoshida wrote:
>> Oh... Certainly.
>> I've updated:
>> http://cr.openjdk.java.net/~shinyafox/kulla/8144903/webrev.05/
>> <http://cr.openjdk.java.net/%7Eshinyafox/kulla/8144903/webrev.05/>
>>
>> Thank you,
>> shinyafox(Shinya Yoshida)
>>
>> 2015-12-11 16:52 GMT+09:00 Robert Field <robert.field at oracle.com
>> <mailto:robert.field at oracle.com>>:
>>
>>        91     public String visitClassType(ClassType ct, Locale locale) {
>>        92         try {
>>        93             useWildCard = true;
>>        94             return super.visitClassType(ct, locale);
>>        95         } finally {
>>        96             useWildCard = false;
>>        97         }
>>        98     }
>>
>>     I believe this could give wrong results because with nested class types you will be coming back to a case where useWildCard should still be true.
>>     The thing to do here is save the incoming value of the state you want to change (useWildCard) in a local variable, and restore it in the finally.
>>
>>     -Robert
>>
>>     On 12/10/15 14:13, ShinyaYoshida wrote:
>>>     Hi Maurizio, Thank you.
>>>
>>>     2015-12-11 6:58 GMT+09:00 Maurizio Cimadamore
>>>     <<mailto:maurizio.cimadamore at oracle.com>maurizio.cimadamore at oracle.com>:
>>>
>>>         Looks good, some comments:
>>>
>>>         * watch out for the 'useWildcards' variable - you set it to
>>>         true on the first class you see, and you never reset it to
>>>         false - that could lead to spurious behavior - at least in
>>>         principle (probably not in practice given that if a wildcard
>>>         appears as a toplevel type you never hit visitClassType).
>>>
>>>     I've updated:
>>>     http://cr.openjdk.java.net/~shinyafox/kulla/8144903/webrev.04/
>>>     <http://cr.openjdk.java.net/%7Eshinyafox/kulla/8144903/webrev.04/>
>>>
>>>         * I think you also use the wildcard lower bound, in case of a
>>>         toplevel ? super T. In that case, T is always better than Object.
>>>
>>>     I don't think so, because this printer is to determine a
>>>      suitable variable type which is assigned the expression of the
>>>     "type " which is the argument of this printer.
>>>     And a expression of "? super T" is not assignable to T:
>>>     F<? super String> f = ...
>>>     String s = f.get() // failed to compile
>>>
>>>     Regards,
>>>     shinyafox(Shinya Yoshida)
>>>
>>>
>>>
>>>         Maurizio
>>>
>>>
>>>         On 10/12/15 14:15, ShinyaYoshida wrote:
>>>>         Hi Maurizio and Robert,
>>>>         Thank you for a lot of advice and comments!
>>>>
>>>>         Now I agreed.
>>>>         It is difficult( or impossible) to determine the completely
>>>>         "right" type from bound.
>>>>         And when I work hard around that, the work wouldn't bring
>>>>         benefit what is worth the working to us.
>>>>
>>>>         I'd like propose the fix based on webrev.02:
>>>>         http://cr.openjdk.java.net/~shinyafox/kulla/8144903/webrev.03/
>>>>         <http://cr.openjdk.java.net/%7Eshinyafox/kulla/8144903/webrev.03/>
>>>>
>>>>         In this patch:
>>>>         1. Fix 8144903(this issue)
>>>>         2. Use always wildcard instead of upper bound
>>>>         3. In visitWildcardType, if it is top-level type and it
>>>>         doesn't have extends bound, return "Object"
>>>>         4. In TypePrinter, "Object" appears sometimes so I declare
>>>>         'private static final String OBJECT = "Object"' and use it
>>>>         instead of the literal.
>>>>         5. Add & modify some tests
>>>>
>>>>         Could you review this?
>>>>
>>>>         Best Regards,
>>>>         shinyafox(Shinya Yoshida)
>>>>
>>>>         2015-12-10 19:32 GMT+09:00 Maurizio Cimadamore
>>>>         <<mailto:maurizio.cimadamore at oracle.com>maurizio.cimadamore at oracle.com>:
>>>>
>>>>
>>>>
>>>>             On 10/12/15 03:07, Robert Field wrote:
>>>>>             public static Object $2;
>>>>>
>>>>>             otherwise the generated code will break.
>>>>             What do you mean by this? How is using Object breaking
>>>>             the generated code? Seems to me you have just widened
>>>>             the type of a variable storing an expression - that
>>>>             ought to work; the only problem here is user
>>>>             expectations: if the user is expecting to pass this to a
>>>>             method accepting a CharSequence he/she will be
>>>>             disappointed. But how big of a problem is this? And, as
>>>>             I pointed out elsewhere, no general solution exists for
>>>>             this.
>>>>
>>>>             Maurizio
>>>>
>>>>
>>>
>>>
>>
>>
>


More information about the kulla-dev mailing list