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

extension type Ext(core::String _) implements core::String {
  abstract extension-type-member representation-field get _() → core::String;
  constructor _ = self::Ext|constructor#_;
  constructor tearoff _ = self::Ext|constructor#_#_#tearOff;
  constructor • = self::Ext|constructor#;
  constructor tearoff • = self::Ext|constructor#_#new#tearOff;
}
static const field core::String? maybe = #C5;
static extension-type-member method Ext|constructor#_(core::String _) → self::Ext /* erasure=core::String */ {
  lowered final self::Ext /* erasure=core::String */ #this = _;
  return #this;
}
static extension-type-member synthetic method Ext|constructor#_#_#tearOff(core::String _) → self::Ext /* erasure=core::String */
  return self::Ext|constructor#_(_);
static extension-type-member method Ext|constructor#() → self::Ext /* erasure=core::String */ {
  lowered final self::Ext /* erasure=core::String */ #this = "OK";
  assert(!(#C5 == null), "Must not be null");
  return #this;
}
static extension-type-member synthetic method Ext|constructor#_#new#tearOff() → self::Ext /* erasure=core::String */
  return self::Ext|constructor#();
static method main() → void {
  self::Ext /* erasure=core::String */ c = #C6;
  core::print(c);
}

constants  {
  #C1 = "not there"
  #C2 = eval /* from org-dartlang-testcase:///issue56803.dart */ const core::bool::fromEnvironment(#C1)
  #C3 = "string"
  #C4 = null
  #C5 = eval /* from org-dartlang-testcase:///issue56803.dart */ #C2 ?{core::String?} #C3 : #C4
  #C6 = eval /* from org-dartlang-testcase:///issue56803.dart */ const self::Ext|constructor#()
}
