blob: b2bb486648b57f8fb606f4b7790bf5a84091999a [file] [log] [blame]
// 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?>>>()));
}