library;
//
// Problems in library:
//
// pkg/front_end/testcases/extension_types/spread.dart:18:22: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'MyList<int>'.
//  - 'List' is from 'dart:core'.
//   MyList<int> list = []; // Error
//                      ^
//
// pkg/front_end/testcases/extension_types/spread.dart:19:23: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'MySet<String>'.
//  - 'Set' is from 'dart:core'.
//   MySet<String> set = {}; // Error
//                       ^
//
// pkg/front_end/testcases/extension_types/spread.dart:20:29: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'MyMap<String, bool>'.
//  - 'Map' is from 'dart:core'.
//   MyMap<String, bool> map = {}; // Error
//                             ^
//
import self as self;
import "dart:core" as core;
import "dart:collection" as col;

extension type MyList<T extends core::Object? = dynamic>(core::List<T%> it) implements core::List<T%> {
  abstract extension-type-member representation-field get it() → core::List<T%>;
  constructor • = self::MyList|constructor#;
  constructor tearoff • = self::MyList|constructor#_#new#tearOff;
}
extension type MySet<T extends core::Object? = dynamic>(core::Set<T%> it) implements core::Set<T%> {
  abstract extension-type-member representation-field get it() → core::Set<T%>;
  constructor • = self::MySet|constructor#;
  constructor tearoff • = self::MySet|constructor#_#new#tearOff;
}
extension type MyMap<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(core::Map<K%, V%> it) implements core::Map<K%, V%> {
  abstract extension-type-member representation-field get it() → core::Map<K%, V%>;
  constructor • = self::MyMap|constructor#;
  constructor tearoff • = self::MyMap|constructor#_#new#tearOff;
}
static extension-type-member method MyList|constructor#<T extends core::Object? = dynamic>(core::List<self::MyList|constructor#::T%> it) → self::MyList<self::MyList|constructor#::T%> /* erasure=core::List<self::MyList|constructor#::T%> */ {
  lowered final self::MyList<self::MyList|constructor#::T%> /* erasure=core::List<self::MyList|constructor#::T%> */ #this = it;
  return #this;
}
static extension-type-member method MyList|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::List<self::MyList|constructor#_#new#tearOff::T%> it) → self::MyList<self::MyList|constructor#_#new#tearOff::T%> /* erasure=core::List<self::MyList|constructor#_#new#tearOff::T%> */
  return self::MyList|constructor#<self::MyList|constructor#_#new#tearOff::T%>(it);
static extension-type-member method MySet|constructor#<T extends core::Object? = dynamic>(core::Set<self::MySet|constructor#::T%> it) → self::MySet<self::MySet|constructor#::T%> /* erasure=core::Set<self::MySet|constructor#::T%> */ {
  lowered final self::MySet<self::MySet|constructor#::T%> /* erasure=core::Set<self::MySet|constructor#::T%> */ #this = it;
  return #this;
}
static extension-type-member method MySet|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Set<self::MySet|constructor#_#new#tearOff::T%> it) → self::MySet<self::MySet|constructor#_#new#tearOff::T%> /* erasure=core::Set<self::MySet|constructor#_#new#tearOff::T%> */
  return self::MySet|constructor#<self::MySet|constructor#_#new#tearOff::T%>(it);
static extension-type-member method MyMap|constructor#<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(core::Map<self::MyMap|constructor#::K%, self::MyMap|constructor#::V%> it) → self::MyMap<self::MyMap|constructor#::K%, self::MyMap|constructor#::V%> /* erasure=core::Map<self::MyMap|constructor#::K%, self::MyMap|constructor#::V%> */ {
  lowered final self::MyMap<self::MyMap|constructor#::K%, self::MyMap|constructor#::V%> /* erasure=core::Map<self::MyMap|constructor#::K%, self::MyMap|constructor#::V%> */ #this = it;
  return #this;
}
static extension-type-member method MyMap|constructor#_#new#tearOff<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(core::Map<self::MyMap|constructor#_#new#tearOff::K%, self::MyMap|constructor#_#new#tearOff::V%> it) → self::MyMap<self::MyMap|constructor#_#new#tearOff::K%, self::MyMap|constructor#_#new#tearOff::V%> /* erasure=core::Map<self::MyMap|constructor#_#new#tearOff::K%, self::MyMap|constructor#_#new#tearOff::V%> */
  return self::MyMap|constructor#<self::MyMap|constructor#_#new#tearOff::K%, self::MyMap|constructor#_#new#tearOff::V%>(it);
static method method(self::MyList<core::int> /* erasure=core::List<core::int> */ list, self::MySet<core::String> /* erasure=core::Set<core::String> */ set, self::MyMap<core::bool, core::num> /* erasure=core::Map<core::bool, core::num> */ map) → dynamic {
  core::List<core::int> list2 = block {
    final core::List<core::int> #t1 = core::List::of<core::int>(list);
  } =>#t1;
  core::Set<core::String> set2 = block {
    final core::Set<core::String> #t2 = col::LinkedHashSet::of<core::String>(set);
  } =>#t2;
  core::Map<core::bool, core::num> map2 = block {
    final core::Map<core::bool, core::num> #t3 = col::LinkedHashMap::of<core::bool, core::num>(map);
  } =>#t3;
}
static method test() → dynamic {
  self::MyList<core::int> /* erasure=core::List<core::int> */ list = invalid-expression "pkg/front_end/testcases/extension_types/spread.dart:18:22: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'MyList<int>'.
 - 'List' is from 'dart:core'.
  MyList<int> list = []; // Error
                     ^" in <dynamic>[] as{TypeError} self::MyList<core::int> /* erasure=core::List<core::int> */;
  self::MySet<core::String> /* erasure=core::Set<core::String> */ set = invalid-expression "pkg/front_end/testcases/extension_types/spread.dart:19:23: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'MySet<String>'.
 - 'Set' is from 'dart:core'.
  MySet<String> set = {}; // Error
                      ^" in ( block {
    final core::Set<dynamic> #t4 = col::LinkedHashSet::•<dynamic>();
  } =>#t4) as{TypeError} self::MySet<core::String> /* erasure=core::Set<core::String> */;
  self::MyMap<core::String, core::bool> /* erasure=core::Map<core::String, core::bool> */ map = invalid-expression "pkg/front_end/testcases/extension_types/spread.dart:20:29: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'MyMap<String, bool>'.
 - 'Map' is from 'dart:core'.
  MyMap<String, bool> map = {}; // Error
                            ^" in <dynamic, dynamic>{} as{TypeError} self::MyMap<core::String, core::bool> /* erasure=core::Map<core::String, core::bool> */;
}
