library;
import self as self;
import "dart:core" as core;

extension ObjectToJSExportedDartObject on core::Object {
  get toJS = self::ObjectToJSExportedDartObject|get#toJS;
}
extension ListToJSArray on core::List<self::JSAny? /* erasure=core::Object? */> {
  get toJS = self::ListToJSArray|get#toJS;
}
extension DoubleToJSNumber on core::double {
  get toJS = self::DoubleToJSNumber|get#toJS;
}
extension type JSAny(core::Object value) {
  abstract extension-type-member representation-field get value() → core::Object;
  constructor • = self::JSAny|constructor#;
  constructor tearoff • = self::JSAny|constructor#_#new#tearOff;
}
extension type JSObject(core::Object value) implements self::JSAny% /* erasure=core::Object, declared=! */ {
  abstract extension-type-member representation-field get value() → core::Object;
  constructor • = self::JSObject|constructor#;
  constructor tearoff • = self::JSObject|constructor#_#new#tearOff;
}
extension type JSArray(core::List<self::JSAny? /* erasure=core::Object? */> value) implements self::JSObject% /* erasure=core::Object, declared=! */ {
  abstract extension-type-member representation-field get value() → core::List<self::JSAny? /* erasure=core::Object? */>;
  constructor • = self::JSArray|constructor#;
  constructor tearoff • = self::JSArray|constructor#_#new#tearOff;
}
extension type JSExportedDartObject(core::Object value) implements self::JSObject% /* erasure=core::Object, declared=! */ {
  abstract extension-type-member representation-field get value() → core::Object;
  constructor • = self::JSExportedDartObject|constructor#;
  constructor tearoff • = self::JSExportedDartObject|constructor#_#new#tearOff;
}
extension type JSNumber(core::double value) implements self::JSAny% /* erasure=core::Object, declared=! */ {
  abstract extension-type-member representation-field get value() → core::double;
  constructor • = self::JSNumber|constructor#;
  constructor tearoff • = self::JSNumber|constructor#_#new#tearOff;
}
static extension-type-member method JSAny|constructor#(core::Object value) → self::JSAny% /* erasure=core::Object, declared=! */ {
  lowered final self::JSAny% /* erasure=core::Object, declared=! */ #this = value;
  return #this;
}
static extension-type-member method JSAny|constructor#_#new#tearOff(core::Object value) → self::JSAny% /* erasure=core::Object, declared=! */
  return self::JSAny|constructor#(value);
static extension-type-member method JSObject|constructor#(core::Object value) → self::JSObject% /* erasure=core::Object, declared=! */ {
  lowered final self::JSObject% /* erasure=core::Object, declared=! */ #this = value;
  return #this;
}
static extension-type-member method JSObject|constructor#_#new#tearOff(core::Object value) → self::JSObject% /* erasure=core::Object, declared=! */
  return self::JSObject|constructor#(value);
static extension-type-member method JSArray|constructor#(core::List<self::JSAny? /* erasure=core::Object? */> value) → self::JSArray% /* erasure=core::List<core::Object?>, declared=! */ {
  lowered final self::JSArray% /* erasure=core::List<core::Object?>, declared=! */ #this = value;
  return #this;
}
static extension-type-member method JSArray|constructor#_#new#tearOff(core::List<self::JSAny? /* erasure=core::Object? */> value) → self::JSArray% /* erasure=core::List<core::Object?>, declared=! */
  return self::JSArray|constructor#(value);
static extension-type-member method JSExportedDartObject|constructor#(core::Object value) → self::JSExportedDartObject% /* erasure=core::Object, declared=! */ {
  lowered final self::JSExportedDartObject% /* erasure=core::Object, declared=! */ #this = value;
  return #this;
}
static extension-type-member method JSExportedDartObject|constructor#_#new#tearOff(core::Object value) → self::JSExportedDartObject% /* erasure=core::Object, declared=! */
  return self::JSExportedDartObject|constructor#(value);
static extension-type-member method JSNumber|constructor#(core::double value) → self::JSNumber% /* erasure=core::double, declared=! */ {
  lowered final self::JSNumber% /* erasure=core::double, declared=! */ #this = value;
  return #this;
}
static extension-type-member method JSNumber|constructor#_#new#tearOff(core::double value) → self::JSNumber% /* erasure=core::double, declared=! */
  return self::JSNumber|constructor#(value);
static extension-member method ObjectToJSExportedDartObject|get#toJS(lowered final core::Object #this) → self::JSExportedDartObject% /* erasure=core::Object, declared=! */
  return self::JSExportedDartObject|constructor#(#this);
static extension-member method ListToJSArray|get#toJS(lowered final core::List<self::JSAny? /* erasure=core::Object? */> #this) → self::JSArray% /* erasure=core::List<core::Object?>, declared=! */
  return self::JSArray|constructor#(#this);
static extension-member method DoubleToJSNumber|get#toJS(lowered final core::double #this) → self::JSNumber% /* erasure=core::double, declared=! */
  return self::JSNumber|constructor#(#this);
static method main() → void {
  self::JSArray% /* erasure=core::List<core::Object?>, declared=! */ arr = self::ListToJSArray|get#toJS(<self::JSAny% /* erasure=core::Object, declared=! */>[self::DoubleToJSNumber|get#toJS(1.0), self::ObjectToJSExportedDartObject|get#toJS("foo")]);
}
