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>
    ;
}
final class LegacyImplementFinal extends core::Object implements mai::LegacyImplementFinalCore {
  synthetic constructor •() → self::LegacyImplementFinal
    ;
  get key() → core::int
    ;
  get value() → core::int
    ;
  method toString() → core::String
    ;
}
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>
    ;
}
class LegacyImplementFinalNoModifier extends core::Object implements mai::LegacyImplementFinalCore {
  synthetic constructor •() → self::LegacyImplementFinalNoModifier
    ;
  get key() → core::int
    ;
  get value() → core::int
    ;
  method toString() → core::String
    ;
}

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>
    ;
}
class LegacyImplementFinalCore extends core::Object implements core::MapEntry<core::int, core::int> {
  synthetic constructor •() → mai::LegacyImplementFinalCore
    ;
  get key() → core::int
    ;
  get value() → core::int
    ;
  method toString() → core::String
    ;
}
