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 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 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#()
}

Extra constant evaluation status:
Evaluated with empty environment: Not @ org-dartlang-testcase:///issue56803.dart:8:22 -> BoolConstant(false)
Evaluated with empty environment: EqualsNull @ org-dartlang-testcase:///issue56803.dart:8:22 -> BoolConstant(true)
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///issue56803.dart:8:16 -> NullConstant(null)
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///issue56803.dart:5:57 -> NullConstant(null)
Extra constant evaluation: evaluated: 13, effectively constant: 4
