mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 15:09:04 +00:00
06763dd539
This adds formatting support for upcoming language features: - Named arguments anywhere - Enhanced enums - "super." parameters It doesn't change the formatting of any existing code, so it should be safe to roll this in without coordinating a pre-built SDK roll. I also went ahead and ran the formatter on the related language tests since before now they couldn't be formatted. (And I incidentally ran the formatter on the other enum tests sitting in the same directory.) Edit: Actually there is one small change to existing formatting: enum declarations will now get a blank line inserted before them. Most hand authored enums already have this so will be unchanged but I see a few diffs when formatting generated code. Change-Id: Icefd9f10bedc589312396cf0ddb8eafc418f8dbf Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/235284 Auto-Submit: Bob Nystrom <rnystrom@google.com> Reviewed-by: Alexander Thomas <athom@google.com> Reviewed-by: William Hesse <whesse@google.com> Commit-Queue: William Hesse <whesse@google.com>
456 lines
16 KiB
Dart
456 lines
16 KiB
Dart
// 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.
|
|
|
|
// Check that placing a named argument anywhere in the argument list works for
|
|
// all kinds of invocations.
|
|
|
|
import "package:expect/expect.dart";
|
|
|
|
List<Object?> arguments = [];
|
|
|
|
X evaluate<X>(X x) {
|
|
arguments.add(x);
|
|
return x;
|
|
}
|
|
|
|
void runAndCheckEvaluationOrder(
|
|
List<Object?> expectedArguments, void Function() functionToRun) {
|
|
arguments.clear();
|
|
functionToRun();
|
|
Expect.listEquals(expectedArguments, arguments);
|
|
}
|
|
|
|
class A {
|
|
A(int x, String y, {bool z = false, required double w}) {
|
|
Expect.equals(1, x);
|
|
Expect.equals("2", y);
|
|
Expect.isFalse(z);
|
|
Expect.equals(3.14, w);
|
|
}
|
|
|
|
A.redir1()
|
|
: this(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
|
|
|
|
A.redir2()
|
|
: this(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
|
|
|
|
A.redir3()
|
|
: this(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
|
|
|
|
A.redir4()
|
|
: this(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
|
|
|
|
A.redir5()
|
|
: this(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
|
|
|
|
A.redir6() : this(evaluate(1), w: evaluate(3.14), evaluate("2"));
|
|
|
|
factory A.foo(int x, String y, {bool z = false, required double w}) {
|
|
Expect.equals(1, x);
|
|
Expect.equals("2", y);
|
|
Expect.isFalse(z);
|
|
Expect.equals(3.14, w);
|
|
return A(x, y, z: z, w: w);
|
|
}
|
|
|
|
factory A.redirFactory(int x, String y, {bool z, required double w}) = A;
|
|
|
|
void Function(int x, String y, {bool z, required double w}) get property {
|
|
return A.foo;
|
|
}
|
|
|
|
void bar(int x, String y, {bool z = false, required double w}) {
|
|
Expect.equals(1, x);
|
|
Expect.equals("2", y);
|
|
Expect.isFalse(z);
|
|
Expect.equals(3.14, w);
|
|
}
|
|
|
|
void call(int x, String y, {bool z = false, required double w}) {
|
|
Expect.equals(1, x);
|
|
Expect.equals("2", y);
|
|
Expect.isFalse(z);
|
|
Expect.equals(3.14, w);
|
|
}
|
|
}
|
|
|
|
typedef B = A;
|
|
|
|
foo(int x, String y, {bool z = false, required double w}) {
|
|
Expect.equals(1, x);
|
|
Expect.equals("2", y);
|
|
Expect.isFalse(z);
|
|
Expect.equals(3.14, w);
|
|
}
|
|
|
|
test(dynamic d, Function f, A a) {
|
|
void local(int x, String y, {bool z = false, required double w}) {
|
|
Expect.equals(1, x);
|
|
Expect.equals("2", y);
|
|
Expect.isFalse(z);
|
|
Expect.equals(3.14, w);
|
|
}
|
|
|
|
// StaticInvocation.
|
|
runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
|
|
foo(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
|
|
foo(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
|
|
foo(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
|
|
foo(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
|
|
foo(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2"], () {
|
|
foo(evaluate(1), w: evaluate(3.14), evaluate("2"));
|
|
});
|
|
|
|
// FactoryConstructorInvocation.
|
|
runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
|
|
A.foo(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
|
|
A.foo(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
|
|
A.foo(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
|
|
B.foo(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
|
|
B.foo(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
|
|
B.foo(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
|
|
B.foo(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
|
|
B.foo(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2"], () {
|
|
B.foo(evaluate(1), w: evaluate(3.14), evaluate("2"));
|
|
});
|
|
|
|
// ConstructorInvocation.
|
|
runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
|
|
A(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
|
|
A(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
|
|
A(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
|
|
B(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
|
|
B(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
|
|
B(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
|
|
B(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
|
|
B(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2"], () {
|
|
B(evaluate(1), w: evaluate(3.14), evaluate("2"));
|
|
});
|
|
|
|
// DynamicInvocation.
|
|
runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
|
|
d(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
|
|
d(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
|
|
d(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
|
|
d(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
|
|
d(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2"], () {
|
|
d(evaluate(1), w: evaluate(3.14), evaluate("2"));
|
|
});
|
|
|
|
// FunctionInvocation.
|
|
runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
|
|
f(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
|
|
f(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
|
|
f(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
|
|
f(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
|
|
f(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2"], () {
|
|
f(evaluate(1), w: evaluate(3.14), evaluate("2"));
|
|
});
|
|
|
|
// InstanceGetterInvocation.
|
|
runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
|
|
a.property(evaluate(1), evaluate("2"),
|
|
z: evaluate(false), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
|
|
a.property(
|
|
evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
|
|
a.property(
|
|
z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
|
|
a.property(
|
|
w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
|
|
a.property(
|
|
evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2"], () {
|
|
a.property(evaluate(1), w: evaluate(3.14), evaluate("2"));
|
|
});
|
|
|
|
// InstanceInvocation.
|
|
runAndCheckEvaluationOrder([a, 1, "2", false, 3.14], () {
|
|
evaluate(a)
|
|
.bar(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([a, 1, false, "2", 3.14], () {
|
|
evaluate(a)
|
|
.bar(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([a, false, 1, "2", 3.14], () {
|
|
evaluate(a)
|
|
.bar(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([a, 3.14, 1, "2", false], () {
|
|
evaluate(a)
|
|
.bar(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([a, 1, 3.14, "2", false], () {
|
|
evaluate(a)
|
|
.bar(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([a, 1, 3.14, "2"], () {
|
|
evaluate(a).bar(evaluate(1), w: evaluate(3.14), evaluate("2"));
|
|
});
|
|
|
|
// LocalFunctionInvocation.
|
|
runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
|
|
local(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
|
|
local(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
|
|
local(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
|
|
local(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
|
|
local(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2"], () {
|
|
local(evaluate(1), w: evaluate(3.14), evaluate("2"));
|
|
});
|
|
|
|
// Redirecting generative constructors.
|
|
runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
|
|
A.redir1();
|
|
});
|
|
runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
|
|
A.redir2();
|
|
});
|
|
runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
|
|
A.redir3();
|
|
});
|
|
runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
|
|
A.redir4();
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
|
|
A.redir5();
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2"], () {
|
|
A.redir6();
|
|
});
|
|
|
|
// Redirecting factory constructors.
|
|
runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
|
|
A.redirFactory(evaluate(1), evaluate("2"),
|
|
z: evaluate(false), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
|
|
A.redirFactory(
|
|
evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
|
|
A.redirFactory(
|
|
z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
|
|
A.redirFactory(
|
|
w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
|
|
A.redirFactory(
|
|
evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2"], () {
|
|
A.redirFactory(evaluate(1), w: evaluate(3.14), evaluate("2"));
|
|
});
|
|
|
|
// Constructor super initializers.
|
|
runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
|
|
Test.super1();
|
|
});
|
|
runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
|
|
Test.super2();
|
|
});
|
|
runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
|
|
Test.super3();
|
|
});
|
|
runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
|
|
Test.super4();
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
|
|
Test.super5();
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2"], () {
|
|
Test.super6();
|
|
});
|
|
|
|
// Implicit .call insertion.
|
|
runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
|
|
a(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
|
|
a(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
|
|
a(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
|
|
a(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
|
|
a(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2"], () {
|
|
a(evaluate(1), w: evaluate(3.14), evaluate("2"));
|
|
});
|
|
}
|
|
|
|
class Test extends A {
|
|
Test() : super(1, "2", z: false, w: 3.14);
|
|
|
|
Test.super1()
|
|
: super(evaluate(1), evaluate("2"),
|
|
z: evaluate(false), w: evaluate(3.14));
|
|
Test.super2()
|
|
: super(
|
|
evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
|
|
Test.super3()
|
|
: super(
|
|
z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
|
|
Test.super4()
|
|
: super(
|
|
w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
|
|
Test.super5()
|
|
: super(
|
|
evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
|
|
Test.super6() : super(evaluate(1), w: evaluate(3.14), evaluate("2"));
|
|
|
|
test() {
|
|
runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
|
|
super.bar(evaluate(1), evaluate("2"),
|
|
z: evaluate(false), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
|
|
super.bar(
|
|
evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
|
|
super.bar(
|
|
z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
|
|
super.bar(
|
|
w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
|
|
super.bar(
|
|
evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2"], () {
|
|
super.bar(evaluate(1), w: evaluate(3.14), evaluate("2"));
|
|
});
|
|
|
|
// Using super.call() implicitly.
|
|
runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
|
|
super(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
|
|
super(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
|
|
super(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
|
|
});
|
|
runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
|
|
super(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
|
|
super(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
|
|
});
|
|
runAndCheckEvaluationOrder([1, 3.14, "2"], () {
|
|
super(evaluate(1), w: evaluate(3.14), evaluate("2"));
|
|
});
|
|
}
|
|
}
|
|
|
|
extension E on A {
|
|
test() {
|
|
runAndCheckEvaluationOrder(["1", 2], () {
|
|
method(foo: evaluate("1"), evaluate(2)); // This call.
|
|
});
|
|
}
|
|
|
|
method(int bar, {String? foo}) {
|
|
Expect.equals(2, bar);
|
|
Expect.equals("1", foo);
|
|
}
|
|
}
|
|
|
|
main() {
|
|
A a = A(1, "2", z: false, w: 3.14);
|
|
|
|
test(A.foo, A.foo, a);
|
|
Test().test();
|
|
a.test();
|
|
}
|