blob: d3b699b436eba131fd97c4a9d534612a5702b0c6 [file] [log] [blame]
// Copyright (c) 2021, 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.
/// @assertion Because of that, we introduce a [new] syntax that can be used to
/// denote the unnamed constructor: [C.new]. It can be used in every place where
/// a named constructor can be referenced, but will instead denote the unnamed
/// constructor, and it can be used to tear off the unnamed constructor without
/// interfering with using the class name to denote the [Type] object.
///
/// class C {
/// final int x;
/// const C.new(this.x); // declaration.
/// }
///
/// class D extend C {
/// D(int x) : super.new(x * 2); // super constructor reference.
/// }
///
/// void main() {
/// D.new(1); // normal invocation.
/// const C.new(1); // const invocation.
/// new C.new(1); // explicit new invocation.
/// var f = C.new; // tear-off.
/// f(1);
/// }
/// }
///
/// @description Checks the example from the Spec.
///
/// @Issue 46198
/// @author iarkh@unipro.ru
// SharedOptions=--enable-experiment=constructor-tearoffs
import "../../Utils/expect.dart";
class C {
final int x;
const C.new(this.x);
}
class D extends C {
D(int x) : super.new(x * 2);
}
void main() {
D d = D.new(1);
Expect.equals(d.x, 2);
const c = C.new(3);
Expect.equals(c.x, 3);
var c1 = new C.new(7);
Expect.equals(c1.x, 7);
var f = C.new;
int i = f(-1).x;
Expect.equals(i, -1);
}