| // Copyright (c) 2016, 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 both `=` and `:` are allowed for named parameters. |
| |
| import "package:expect/expect.dart"; |
| |
| // Default values are not allowed on typedefs. |
| typedef F1({x = 3, y}); |
| // ^ |
| // [analyzer] SYNTACTIC_ERROR.DEFAULT_VALUE_IN_FUNCTION_TYPE |
| // [cfe] Can't have a default value in a function type. |
| |
| typedef functype({x, y, z}); |
| |
| int topF({x = 3, y: 5, z}) => x * y * (z ?? 2); |
| |
| class A { |
| int x; |
| int y; |
| int z; |
| A({this.x = 3, this.y: 5, z}) : z = z ?? 2; |
| A.redirect({int x = 3, int y: 5, int? z}) : this(x: x, y: y, z: z); |
| factory A.factory({int x = 3, int y: 5, int? z}) => |
| new A(x: x, y: y, z: z ?? 2); |
| factory A.redirectFactory({int x, int y, int z}) = A; |
| |
| // Default values are not allowed on redirecting factory constructors. |
| factory A.badRedirectFactory({int x = 3, int y}) = |
| // ^ |
| // [analyzer] COMPILE_TIME_ERROR.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR |
| // ^ |
| // [cfe] Can't have a default value here because any default values of 'A' would be used instead. |
| A; |
| |
| int get value => x * y * z; |
| |
| static int staticF({x = 3, y: 5, z}) => x * y * (z ?? 2); |
| int instanceF({x = 3, y: 5, z}) => x * y * (z ?? 2); |
| } |
| |
| main() { |
| // Reference the type, or dart2js won't see that the declaration is invalid |
| F1? _ = null; |
| |
| var a = new A(); |
| |
| int local({x = 3, y: 5, z}) => x * y * (z ?? 2); |
| var expr = ({x = 3, y: 5, z}) => x * y * (z ?? 2); |
| var tearOff = a.instanceF; |
| |
| test(function) { |
| Expect.equals(30, function()); |
| Expect.equals(70, function(x: 7)); |
| Expect.equals(42, function(y: 7)); |
| Expect.equals(28, function(x: 7, y: 2)); |
| Expect.equals(15, function(z: 1)); |
| Expect.equals(21, function(y: 7, z: 1)); |
| Expect.equals(35, function(x: 7, z: 1)); |
| Expect.equals(14, function(x: 7, y: 2, z: 1)); |
| Expect.isTrue(function is functype); |
| } |
| |
| test(topF); |
| test(A.staticF); |
| test(a.instanceF); |
| test(local); |
| test(expr); |
| test(tearOff); |
| |
| // Can't tear off constructors. |
| Expect.equals(30, new A().value); |
| Expect.equals(70, new A(x: 7).value); |
| Expect.equals(42, new A(y: 7).value); |
| Expect.equals(28, new A(x: 7, y: 2).value); |
| Expect.equals(15, new A(z: 1).value); |
| Expect.equals(21, new A(y: 7, z: 1).value); |
| Expect.equals(35, new A(x: 7, z: 1).value); |
| Expect.equals(14, new A(x: 7, y: 2, z: 1).value); |
| |
| Expect.equals(30, new A.redirect().value); |
| Expect.equals(70, new A.redirect(x: 7).value); |
| Expect.equals(42, new A.redirect(y: 7).value); |
| Expect.equals(28, new A.redirect(x: 7, y: 2).value); |
| Expect.equals(15, new A.redirect(z: 1).value); |
| Expect.equals(21, new A.redirect(y: 7, z: 1).value); |
| Expect.equals(35, new A.redirect(x: 7, z: 1).value); |
| Expect.equals(14, new A.redirect(x: 7, y: 2, z: 1).value); |
| |
| Expect.equals(30, new A.factory().value); |
| Expect.equals(70, new A.factory(x: 7).value); |
| Expect.equals(42, new A.factory(y: 7).value); |
| Expect.equals(28, new A.factory(x: 7, y: 2).value); |
| Expect.equals(15, new A.factory(z: 1).value); |
| Expect.equals(21, new A.factory(y: 7, z: 1).value); |
| Expect.equals(35, new A.factory(x: 7, z: 1).value); |
| Expect.equals(14, new A.factory(x: 7, y: 2, z: 1).value); |
| |
| Expect.equals(30, new A.redirectFactory().value); |
| Expect.equals(70, new A.redirectFactory(x: 7).value); |
| Expect.equals(42, new A.redirectFactory(y: 7).value); |
| Expect.equals(28, new A.redirectFactory(x: 7, y: 2).value); |
| Expect.equals(15, new A.redirectFactory(z: 1).value); |
| Expect.equals(21, new A.redirectFactory(y: 7, z: 1).value); |
| Expect.equals(35, new A.redirectFactory(x: 7, z: 1).value); |
| Expect.equals(14, new A.redirectFactory(x: 7, y: 2, z: 1).value); |
| } |