blob: 899951feb638c9cc052752ccc8989e099fc4dcb7 [file] [log] [blame]
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by b
// BSD-style license that can be found in the LICENSE file.
extension type E1<T>(T foo) {}
extension type E2(Object? foo) {}
extension type E3(E1<String?> foo) {}
extension type E4(E1<int> foo) {}
extension type E5(E2 foo) {}
// Test that the extension types that don't implement Object are not non-nullable.
testNotNonNullable(E1<num?> e1numNullableNNN, E1<double> e1doubleNNN, E2 e2NNN, E3 e3NNN, E4 e4NNN, E5 e5NNN) {
Object x1numNullable = e1numNullableNNN; // Error.
Object x1double = e1doubleNNN; // Error.
Object x2 = e2NNN; // Error.
Object x3 = e3NNN; // Error.
Object x4 = e4NNN; // Error.
Object x5 = e5NNN; // Error.
}
// Test that the extension types that don't implement Object are not nullable either.
testNotNullable(
E1<num?> e1numNullableNN, E1<double> e1doubleNN, E2 e2NN, E3 e3NN, E4 e4NN, E5 e5NN,
E1<num?>? e1numNullableNNNullable, E1<double>? e1doubleNNNullable, E2? e2NNNullable, E3? e3NNNullable, E4? e4NNNullable, E5? e5NNNullable,
) {
e1numNullableNN = null; // Error.
e1doubleNN = null; // Error.
e2NN = null; // Error.
e3NN = null; // Error.
e4NN = null; // Error.
e5NN = null; // Error.
e1numNullableNNNullable = null; // Ok.
e1doubleNNNullable = null; // Ok.
e2NNNullable = null; // Ok.
e3NNNullable = null; // Ok.
e4NNNullable = null; // Ok.
e5NNNullable = null; // Ok.
}
// Since the extension types that don't implement Object aren't nullable,
// not initializing fields of that type or not providing default type for
// parameters of such types is an error.
class A {
E1<num?> e1numNullableA; // Error.
E1<double> e1doubleA; // Error.
E2 e2A; // Error.
E3 e3A; // Error.
E4 e4A; // Error.
E5 e5A; // Error.
E1<num?>? e1numNullableANullable; // Ok.
E1<double>? e1doubleANullable; // Ok.
E2? e2ANullable; // Ok.
E3? e3ANullable; // Ok.
E4? e4ANullable; // Ok.
E5? e5ANullable; // Ok.
}
testOptionalPositional([
E1<num?> e1numNullableOP, // Error.
E1<double> e1doubleOP, // Error.
E2 e2OP, // Error.
E3 e3OP, // Error.
E4 e4OP, // Error.
E5 e5OP, // Error.
E1<num?>? e1numNullableOPNullable, // Ok.
E1<double>? e1doubleOPNullable, // Ok.
E2? e2OPNullable, // Ok.
E3? e3OPNullable, // Ok.
E4? e4OPNullable, // Ok.
E5? e5OPNullable // Ok.
]) {}
testNamedNotRequired({
E1<num?> e1numNullableNNR, // Error.
E1<double> e1doubleNNR, // Error.
E2 e2NNR, // Error.
E3 e3NNR, // Error.
E4 e4NNR, // Error.
E5 e5NNR, // Error.
E1<num?>? e1numNullableNNRNullable, // Ok.
E1<double>? e1doubleNNRNullable, // Ok.
E2? e2NNRNullable, // Ok.
E3? e3NNRNullable, // Ok.
E4? e4NNRNullable, // Ok.
E5? e5NNRNullable // Ok.
}) {}