Index: pkg/analyzer/test/src/task/strong/inferred_type_test.dart |
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart |
index 9e11a6200dccf143b3b04276fea6f17753d23d25..72c7384e2b477be38b091f3b401d7983f2ceedc2 100644 |
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart |
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart |
@@ -1150,6 +1150,63 @@ main() { |
} |
'''; |
testChecker('infer downwards', {'/main.dart': code}); |
+ |
+ testChecker('infer if value types match context', {'/main.dart': r''' |
+class DartType {} |
+typedef void Asserter<T>(T type); |
+typedef Asserter<T> AsserterBuilder<S, T>(S arg); |
+ |
+Asserter<DartType> _isInt; |
+Asserter<DartType> _isString; |
+ |
+abstract class C { |
+ static AsserterBuilder<List<Asserter<DartType>>, DartType> assertBOf; |
+ static AsserterBuilder<List<Asserter<DartType>>, DartType> get assertCOf; |
+ |
+ AsserterBuilder<List<Asserter<DartType>>, DartType> assertAOf; |
+ AsserterBuilder<List<Asserter<DartType>>, DartType> get assertDOf; |
+ |
+ method(AsserterBuilder<List<Asserter<DartType>>, DartType> assertEOf) { |
+ assertAOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ assertBOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ assertCOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ assertDOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ assertEOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ } |
+} |
+ |
+abstract class G<T> { |
+ AsserterBuilder<List<Asserter<DartType>>, DartType> assertAOf; |
+ AsserterBuilder<List<Asserter<DartType>>, DartType> get assertDOf; |
+ |
+ method(AsserterBuilder<List<Asserter<DartType>>, DartType> assertEOf) { |
+ assertAOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ this.assertAOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ this.assertDOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ assertEOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ } |
+} |
+ |
+AsserterBuilder<List<Asserter<DartType>>, DartType> assertBOf; |
+AsserterBuilder<List<Asserter<DartType>>, DartType> get assertCOf; |
+ |
+main() { |
+ AsserterBuilder<List<Asserter<DartType>>, DartType> assertAOf; |
+ assertAOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ assertBOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ assertCOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ C.assertBOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ C.assertCOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ |
+ C c; |
+ c.assertAOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ c.assertDOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ |
+ G<int> g; |
+ g.assertAOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+ g.assertDOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]); |
+} |
+ '''}); |
}); |
group('downwards inference on function arguments', () { |