blob: a0ced5a60addf46e082cee2d2e4637e6abcf102b [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.
// SharedOptions=--enable-experiment=constructor-tearoffs
import "package:expect/expect.dart";
import "unnamed_new_test.dart" as prefix;
// Tests that `Classname.new` is allowed and works
// as an alias for the unnamed constructor.
// Constructor using `new` syntax.
class New<T> {
final int x;
const New.new([this.x = 0]) : super.new();
const New.thisNew(int x) : this.new(x);
const New.thisNoNew(int x) : this(x);
const factory New.factoryNew(int x) = New<T>.new;
const factory New.factoryNoNew(int x) = New<T>;
}
class NewSub<T> extends New<T> {
const NewSub.new(); // Implicit `: super()`
const NewSub.implicit(); // Implicit `: super()`
const NewSub.superNew(int x) : super.new(x);
const NewSub.superNoNew(int x) : super(x);
}
// Same without `.new` on the constructor declaration.
// Can still be referred to as `.new`.
class NoNew<T> {
final int x;
const NoNew([this.x = 0]);
const NoNew.thisNew(int x) : this.new(x);
const NoNew.thisNoNew(int x) : this(x);
const factory NoNew.factoryNew(int x) = NoNew<T>.new;
const factory NoNew.factoryNoNew(int x) = NoNew<T>;
}
class NoNewSub<T> extends NoNew<T> {
const NoNewSub.new(); // Implicit `: super()`
const NoNewSub.implicit(); // Implicit `: super()`
const NoNewSub.superNew(int x) : super.new(x);
const NoNewSub.superNoNew(int x) : super(x);
}
// Avoid "unused value" warnings from the analyzer.
void use(Object _) {}
void main() {
use(const Object.new());
use(new Object.new());
use(Object.new());
use(const Symbol.new("a"));
use(new Symbol.new("a"));
use(Symbol.new("a"));
use(const New(1));
use(const New.new(1));
use(new New(1));
use(new New.new(1));
use(New(1));
use(New.new(1));
use(const New.thisNew(1));
use(const New.thisNoNew(1));
use(new New.thisNew(1));
use(new New.thisNoNew(1));
use(New.thisNew(1));
use(New.thisNoNew(1));
use(const New.factoryNew(1));
use(const New.factoryNoNew(1));
use(new New.factoryNew(1));
use(new New.factoryNoNew(1));
use(New.factoryNew(1));
use(New.factoryNoNew(1));
use(const NewSub.new());
use(const NewSub.implicit());
use(const NewSub.superNew(1));
use(const NewSub.superNoNew(1));
use(const New<int>(1));
use(const New<int>.new(1));
use(new New<int>(1));
use(new New<int>.new(1));
use(New<int>(1));
use(New<int>.new(1));
use(const New<int>.thisNew(1));
use(const New<int>.thisNoNew(1));
use(new New<int>.thisNew(1));
use(new New<int>.thisNoNew(1));
use(New<int>.thisNew(1));
use(New<int>.thisNoNew(1));
use(const New<int>.factoryNew(1));
use(const New<int>.factoryNoNew(1));
use(new New<int>.factoryNew(1));
use(new New<int>.factoryNoNew(1));
use(New<int>.factoryNew(1));
use(New<int>.factoryNoNew(1));
use(const NewSub<int>.new());
use(const NewSub<int>.implicit());
use(const NewSub<int>.superNew(1));
use(const NewSub<int>.superNoNew(1));
use(New.new);
use(New<int>.new);
use(const prefix.New(1));
use(const prefix.New.new(1));
use(new prefix.New(1));
use(new prefix.New.new(1));
use(prefix.New(1));
use(prefix.New.new(1));
use(const prefix.New.thisNew(1));
use(const prefix.New.thisNoNew(1));
use(new prefix.New.thisNew(1));
use(new prefix.New.thisNoNew(1));
use(prefix.New.thisNew(1));
use(prefix.New.thisNoNew(1));
use(const prefix.New.factoryNew(1));
use(const prefix.New.factoryNoNew(1));
use(new prefix.New.factoryNew(1));
use(new prefix.New.factoryNoNew(1));
use(prefix.New.factoryNew(1));
use(prefix.New.factoryNoNew(1));
use(const prefix.NewSub.new());
use(const prefix.NewSub.implicit());
use(const prefix.NewSub.superNew(1));
use(const prefix.NewSub.superNoNew(1));
use(const prefix.New<int>(1));
use(const prefix.New<int>.new(1));
use(new prefix.New<int>(1));
use(new prefix.New<int>.new(1));
use(prefix.New<int>(1));
use(prefix.New<int>.new(1));
use(const prefix.New<int>.thisNew(1));
use(const prefix.New<int>.thisNoNew(1));
use(new prefix.New<int>.thisNew(1));
use(new prefix.New<int>.thisNoNew(1));
use(prefix.New<int>.thisNew(1));
use(prefix.New<int>.thisNoNew(1));
use(const prefix.New<int>.factoryNew(1));
use(const prefix.New<int>.factoryNoNew(1));
use(new prefix.New<int>.factoryNew(1));
use(new prefix.New<int>.factoryNoNew(1));
use(prefix.New<int>.factoryNew(1));
use(prefix.New<int>.factoryNoNew(1));
use(const prefix.NewSub<int>.new());
use(const prefix.NewSub<int>.implicit());
use(const prefix.NewSub<int>.superNew(1));
use(const prefix.NewSub<int>.superNoNew(1));
use(prefix.New.new);
use(prefix.New<int>.new);
// Ditto for NoNew
use(const NoNew(1));
use(const NoNew.new(1));
use(new NoNew(1));
use(new NoNew.new(1));
use(NoNew(1));
use(NoNew.new(1));
use(const NoNew.thisNew(1));
use(const NoNew.thisNoNew(1));
use(new NoNew.thisNew(1));
use(new NoNew.thisNoNew(1));
use(NoNew.thisNew(1));
use(NoNew.thisNoNew(1));
use(const NoNew.factoryNew(1));
use(const NoNew.factoryNoNew(1));
use(new NoNew.factoryNew(1));
use(new NoNew.factoryNoNew(1));
use(NoNew.factoryNew(1));
use(NoNew.factoryNoNew(1));
use(const NoNewSub.new());
use(const NoNewSub.implicit());
use(const NoNewSub.superNew(1));
use(const NoNewSub.superNoNew(1));
use(const NoNew<int>(1));
use(const NoNew<int>.new(1));
use(new NoNew<int>(1));
use(new NoNew<int>.new(1));
use(NoNew<int>(1));
use(NoNew<int>.new(1));
use(const NoNew<int>.thisNew(1));
use(const NoNew<int>.thisNoNew(1));
use(new NoNew<int>.thisNew(1));
use(new NoNew<int>.thisNoNew(1));
use(NoNew<int>.thisNew(1));
use(NoNew<int>.thisNoNew(1));
use(const NoNew<int>.factoryNew(1));
use(const NoNew<int>.factoryNoNew(1));
use(new NoNew<int>.factoryNew(1));
use(new NoNew<int>.factoryNoNew(1));
use(NoNew<int>.factoryNew(1));
use(NoNew<int>.factoryNoNew(1));
use(const NoNewSub<int>.new());
use(const NoNewSub<int>.implicit());
use(const NoNewSub<int>.superNew(1));
use(const NoNewSub<int>.superNoNew(1));
use(NoNew.new);
use(NoNew<int>.new);
use(const prefix.NoNew(1));
use(const prefix.NoNew.new(1));
use(new prefix.NoNew(1));
use(new prefix.NoNew.new(1));
use(prefix.NoNew(1));
use(prefix.NoNew.new(1));
use(const prefix.NoNew.thisNew(1));
use(const prefix.NoNew.thisNoNew(1));
use(new prefix.NoNew.thisNew(1));
use(new prefix.NoNew.thisNoNew(1));
use(prefix.NoNew.thisNew(1));
use(prefix.NoNew.thisNoNew(1));
use(const prefix.NoNew.factoryNew(1));
use(const prefix.NoNew.factoryNoNew(1));
use(new prefix.NoNew.factoryNew(1));
use(new prefix.NoNew.factoryNoNew(1));
use(prefix.NoNew.factoryNew(1));
use(prefix.NoNew.factoryNoNew(1));
use(const prefix.NoNewSub.new());
use(const prefix.NoNewSub.implicit());
use(const prefix.NoNewSub.superNew(1));
use(const prefix.NoNewSub.superNoNew(1));
use(const prefix.NoNew<int>(1));
use(const prefix.NoNew<int>.new(1));
use(new prefix.NoNew<int>(1));
use(new prefix.NoNew<int>.new(1));
use(prefix.NoNew<int>(1));
use(prefix.NoNew<int>.new(1));
use(const prefix.NoNew<int>.thisNew(1));
use(const prefix.NoNew<int>.thisNoNew(1));
use(new prefix.NoNew<int>.thisNew(1));
use(new prefix.NoNew<int>.thisNoNew(1));
use(prefix.NoNew<int>.thisNew(1));
use(prefix.NoNew<int>.thisNoNew(1));
use(const prefix.NoNew<int>.factoryNew(1));
use(const prefix.NoNew<int>.factoryNoNew(1));
use(new prefix.NoNew<int>.factoryNew(1));
use(new prefix.NoNew<int>.factoryNoNew(1));
use(prefix.NoNew<int>.factoryNew(1));
use(prefix.NoNew<int>.factoryNoNew(1));
use(const prefix.NoNewSub<int>.new());
use(const prefix.NoNewSub<int>.implicit());
use(const prefix.NoNewSub<int>.superNew(1));
use(const prefix.NoNewSub<int>.superNoNew(1));
use(prefix.NoNew.new);
use(prefix.NoNew<int>.new);
}