blob: c3d4d585869b3710a4f035179d6f6fb35e6d0e8b [file] [log] [blame]
// Copyright (c) 2022, 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.
// This test ensures that when a `.call` tearoff occurs on the right hand side
// of an assignment, the resulting expression has an appropriate type.
import "package:expect/expect.dart";
import '../static_type_helper.dart';
dynamic _topLevelPropertySetValue;
set topLevelProperty(void Function() value) {
Expect.isNull(_topLevelPropertySetValue);
_topLevelPropertySetValue = value;
}
class C {
static dynamic _staticPropertySetValue;
void call() {}
static set staticProperty(void Function() value) {
Expect.isNull(_staticPropertySetValue);
_staticPropertySetValue = value;
}
}
class Base {
late final dynamic _basePropertySetValue;
set baseProperty(void Function() value) {
_basePropertySetValue = value;
}
}
class Derived extends Base {
late final dynamic _indexSetValue;
late final dynamic _instanceSetValue;
operator []=(int index, void Function() value) {
_indexSetValue = value;
}
set instanceProperty(void Function() value) {
_instanceSetValue = value;
}
void testSuperPropertySet() {
Expect.type<void Function()>((super.baseProperty = C())
..expectStaticType<Exactly<void Function()>>());
Expect.type<void Function()>(super._basePropertySetValue);
}
}
class Extended {
late final dynamic _extensionIndexSetValue;
late final dynamic _extensionPropertySetValue;
}
extension on Extended {
operator []=(int index, void Function() value) {
_extensionIndexSetValue = value;
}
set extensionProperty(void Function() value) {
_extensionPropertySetValue = value;
}
}
void testExtensionIndexSet() {
Extended e = Extended();
Expect.type<void Function()>(
(e[0] = C())..expectStaticType<Exactly<void Function()>>());
Expect.type<void Function()>(e._extensionIndexSetValue);
}
void testExtensionSet() {
Extended e = Extended();
Expect.type<void Function()>((e.extensionProperty = C())
..expectStaticType<Exactly<void Function()>>());
Expect.type<void Function()>(e._extensionPropertySetValue);
}
void testIndexSet() {
Derived d = Derived();
Expect.type<void Function()>(
(d[0] = C())..expectStaticType<Exactly<void Function()>>());
Expect.type<void Function()>(d._indexSetValue);
}
void testInstanceSet() {
Derived d = Derived();
Expect.type<void Function()>(
(d.instanceProperty = C())..expectStaticType<Exactly<void Function()>>());
Expect.type<void Function()>(d._instanceSetValue);
}
void testNullAwarePropertySet() {
Derived? d = Derived() as Derived?; // ignore: unnecessary_cast
Expect.type<void Function()>((d?.instanceProperty = C())
..expectStaticType<Exactly<void Function()?>>());
Expect.type<void Function()>(d!._instanceSetValue);
}
void testStaticSet() {
C._staticPropertySetValue = null;
Expect.type<void Function()>(
(C.staticProperty = C())..expectStaticType<Exactly<void Function()>>());
Expect.type<void Function()>(C._staticPropertySetValue);
}
void testTopLevelSet() {
_topLevelPropertySetValue = null;
Expect.type<void Function()>(
(topLevelProperty = C())..expectStaticType<Exactly<void Function()>>());
Expect.type<void Function()>(_topLevelPropertySetValue);
}
void testVariableSet() {
void Function() f;
Expect.type<void Function()>(
(f = C())..expectStaticType<Exactly<void Function()>>());
Expect.type<void Function()>(f);
}
main() {
testExtensionIndexSet();
testExtensionSet();
testIndexSet();
testInstanceSet();
testStaticSet();
Derived().testSuperPropertySet();
testTopLevelSet();
testVariableSet();
}