20faaa5d94
Change-Id: Ib18f554c1076f27a3f7c0df5a36410da41a1f467 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/148784 Reviewed-by: Paul Berry <paulberry@google.com> Reviewed-by: Sigmund Cherem <sigmund@google.com>
134 lines
4.0 KiB
Dart
134 lines
4.0 KiB
Dart
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
// @dart = 2.7
|
|
|
|
/*member: main:[null]*/
|
|
main() {
|
|
refineBeforeCapture();
|
|
refineAfterCapture();
|
|
refineAfterNestedCapture();
|
|
refineAfterCaptureInNested();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Refine a local before it has been captured.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*member: Class1.:[exact=Class1]*/
|
|
class Class1 {
|
|
/*member: Class1.method1:[null]*/
|
|
method1() {}
|
|
}
|
|
|
|
/*member: _refineBeforeCapture:[exact=Class1]*/
|
|
_refineBeforeCapture(/*[null|exact=Class1]*/ o) {
|
|
o. /*invoke: [null|exact=Class1]*/ method1();
|
|
o. /*invoke: [exact=Class1]*/ method1();
|
|
|
|
/*[exact=Class1]*/ localFunction() => o;
|
|
return localFunction();
|
|
}
|
|
|
|
/*member: refineBeforeCapture:[null]*/
|
|
refineBeforeCapture() {
|
|
_refineBeforeCapture(new Class1());
|
|
_refineBeforeCapture(null);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Refine a local after it has been captured.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*member: Class3.:[exact=Class3]*/
|
|
class Class3 {
|
|
/*member: Class3.method3:[null]*/
|
|
method3() {}
|
|
}
|
|
|
|
/*member: Class4.:[exact=Class4]*/
|
|
class Class4 {}
|
|
|
|
/*member: _refineAfterCapture:Union([exact=Class3], [exact=Class4])*/
|
|
_refineAfterCapture(/*Union([exact=Class3], [exact=Class4])*/ o) {
|
|
/*Union([exact=Class3], [exact=Class4])*/ localFunction() => o;
|
|
|
|
o. /*invoke: Union([exact=Class3], [exact=Class4])*/ method3();
|
|
o. /*invoke: Union([exact=Class3], [exact=Class4])*/ method3();
|
|
|
|
return localFunction();
|
|
}
|
|
|
|
/*member: refineAfterCapture:[null]*/
|
|
refineAfterCapture() {
|
|
_refineAfterCapture(new Class3());
|
|
_refineAfterCapture(new Class4());
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Refine a local after it has been captured in a nested local function.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*member: Class5.:[exact=Class5]*/
|
|
class Class5 {
|
|
/*member: Class5.method5:[null]*/
|
|
method5() {}
|
|
}
|
|
|
|
/*member: Class6.:[exact=Class6]*/
|
|
class Class6 {}
|
|
|
|
/*member: _refineAfterNestedCapture:Union([exact=Class5], [exact=Class6])*/
|
|
_refineAfterNestedCapture(/*Union([exact=Class5], [exact=Class6])*/ o) {
|
|
/*Union([exact=Class5], [exact=Class6])*/ localFunction() {
|
|
/*Union([exact=Class5], [exact=Class6])*/ nestedFunction() => o;
|
|
return nestedFunction();
|
|
}
|
|
|
|
o. /*invoke: Union([exact=Class5], [exact=Class6])*/ method5();
|
|
o. /*invoke: Union([exact=Class5], [exact=Class6])*/ method5();
|
|
|
|
return localFunction();
|
|
}
|
|
|
|
/*member: refineAfterNestedCapture:[null]*/
|
|
refineAfterNestedCapture() {
|
|
_refineAfterNestedCapture(new Class5());
|
|
_refineAfterNestedCapture(new Class6());
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Refine a local in a local function after it has been captured.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*member: Class7.:[exact=Class7]*/
|
|
class Class7 {
|
|
/*member: Class7.method7:[null]*/
|
|
method7() {}
|
|
}
|
|
|
|
/*member: Class8.:[exact=Class8]*/
|
|
class Class8 {}
|
|
|
|
/*member: _refineAfterCaptureInNested:Union([exact=Class7], [exact=Class8])*/
|
|
_refineAfterCaptureInNested(/*Union([exact=Class7], [exact=Class8])*/ o) {
|
|
/*Union([exact=Class7], [exact=Class8])*/ localFunction(
|
|
/*Union([exact=Class7], [exact=Class8])*/ p) {
|
|
/*Union([exact=Class7], [exact=Class8])*/ nestedFunction() => p;
|
|
|
|
p. /*invoke: Union([exact=Class7], [exact=Class8])*/ method7();
|
|
p. /*invoke: Union([exact=Class7], [exact=Class8])*/ method7();
|
|
|
|
return nestedFunction();
|
|
}
|
|
|
|
return localFunction(o);
|
|
}
|
|
|
|
/*member: refineAfterCaptureInNested:[null]*/
|
|
refineAfterCaptureInNested() {
|
|
_refineAfterCaptureInNested(new Class7());
|
|
_refineAfterCaptureInNested(new Class8());
|
|
}
|