mirror of
https://github.com/dart-lang/sdk
synced 2024-09-18 21:21:18 +00:00
461d01cd80
Change-Id: I5f6e446c72ae1a41d92f419eb57a8dd030a70372 Issue: https://github.com/dart-lang/sdk/issues/42107 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/154292 Reviewed-by: Leaf Petersen <leafp@google.com> Commit-Queue: Nicholas Shahan <nshahan@google.com>
190 lines
7.5 KiB
Dart
190 lines
7.5 KiB
Dart
// Copyright (c) 2019, 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.
|
|
|
|
// SharedOptions=--enable-experiment=variance
|
|
|
|
// Tests runtime subtyping with explicit variance modifiers.
|
|
|
|
import 'dart:_runtime' show typeRep;
|
|
import 'dart:async' show FutureOr;
|
|
|
|
import 'runtime_utils.dart';
|
|
|
|
class Upper {}
|
|
|
|
class Middle extends Upper {}
|
|
|
|
class Lower extends Middle {}
|
|
|
|
class Covariant<out T> {}
|
|
|
|
class Contravariant<in T> {}
|
|
|
|
class Invariant<inout T> {}
|
|
|
|
class LegacyCovariant<T> {}
|
|
|
|
void main() {
|
|
// Covariant<Lower> <: Covariant<Middle>
|
|
checkProperSubtype(typeRep<Covariant<Lower>>(), typeRep<Covariant<Middle>>());
|
|
|
|
// Covariant<Middle> <: Covariant<Middle>
|
|
checkSubtype(typeRep<Covariant<Middle>>(), typeRep<Covariant<Middle>>());
|
|
|
|
// Contravariant<Upper> <: Contravariant<Middle>
|
|
checkProperSubtype(
|
|
typeRep<Contravariant<Upper>>(), typeRep<Contravariant<Middle>>());
|
|
|
|
// Contravariant<Middle> <: Contravariant<Middle>
|
|
checkSubtype(
|
|
typeRep<Contravariant<Middle>>(), typeRep<Contravariant<Middle>>());
|
|
|
|
// Invariant<Middle> <: Invariant<Middle>
|
|
checkSubtype(typeRep<Invariant<Middle>>(), typeRep<Invariant<Middle>>());
|
|
|
|
// Invariant<dynamic> <:> Invariant<Object?>
|
|
checkMutualSubtype(
|
|
typeRep<Invariant<dynamic>>(), typeRep<Invariant<Object?>>());
|
|
|
|
// Invariant<FutureOr<dynamic>> <:> Invariant<dynamic>
|
|
checkMutualSubtype(
|
|
typeRep<Invariant<FutureOr<dynamic>>>(), typeRep<Invariant<dynamic>>());
|
|
|
|
// Invariant<FutureOr<Null>> <:> Invariant<Future<Null>?>
|
|
checkMutualSubtype(
|
|
typeRep<Invariant<FutureOr<Null>>>(), typeRep<Invariant<Future<Null>?>>());
|
|
|
|
// LegacyCovariant<Lower> <: LegacyCovariant<Middle>
|
|
checkProperSubtype(
|
|
typeRep<LegacyCovariant<Lower>>(), typeRep<LegacyCovariant<Middle>>());
|
|
|
|
// List<Covariant<Lower>> <: Iterable<Covariant<Middle>>
|
|
checkProperSubtype(typeRep<List<Covariant<Lower>>>(),
|
|
typeRep<Iterable<Covariant<Middle>>>());
|
|
|
|
// List<Contravariant<Upper>> <: Iterable<Contravariant<Middle>>
|
|
checkProperSubtype(typeRep<List<Contravariant<Upper>>>(),
|
|
typeRep<Iterable<Contravariant<Middle>>>());
|
|
|
|
// List<Invariant<Middle>> <: Iterable<Invariant<Middle>>
|
|
checkProperSubtype(typeRep<List<Invariant<Middle>>>(),
|
|
typeRep<Iterable<Invariant<Middle>>>());
|
|
|
|
// List<LegacyCovariant<Lower>> <: Iterable<LegacyCovariant<Middle>>
|
|
checkProperSubtype(typeRep<List<LegacyCovariant<Lower>>>(),
|
|
typeRep<Iterable<LegacyCovariant<Middle>>>());
|
|
|
|
// String -> Covariant<Lower> <: String -> Covariant<Middle>
|
|
checkProperSubtype(typeRep<Covariant<Lower> Function(String)>(),
|
|
typeRep<Covariant<Middle> Function(String)>());
|
|
|
|
// Covariant<Upper> -> String <: Covariant<Middle> -> String
|
|
checkProperSubtype(typeRep<String Function(Covariant<Upper>)>(),
|
|
typeRep<String Function(Covariant<Middle>)>());
|
|
|
|
// String -> Contravariant<Upper> <: String -> Contravariant<Middle>
|
|
checkProperSubtype(typeRep<Contravariant<Upper> Function(String)>(),
|
|
typeRep<Contravariant<Middle> Function(String)>());
|
|
|
|
// Contravariant<Lower> -> String <: Contravariant<Middle> -> String
|
|
checkProperSubtype(typeRep<String Function(Contravariant<Lower>)>(),
|
|
typeRep<String Function(Contravariant<Middle>)>());
|
|
|
|
// String -> Invariant<Middle> <: String -> Invariant<Middle>
|
|
checkSubtype(typeRep<String Function(Invariant<Middle>)>(),
|
|
typeRep<String Function(Invariant<Middle>)>());
|
|
|
|
// Invariant<Middle> -> String <: Invariant<Middle> -> String
|
|
checkSubtype(typeRep<String Function(Invariant<Middle>)>(),
|
|
typeRep<String Function(Invariant<Middle>)>());
|
|
|
|
// String -> LegacyCovariant<Lower> <: String -> LegacyCovariant<Middle>
|
|
checkProperSubtype(typeRep<LegacyCovariant<Lower> Function(String)>(),
|
|
typeRep<LegacyCovariant<Middle> Function(String)>());
|
|
|
|
// LegacyCovariant<Upper> -> String <: LegacyCovariant<Middle> -> String
|
|
checkProperSubtype(typeRep<String Function(LegacyCovariant<Upper>)>(),
|
|
typeRep<String Function(LegacyCovariant<Middle>)>());
|
|
|
|
// Covariant<Upper> </: Covariant<Middle>
|
|
checkSubtypeFailure(
|
|
typeRep<Covariant<Upper>>(), typeRep<Covariant<Middle>>());
|
|
|
|
// Contravariant<Lower> </: Contravariant<Middle>
|
|
checkSubtypeFailure(
|
|
typeRep<Contravariant<Lower>>(), typeRep<Contravariant<Middle>>());
|
|
|
|
// Invariant<Upper> </: Invariant<Middle>
|
|
checkSubtypeFailure(
|
|
typeRep<Invariant<Upper>>(), typeRep<Invariant<Middle>>());
|
|
|
|
// Invariant<Lower> </: Invariant<Middle>
|
|
checkSubtypeFailure(
|
|
typeRep<Invariant<Lower>>(), typeRep<Invariant<Middle>>());
|
|
|
|
// LegacyCovariant<Upper> </: LegacyCovariant<Middle>
|
|
checkSubtypeFailure(
|
|
typeRep<LegacyCovariant<Upper>>(), typeRep<LegacyCovariant<Middle>>());
|
|
|
|
// List<Covariant<Upper>> </: Iterable<Covariant<Middle>>
|
|
checkSubtypeFailure(typeRep<List<Covariant<Upper>>>(),
|
|
typeRep<Iterable<Covariant<Middle>>>());
|
|
|
|
// List<Contravariant<Lower>> </: Iterable<Contravariant<Middle>>
|
|
checkSubtypeFailure(typeRep<List<Contravariant<Lower>>>(),
|
|
typeRep<Iterable<Contravariant<Middle>>>());
|
|
|
|
// List<Invariant<Upper>> </: Iterable<Invariant<Middle>>
|
|
checkSubtypeFailure(typeRep<List<Invariant<Upper>>>(),
|
|
typeRep<Iterable<Invariant<Middle>>>());
|
|
|
|
// List<Invariant<Lower>> </: Iterable<Invariant<Middle>>
|
|
checkSubtypeFailure(typeRep<List<Invariant<Lower>>>(),
|
|
typeRep<Iterable<Invariant<Middle>>>());
|
|
|
|
// List<LegacyCovariant<Upper>> </: Iterable<LegacyCovariant<Middle>>
|
|
checkSubtypeFailure(typeRep<List<LegacyCovariant<Upper>>>(),
|
|
typeRep<Iterable<LegacyCovariant<Middle>>>());
|
|
|
|
// String -> Covariant<Upper> </: String -> Covariant<Middle>
|
|
checkSubtypeFailure(typeRep<Covariant<Upper> Function(String)>(),
|
|
typeRep<Covariant<Middle> Function(String)>());
|
|
|
|
// Covariant<Lower> -> String </: Covariant<Middle> -> String
|
|
checkSubtypeFailure(typeRep<String Function(Covariant<Lower>)>(),
|
|
typeRep<String Function(Covariant<Middle>)>());
|
|
|
|
// String -> Contravariant<Lower> </: String -> Contravariant<Middle>
|
|
checkSubtypeFailure(typeRep<Contravariant<Lower> Function(String)>(),
|
|
typeRep<Contravariant<Middle> Function(String)>());
|
|
|
|
// Contravariant<Upper> -> String </: Contravariant<Middle> -> String
|
|
checkSubtypeFailure(typeRep<String Function(Contravariant<Upper>)>(),
|
|
typeRep<String Function(Contravariant<Middle>)>());
|
|
|
|
// String -> Invariant<Upper> </: String -> Invariant<Middle>
|
|
checkSubtypeFailure(typeRep<Invariant<Upper> Function(String)>(),
|
|
typeRep<Invariant<Middle> Function(String)>());
|
|
|
|
// Invariant<Upper> -> String </: Invariant<Middle> -> String
|
|
checkSubtypeFailure(typeRep<String Function(Invariant<Upper>)>(),
|
|
typeRep<String Function(Invariant<Middle>)>());
|
|
|
|
// String -> Invariant<Lower> </: String -> Invariant<Middle>
|
|
checkSubtypeFailure(typeRep<Invariant<Lower> Function(String)>(),
|
|
typeRep<Invariant<Middle> Function(String)>());
|
|
|
|
// Invariant<Lower> -> String <: Invariant<Middle> -> String
|
|
checkSubtypeFailure(typeRep<String Function(Invariant<Lower>)>(),
|
|
typeRep<String Function(Invariant<Middle>)>());
|
|
|
|
// String -> LegacyCovariant<Upper> </: String -> LegacyCovariant<Middle>
|
|
checkSubtypeFailure(typeRep<LegacyCovariant<Upper> Function(String)>(),
|
|
typeRep<LegacyCovariant<Middle> Function(String)>());
|
|
|
|
// LegacyCovariant<Lower> -> String </: LegacyCovariant<Middle> -> String
|
|
checkSubtypeFailure(typeRep<String Function(LegacyCovariant<Lower>)>(),
|
|
typeRep<String Function(LegacyCovariant<Middle>)>());
|
|
}
|