| // Copyright (c) 2024, 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 that the type inference for generic extension method invocations |
| /// properly accounts for the downward inference context. |
| |
| import '../static_type_helper.dart'; |
| |
| extension E on Object? { |
| T f<T>(List<T> t) => t.first; |
| } |
| |
| class C { |
| T g<T>(List<T> t) => t.first; |
| } |
| |
| main() { |
| var string = ''; |
| context<int>( |
| string.f(contextType([1])..expectStaticType<Exactly<List<int>>>())); |
| context<int>( |
| E(string).f(contextType([1])..expectStaticType<Exactly<List<int>>>())); |
| |
| var nullableString = '' as String?; |
| context<int?>(nullableString |
| ?.f(contextType([1])..expectStaticType<Exactly<List<int?>>>())); |
| context<int?>(E(nullableString) |
| ?.f(contextType([1])..expectStaticType<Exactly<List<int?>>>())); |
| |
| // And just to verify that the expectations above are reasonable, repeat the |
| // same thing with an ordinary class: |
| var c = C(); |
| context<int>(c.g(contextType([1])..expectStaticType<Exactly<List<int>>>())); |
| var nullableC = C() as C?; |
| context<int?>( |
| nullableC?.g(contextType([1])..expectStaticType<Exactly<List<int?>>>())); |
| } |