| // Copyright (c) 2012, 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. |
| // Tests the type checking when passing code into closure from inside a factory method |
| |
| import "package:expect/expect.dart"; |
| |
| abstract class Foo<T> { |
| factory Foo.from() = Bar<T>.from; |
| } |
| |
| class Bar<T> implements Foo<T> { |
| Bar() {} |
| |
| factory Bar.from() { |
| var func = (T arg) { |
| T foo = arg; |
| bool isString = foo is String; |
| print(arg); |
| print(" String=$isString"); |
| }; |
| |
| func("Hello World!"); |
| // ^^^^^^^^^^^^^^ |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE |
| // [cfe] The argument type 'String' can't be assigned to the parameter type 'T'. |
| return new Bar<T>(); |
| } |
| } |
| |
| main() { |
| Foo<String> value1; |
| value1 = new Foo<String>.from(); |
| |
| bool gotError = false; |
| |
| try { |
| Foo<int> value2 = new Foo<int>.from(); |
| } on TypeError catch (e) { |
| gotError = true; |
| } |
| Expect.equals(false, gotError); |
| } |