blob: fcaecf2d509e69dbd99cd1572227a92b32484735 [file] [log] [blame]
// 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());
}