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 21:47:00 UTC 2017
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