library;
//
// Problems in library:
//
// pkg/front_end/testcases/extension_types/implement_all.dart:33:44: Error: Type 'void' can't be used here.
// Try removing 'void' keyword or replace it with 'var', 'final', or a type.
// extension type ET_Void(Null it) implements void /* Error */ {}
//                                            ^^^^
//
// pkg/front_end/testcases/extension_types/implement_all.dart:33:44: Error: Type 'void' not found.
// extension type ET_Void(Null it) implements void /* Error */ {}
//                                            ^^^^
//
// pkg/front_end/testcases/extension_types/implement_all.dart:57:48: Error: 'Extension' isn't a type.
// extension type ET_Extension(int it) implements Extension /* Error */ {}
//                                                ^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/implement_all.dart:29:44: Error: The type 'Null' can't be implemented by an extension type.
// extension type ET_Null(Null it) implements Null /* Error */ {}
//                                            ^
//
// pkg/front_end/testcases/extension_types/implement_all.dart:31:50: Error: The type 'dynamic' can't be implemented by an extension type.
// extension type ET_Dynamic(dynamic it) implements dynamic /* Error */ {}
//                                                  ^
//
// pkg/front_end/testcases/extension_types/implement_all.dart:33:44: Error: The type 'void' can't be implemented by an extension type.
// extension type ET_Void(Null it) implements void /* Error */ {}
//                                            ^
//
// pkg/front_end/testcases/extension_types/implement_all.dart:35:46: Error: The type 'Never' can't be implemented by an extension type.
// extension type ET_Never(Never it) implements Never /* Error */ {}
//                                              ^
//
// pkg/front_end/testcases/extension_types/implement_all.dart:35:31: Error: The representation type can't be a bottom type.
// extension type ET_Never(Never it) implements Never /* Error */ {}
//                               ^^
//
// pkg/front_end/testcases/extension_types/implement_all.dart:39:48: Error: The type 'Record' can't be implemented by an extension type.
// extension type ET_Record(Record it) implements Record /* Error */ {}
//                                                ^
//
// pkg/front_end/testcases/extension_types/implement_all.dart:41:56: Error: The type 'RecordType' which is an alias of '(int, String)' can't be implemented by an extension type.
// extension type ET_RecordType(RecordType it) implements RecordType /* Error */ {}
//                                                        ^
// pkg/front_end/testcases/extension_types/implement_all.dart:7:9: Context: The issue arises via this type alias.
// typedef RecordType = (int, String);
//         ^
//
// pkg/front_end/testcases/extension_types/implement_all.dart:43:52: Error: The type 'Function' can't be implemented by an extension type.
// extension type ET_Function(Function it) implements Function /* Error */ {}
//                                                    ^
//
// pkg/front_end/testcases/extension_types/implement_all.dart:46:16: Error: The type 'FunctionType' which is an alias of 'void Function()' can't be implemented by an extension type.
//     implements FunctionType /* Error */ {}
//                ^
// pkg/front_end/testcases/extension_types/implement_all.dart:9:9: Context: The issue arises via this type alias.
// typedef FunctionType = void Function();
//         ^
//
// pkg/front_end/testcases/extension_types/implement_all.dart:49:16: Error: The type 'NullableInterfaceType' which is an alias of 'String?' can't be implemented by an extension type because it is nullable.
//     implements NullableInterfaceType /* Error */ {}
//                ^
// pkg/front_end/testcases/extension_types/implement_all.dart:11:9: Context: The issue arises via this type alias.
// typedef NullableInterfaceType = String?;
//         ^
//
// pkg/front_end/testcases/extension_types/implement_all.dart:52:16: Error: The type 'NullableExtensionType' which is an alias of 'ExtensionType?' can't be implemented by an extension type because it is nullable.
//     implements NullableExtensionType /* Error */ {}
//                ^
// pkg/front_end/testcases/extension_types/implement_all.dart:13:9: Context: The issue arises via this type alias.
// typedef NullableExtensionType = ExtensionType?;
//         ^
//
// pkg/front_end/testcases/extension_types/implement_all.dart:55:16: Error: The type 'FutureOr<int>' can't be implemented by an extension type.
//     implements FutureOr<int> /* Error */ {}
//                ^
//
// pkg/front_end/testcases/extension_types/implement_all.dart:57:48: Error: The type 'Extension' can't be implemented by an extension type.
// extension type ET_Extension(int it) implements Extension /* Error */ {}
//                                                ^
//
// pkg/front_end/testcases/extension_types/implement_all.dart:59:52: Error: The type variable 'T' can't be implemented by an extension type.
// extension type ET_TypeVariable<T>(T it) implements T /* Error */ {}
//                                                    ^
//
import self as self;
import "dart:core" as core;

import "dart:async";

typedef RecordType = (core::int, core::String);
typedef FunctionType = () → void;
typedef NullableInterfaceType = core::String?;
typedef NullableExtensionType = self::ExtensionType? /* erasure=core::int? */;
typedef Alias = self::Class;
typedef GenericAlias<T extends core::Object? = dynamic> = self::GenericClass<T%>;
class Class extends core::Object {
  synthetic constructor •() → self::Class
    ;
}
class GenericClass<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
    ;
}
extension Extension on core::int {
}
extension type ExtensionType(core::int it) {
  abstract extension-type-member representation-field get it() → core::int;
  constructor • = self::ExtensionType|constructor#;
  constructor tearoff • = self::ExtensionType|constructor#_#new#tearOff;
}
extension type GenericExtensionType<T extends core::Object? = dynamic>(T% it) {
  abstract extension-type-member representation-field get it() → T%;
  constructor • = self::GenericExtensionType|constructor#;
  constructor tearoff • = self::GenericExtensionType|constructor#_#new#tearOff;
}
extension type ET_Null(Null it) {
  abstract extension-type-member representation-field get it() → Null;
  constructor • = self::ET_Null|constructor#;
  constructor tearoff • = self::ET_Null|constructor#_#new#tearOff;
}
extension type ET_Dynamic(dynamic it) {
  abstract extension-type-member representation-field get it() → dynamic;
  constructor • = self::ET_Dynamic|constructor#;
  constructor tearoff • = self::ET_Dynamic|constructor#_#new#tearOff;
}
extension type ET_Void(Null it) {
  abstract extension-type-member representation-field get it() → Null;
  constructor • = self::ET_Void|constructor#;
  constructor tearoff • = self::ET_Void|constructor#_#new#tearOff;
}
extension type ET_Never(invalid-type it) {
  abstract extension-type-member representation-field get it() → Never;
  constructor • = self::ET_Never|constructor#;
  constructor tearoff • = self::ET_Never|constructor#_#new#tearOff;
}
extension type ET_Object(core::Object it) implements core::Object {
  abstract extension-type-member representation-field get it() → core::Object;
  constructor • = self::ET_Object|constructor#;
  constructor tearoff • = self::ET_Object|constructor#_#new#tearOff;
}
extension type ET_Record(core::Record it) {
  abstract extension-type-member representation-field get it() → core::Record;
  constructor • = self::ET_Record|constructor#;
  constructor tearoff • = self::ET_Record|constructor#_#new#tearOff;
}
extension type ET_RecordType((core::int, core::String) it) {
  abstract extension-type-member representation-field get it() → (core::int, core::String);
  constructor • = self::ET_RecordType|constructor#;
  constructor tearoff • = self::ET_RecordType|constructor#_#new#tearOff;
}
extension type ET_Function(core::Function it) {
  abstract extension-type-member representation-field get it() → core::Function;
  constructor • = self::ET_Function|constructor#;
  constructor tearoff • = self::ET_Function|constructor#_#new#tearOff;
}
extension type ET_FunctionType(() → void it) {
  abstract extension-type-member representation-field get it() → () → void;
  constructor • = self::ET_FunctionType|constructor#;
  constructor tearoff • = self::ET_FunctionType|constructor#_#new#tearOff;
}
extension type ET_NullableInterfaceType(core::String? it) {
  abstract extension-type-member representation-field get it() → core::String?;
  constructor • = self::ET_NullableInterfaceType|constructor#;
  constructor tearoff • = self::ET_NullableInterfaceType|constructor#_#new#tearOff;
}
extension type ET_NullableExtensionType(core::int it) {
  abstract extension-type-member representation-field get it() → core::int;
  constructor • = self::ET_NullableExtensionType|constructor#;
  constructor tearoff • = self::ET_NullableExtensionType|constructor#_#new#tearOff;
}
extension type ET_FutureOr(FutureOr<core::int>it) {
  abstract extension-type-member representation-field get it() → FutureOr<core::int>;
  constructor • = self::ET_FutureOr|constructor#;
  constructor tearoff • = self::ET_FutureOr|constructor#_#new#tearOff;
}
extension type ET_Extension(core::int it) {
  abstract extension-type-member representation-field get it() → core::int;
  constructor • = self::ET_Extension|constructor#;
  constructor tearoff • = self::ET_Extension|constructor#_#new#tearOff;
}
extension type ET_TypeVariable<T extends core::Object? = dynamic>(T% it) {
  abstract extension-type-member representation-field get it() → T%;
  constructor • = self::ET_TypeVariable|constructor#;
  constructor tearoff • = self::ET_TypeVariable|constructor#_#new#tearOff;
}
extension type ET_Class(self::Class it) implements self::Class {
  abstract extension-type-member representation-field get it() → self::Class;
  constructor • = self::ET_Class|constructor#;
  constructor tearoff • = self::ET_Class|constructor#_#new#tearOff;
}
extension type ET_GenericClass<T extends core::Object? = dynamic>(self::GenericClass<T%> it) implements self::GenericClass<T%> {
  abstract extension-type-member representation-field get it() → self::GenericClass<T%>;
  constructor • = self::ET_GenericClass|constructor#;
  constructor tearoff • = self::ET_GenericClass|constructor#_#new#tearOff;
}
extension type ET_Alias(self::Class it) implements self::Class {
  abstract extension-type-member representation-field get it() → self::Class;
  constructor • = self::ET_Alias|constructor#;
  constructor tearoff • = self::ET_Alias|constructor#_#new#tearOff;
}
extension type ET_GenericAlias<T extends core::Object? = dynamic>(self::GenericClass<T%> it) implements self::GenericClass<T%> {
  abstract extension-type-member representation-field get it() → self::GenericClass<T%>;
  constructor • = self::ET_GenericAlias|constructor#;
  constructor tearoff • = self::ET_GenericAlias|constructor#_#new#tearOff;
}
extension type ET_ExtensionType(core::int it) implements self::ExtensionType% /* erasure=core::int, declared=! */ {
  abstract extension-type-member representation-field get it() → core::int;
  constructor • = self::ET_ExtensionType|constructor#;
  constructor tearoff • = self::ET_ExtensionType|constructor#_#new#tearOff;
}
extension type ET_GenericExtensionType<T extends core::Object? = dynamic>(T% it) implements self::GenericExtensionType<T%>% /* erasure=T%, declared=! */ {
  abstract extension-type-member representation-field get it() → T%;
  constructor • = self::ET_GenericExtensionType|constructor#;
  constructor tearoff • = self::ET_GenericExtensionType|constructor#_#new#tearOff;
}
static extension-type-member method ExtensionType|constructor#(core::int it) → self::ExtensionType% /* erasure=core::int, declared=! */
  ;
static extension-type-member method ExtensionType|constructor#_#new#tearOff(core::int it) → self::ExtensionType% /* erasure=core::int, declared=! */
  return self::ExtensionType|constructor#(it);
static extension-type-member method GenericExtensionType|constructor#<T extends core::Object? = dynamic>(self::GenericExtensionType|constructor#::T% it) → self::GenericExtensionType<self::GenericExtensionType|constructor#::T%>% /* erasure=self::GenericExtensionType|constructor#::T%, declared=! */
  ;
static extension-type-member method GenericExtensionType|constructor#_#new#tearOff<T extends core::Object? = dynamic>(self::GenericExtensionType|constructor#_#new#tearOff::T% it) → self::GenericExtensionType<self::GenericExtensionType|constructor#_#new#tearOff::T%>% /* erasure=self::GenericExtensionType|constructor#_#new#tearOff::T%, declared=! */
  return self::GenericExtensionType|constructor#<self::GenericExtensionType|constructor#_#new#tearOff::T%>(it);
static extension-type-member method ET_Null|constructor#(Null it) → self::ET_Null% /* erasure=Null, declared=! */
  ;
static extension-type-member method ET_Null|constructor#_#new#tearOff(Null it) → self::ET_Null% /* erasure=Null, declared=! */
  return self::ET_Null|constructor#(it);
static extension-type-member method ET_Dynamic|constructor#(dynamic it) → self::ET_Dynamic% /* erasure=dynamic, declared=! */
  ;
static extension-type-member method ET_Dynamic|constructor#_#new#tearOff(dynamic it) → self::ET_Dynamic% /* erasure=dynamic, declared=! */
  return self::ET_Dynamic|constructor#(it);
static extension-type-member method ET_Void|constructor#(Null it) → self::ET_Void% /* erasure=Null, declared=! */
  ;
static extension-type-member method ET_Void|constructor#_#new#tearOff(Null it) → self::ET_Void% /* erasure=Null, declared=! */
  return self::ET_Void|constructor#(it);
static extension-type-member method ET_Never|constructor#(Never it) → self::ET_Never% /* erasure=invalid-type, declared=! */
  ;
static extension-type-member method ET_Never|constructor#_#new#tearOff(Never it) → self::ET_Never% /* erasure=invalid-type, declared=! */
  return self::ET_Never|constructor#(it);
static extension-type-member method ET_Object|constructor#(core::Object it) → self::ET_Object /* erasure=core::Object */
  ;
static extension-type-member method ET_Object|constructor#_#new#tearOff(core::Object it) → self::ET_Object /* erasure=core::Object */
  return self::ET_Object|constructor#(it);
static extension-type-member method ET_Record|constructor#(core::Record it) → self::ET_Record% /* erasure=core::Record, declared=! */
  ;
static extension-type-member method ET_Record|constructor#_#new#tearOff(core::Record it) → self::ET_Record% /* erasure=core::Record, declared=! */
  return self::ET_Record|constructor#(it);
static extension-type-member method ET_RecordType|constructor#((core::int, core::String) it) → self::ET_RecordType% /* erasure=(core::int, core::String), declared=! */
  ;
static extension-type-member method ET_RecordType|constructor#_#new#tearOff((core::int, core::String) it) → self::ET_RecordType% /* erasure=(core::int, core::String), declared=! */
  return self::ET_RecordType|constructor#(it);
static extension-type-member method ET_Function|constructor#(core::Function it) → self::ET_Function% /* erasure=core::Function, declared=! */
  ;
static extension-type-member method ET_Function|constructor#_#new#tearOff(core::Function it) → self::ET_Function% /* erasure=core::Function, declared=! */
  return self::ET_Function|constructor#(it);
static extension-type-member method ET_FunctionType|constructor#(() → void it) → self::ET_FunctionType% /* erasure=() → void, declared=! */
  ;
static extension-type-member method ET_FunctionType|constructor#_#new#tearOff(() → void it) → self::ET_FunctionType% /* erasure=() → void, declared=! */
  return self::ET_FunctionType|constructor#(it);
static extension-type-member method ET_NullableInterfaceType|constructor#(core::String? it) → self::ET_NullableInterfaceType% /* erasure=core::String?, declared=! */
  ;
static extension-type-member method ET_NullableInterfaceType|constructor#_#new#tearOff(core::String? it) → self::ET_NullableInterfaceType% /* erasure=core::String?, declared=! */
  return self::ET_NullableInterfaceType|constructor#(it);
static extension-type-member method ET_NullableExtensionType|constructor#(core::int it) → self::ET_NullableExtensionType% /* erasure=core::int, declared=! */
  ;
static extension-type-member method ET_NullableExtensionType|constructor#_#new#tearOff(core::int it) → self::ET_NullableExtensionType% /* erasure=core::int, declared=! */
  return self::ET_NullableExtensionType|constructor#(it);
static extension-type-member method ET_FutureOr|constructor#(FutureOr<core::int>it) → self::ET_FutureOr% /* erasure=FutureOr<core::int>, declared=! */
  ;
static extension-type-member method ET_FutureOr|constructor#_#new#tearOff(FutureOr<core::int>it) → self::ET_FutureOr% /* erasure=FutureOr<core::int>, declared=! */
  return self::ET_FutureOr|constructor#(it);
static extension-type-member method ET_Extension|constructor#_#new#tearOff(core::int it) → self::ET_Extension% /* erasure=core::int, declared=! */
  return self::ET_Extension|constructor#(it);
static extension-type-member method ET_Extension|constructor#(core::int it) → self::ET_Extension% /* erasure=core::int, declared=! */
  ;
static extension-type-member method ET_TypeVariable|constructor#<T extends core::Object? = dynamic>(self::ET_TypeVariable|constructor#::T% it) → self::ET_TypeVariable<self::ET_TypeVariable|constructor#::T%>% /* erasure=self::ET_TypeVariable|constructor#::T%, declared=! */
  ;
static extension-type-member method ET_TypeVariable|constructor#_#new#tearOff<T extends core::Object? = dynamic>(self::ET_TypeVariable|constructor#_#new#tearOff::T% it) → self::ET_TypeVariable<self::ET_TypeVariable|constructor#_#new#tearOff::T%>% /* erasure=self::ET_TypeVariable|constructor#_#new#tearOff::T%, declared=! */
  return self::ET_TypeVariable|constructor#<self::ET_TypeVariable|constructor#_#new#tearOff::T%>(it);
static extension-type-member method ET_Class|constructor#(self::Class it) → self::ET_Class /* erasure=self::Class */
  ;
static extension-type-member method ET_Class|constructor#_#new#tearOff(self::Class it) → self::ET_Class /* erasure=self::Class */
  return self::ET_Class|constructor#(it);
static extension-type-member method ET_GenericClass|constructor#<T extends core::Object? = dynamic>(self::GenericClass<self::ET_GenericClass|constructor#::T%> it) → self::ET_GenericClass<self::ET_GenericClass|constructor#::T%> /* erasure=self::GenericClass<self::ET_GenericClass|constructor#::T%> */
  ;
static extension-type-member method ET_GenericClass|constructor#_#new#tearOff<T extends core::Object? = dynamic>(self::GenericClass<self::ET_GenericClass|constructor#_#new#tearOff::T%> it) → self::ET_GenericClass<self::ET_GenericClass|constructor#_#new#tearOff::T%> /* erasure=self::GenericClass<self::ET_GenericClass|constructor#_#new#tearOff::T%> */
  return self::ET_GenericClass|constructor#<self::ET_GenericClass|constructor#_#new#tearOff::T%>(it);
static extension-type-member method ET_Alias|constructor#(self::Class it) → self::ET_Alias /* erasure=self::Class */
  ;
static extension-type-member method ET_Alias|constructor#_#new#tearOff(self::Class it) → self::ET_Alias /* erasure=self::Class */
  return self::ET_Alias|constructor#(it);
static extension-type-member method ET_GenericAlias|constructor#<T extends core::Object? = dynamic>(self::GenericClass<self::ET_GenericAlias|constructor#::T%> it) → self::ET_GenericAlias<self::ET_GenericAlias|constructor#::T%> /* erasure=self::GenericClass<self::ET_GenericAlias|constructor#::T%> */
  ;
static extension-type-member method ET_GenericAlias|constructor#_#new#tearOff<T extends core::Object? = dynamic>(self::GenericClass<self::ET_GenericAlias|constructor#_#new#tearOff::T%> it) → self::ET_GenericAlias<self::ET_GenericAlias|constructor#_#new#tearOff::T%> /* erasure=self::GenericClass<self::ET_GenericAlias|constructor#_#new#tearOff::T%> */
  return self::ET_GenericAlias|constructor#<self::ET_GenericAlias|constructor#_#new#tearOff::T%>(it);
static extension-type-member method ET_ExtensionType|constructor#(core::int it) → self::ET_ExtensionType% /* erasure=core::int, declared=! */
  ;
static extension-type-member method ET_ExtensionType|constructor#_#new#tearOff(core::int it) → self::ET_ExtensionType% /* erasure=core::int, declared=! */
  return self::ET_ExtensionType|constructor#(it);
static extension-type-member method ET_GenericExtensionType|constructor#<T extends core::Object? = dynamic>(self::ET_GenericExtensionType|constructor#::T% it) → self::ET_GenericExtensionType<self::ET_GenericExtensionType|constructor#::T%>% /* erasure=self::ET_GenericExtensionType|constructor#::T%, declared=! */
  ;
static extension-type-member method ET_GenericExtensionType|constructor#_#new#tearOff<T extends core::Object? = dynamic>(self::ET_GenericExtensionType|constructor#_#new#tearOff::T% it) → self::ET_GenericExtensionType<self::ET_GenericExtensionType|constructor#_#new#tearOff::T%>% /* erasure=self::ET_GenericExtensionType|constructor#_#new#tearOff::T%, declared=! */
  return self::ET_GenericExtensionType|constructor#<self::ET_GenericExtensionType|constructor#_#new#tearOff::T%>(it);
