library;
//
// Problems in library:
//
// pkg/front_end/testcases/class_modifiers/issue52115/main.dart:10:16: Error: The class 'LinkedList' can't be implemented outside of its library because it's a base class.
//     implements LegacyImplementBaseCore<E> {}
//                ^
// sdk/lib/collection/linked_list.dart:*: Context: The type 'LegacyImplementBaseCore' is a subtype of 'LinkedList', and 'LinkedList' is defined here.
// base class LinkedList<E extends LinkedListEntry<E>> extends Iterable<E> {
//            ^
//
// pkg/front_end/testcases/class_modifiers/issue52115/main.dart:13:45: Error: The class 'MapEntry' can't be implemented outside of its library because it's a final class.
// final class LegacyImplementFinal implements LegacyImplementFinalCore {
//                                             ^
// sdk/lib/core/map.dart:*: Context: The type 'LegacyImplementFinalCore' is a subtype of 'MapEntry', and 'MapEntry' is defined here.
// final class MapEntry<K, V> {
//             ^
//
// pkg/front_end/testcases/class_modifiers/issue52115/main.dart:20:16: Error: The type 'LegacyImplementBaseNoModifier' must be 'base', 'final' or 'sealed' because the supertype 'LinkedList' is 'base'.
// Try adding 'base', 'final', or 'sealed' to the type.
// abstract class LegacyImplementBaseNoModifier<E extends LinkedListEntry<E>>
//                ^
//
// pkg/front_end/testcases/class_modifiers/issue52115/main.dart:21:16: Error: The class 'LinkedList' can't be implemented outside of its library because it's a base class.
//     implements LegacyImplementBaseCore<E> {}
//                ^
// sdk/lib/collection/linked_list.dart:*: Context: The type 'LegacyImplementBaseCore' is a subtype of 'LinkedList', and 'LinkedList' is defined here.
// base class LinkedList<E extends LinkedListEntry<E>> extends Iterable<E> {
//            ^
//
// pkg/front_end/testcases/class_modifiers/issue52115/main.dart:24:49: Error: The class 'MapEntry' can't be implemented outside of its library because it's a final class.
// class LegacyImplementFinalNoModifier implements LegacyImplementFinalCore {
//                                                 ^
// sdk/lib/core/map.dart:*: Context: The type 'LegacyImplementFinalCore' is a subtype of 'MapEntry', and 'MapEntry' is defined here.
// final class MapEntry<K, V> {
//             ^
//
import self as self;
import "dart:collection" as col;
import "dart:core" as core;
import "main_lib.dart" as mai;

import "dart:collection";
import "org-dartlang-testcase:///main_lib.dart";

abstract base class LegacyImplementBase<E extends col::LinkedListEntry<self::LegacyImplementBase::E> = col::LinkedListEntry<dynamic>> extends core::Object implements mai::LegacyImplementBaseCore<self::LegacyImplementBase::E> {
  synthetic constructor •() → self::LegacyImplementBase<self::LegacyImplementBase::E>
    : super core::Object::•()
    ;
}
final class LegacyImplementFinal extends core::Object implements mai::LegacyImplementFinalCore {
  synthetic constructor •() → self::LegacyImplementFinal
    : super core::Object::•()
    ;
  get key() → core::int
    return 0;
  get value() → core::int
    return 1;
  method toString() → core::String
    return "Bad";
}
abstract class LegacyImplementBaseNoModifier<E extends col::LinkedListEntry<self::LegacyImplementBaseNoModifier::E> = col::LinkedListEntry<dynamic>> extends core::Object implements mai::LegacyImplementBaseCore<self::LegacyImplementBaseNoModifier::E> {
  synthetic constructor •() → self::LegacyImplementBaseNoModifier<self::LegacyImplementBaseNoModifier::E>
    : super core::Object::•()
    ;
}
class LegacyImplementFinalNoModifier extends core::Object implements mai::LegacyImplementFinalCore {
  synthetic constructor •() → self::LegacyImplementFinalNoModifier
    : super core::Object::•()
    ;
  get key() → core::int
    return 0;
  get value() → core::int
    return 1;
  method toString() → core::String
    return "Bad";
}

library;
import self as mai;
import "dart:collection" as col;
import "dart:core" as core;

import "dart:collection";

abstract class LegacyImplementBaseCore<E extends col::LinkedListEntry<mai::LegacyImplementBaseCore::E> = col::LinkedListEntry<dynamic>> extends core::Object implements col::LinkedList<mai::LegacyImplementBaseCore::E> {
  synthetic constructor •() → mai::LegacyImplementBaseCore<mai::LegacyImplementBaseCore::E>
    : super core::Object::•()
    ;
}
class LegacyImplementFinalCore extends core::Object implements core::MapEntry<core::int, core::int> {
  synthetic constructor •() → mai::LegacyImplementFinalCore
    : super core::Object::•()
    ;
  get key() → core::int
    return 0;
  get value() → core::int
    return 1;
  method toString() → core::String
    return "Bad";
}
