RFR: JDK-8191842: JShell: Inferred type information is lost when assigning types to a "var"
Robert Field
robert.field at oracle.com
Wed Dec 13 22:31:12 UTC 2017
Part 2: tests
ToolSimpleTest is missing the bug number.
VariablesTest needs a copyright update.
Please add tests for:
* anon classes with added method access
* anon class scratch var
-Robert
On 12/13/17 13:47, Robert Field wrote:
> Nice generalization.
>
> Wrap:
>
> 90: this breaks array initialization -- this would no longer work:
> int[] d = {1, 2, 3}
>
> Eval:
>
> 559: This code should be designed to work the same for automatically
> created scratch variables -- aka $1, $2, ... -- they should also have
> anonymous types.
>
> ? 322: Can ei.anonymousClasses be used rather than depending on the
> naming added in Util.JSHELL_ANONYMOUS?
>
> 389, 419, 421, 486-493: the name "constructor" is confusing because it
> contains other things and not the complete constructor. One of the
> unwritten rules of wraps in that
> they consist of a complete component, this code has several hanging
> pieces. Note the two closing braces in 492, braces et. al. should
> always be matched in a wrap.
> The mixture of strings and wraps does make this challenging.
> I'd suggest doing the bodyParts/extraInit computation first, then
> build up each component as complete entities: constructor body, class
> body, class -- all wraps.
>
> ExpressionToTypeInfo:
>
> 355: Seems fragile to assume that the constructor is first
>
> -Robert
>
>
> On 12/13/17 02:02, Jan Lahoda wrote:
>> Hi,
>>
>> When doing:
>> var r = new Object() { String s; }
>>
>> the type of "r" is the anonymous class itself. JShell handles this by
>> "upgrading" the anonymous class to be a member class, so that it can
>> be properly used from other snippets.
>>
>> But JShell is not prepared for anonymous classes inside the
>> expression (that are part of the resulting type), like:
>> ---
>> jshell> var list = Stream.of(1, 2, 3).map(j -> new Object() { int i =
>> j; }).collect(Collectors.toList());
>>
>> jshell> list.forEach(a -> System.out.println(a.i));
>> ---
>>
>> So, part of the proposed fix is to upgrade all anonymous classes to
>> member classes if needed. Also, intersection types are cleared from
>> fields before writing (the intersection types are installed to ensure
>> var semantics for cases like:
>> <Z extends Runnable & CharSequence> Z get1() { return null; }
>> var i1 = get1();
>> )
>>
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8191842
>> Webrev: http://cr.openjdk.java.net/~jlahoda/8191842/webrev.00/
>>
>> Thanks,
>> Jan
>>
>
More information about the kulla-dev
mailing list