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

class Other extends core::Object {
  field core::String text = 42.{core::int::toString}(){() → core::String};
  synthetic constructor •() → self::Other
    : super core::Object::•()
    ;
}
class Inner extends core::Object {
  field self::Other? other = core::int::parse("3") =={core::num::==}{(core::Object) → core::bool} 3 ?{self::Other?} new self::Other::•() : null;
  synthetic constructor •() → self::Inner
    : super core::Object::•()
    ;
}
abstract sealed class Wrapper extends core::Object {
  synthetic constructor •() → self::Wrapper
    : super core::Object::•()
    ;
}
class WrapperA extends self::Wrapper {
  field self::Inner inner = new self::Inner::•();
  synthetic constructor •() → self::WrapperA
    : super self::Wrapper::•()
    ;
}
class WrapperB extends self::Wrapper {
  field self::Inner inner = new self::Inner::•();
  synthetic constructor •() → self::WrapperB
    : super self::Wrapper::•()
    ;
}
static field self::Wrapper obj = core::int::parse("1") =={core::num::==}{(core::Object) → core::bool} 1 ?{self::Wrapper} new self::WrapperB::•() : new self::WrapperA::•();
static method main() → void {
  self::foo(self::obj);
}
static method foo(self::Wrapper wrapper) → void {
  core::print( block {
    core::String #t1;
    final synthesized self::Wrapper #0#0 = wrapper;
    synthesized self::Other? #0#3;
    synthesized core::bool #0#3#isSet = false;
    synthesized core::bool #0#5;
    synthesized core::bool #0#5#isSet = false;
    #L1:
    {
      {
        final hoisted self::Other other;
        if(#0#0 is self::WrapperA && (#0#3#isSet ?{self::Other?} #0#3{self::Other?} : let final dynamic #t2 = #0#3#isSet = true in #0#3 = #0#0{self::WrapperA}.{self::WrapperA::inner}{self::Inner}.{self::Inner::other}{self::Other?}) is self::Other) {
          other = (#0#3#isSet ?{self::Other?} #0#3{self::Other?} : let final dynamic #t3 = #0#3#isSet = true in #0#3 = #0#0{self::WrapperA}.{self::WrapperA::inner}{self::Inner}.{self::Inner::other}{self::Other?}) as{Unchecked} self::Other;
          #t1 = other.{self::Other::text}{core::String};
          break #L1;
        }
      }
      {
        if(#0#0 is self::WrapperA && (#0#5#isSet ?{core::bool} #0#5{core::bool} : let final dynamic #t4 = #0#5#isSet = true in #0#5 = (#0#3#isSet ?{self::Other?} #0#3{self::Other?} : let final dynamic #t5 = #0#3#isSet = true in #0#3 = #0#0{self::WrapperA}.{self::WrapperA::inner}{self::Inner}.{self::Inner::other}{self::Other?}) == null)) {
          #t1 = "no other";
          break #L1;
        }
      }
      {
        final hoisted self::Other other;
        if(#0#0 is self::WrapperB && (#0#3#isSet ?{self::Other?} #0#3{self::Other?} : let final dynamic #t6 = #0#3#isSet = true in #0#3 = #0#0{self::WrapperB}.{self::WrapperB::inner}{self::Inner}.{self::Inner::other}{self::Other?}) is self::Other) {
          other = (#0#3#isSet ?{self::Other?} #0#3{self::Other?} : let final dynamic #t7 = #0#3#isSet = true in #0#3 = #0#0{self::WrapperB}.{self::WrapperB::inner}{self::Inner}.{self::Inner::other}{self::Other?}) as{Unchecked} self::Other;
          #t1 = other.{self::Other::text}{core::String};
          break #L1;
        }
      }
      {
        if(#0#0 is self::WrapperB && (#0#5#isSet ?{core::bool} #0#5{core::bool} : let final dynamic #t8 = #0#5#isSet = true in #0#5 = (#0#3#isSet ?{self::Other?} #0#3{self::Other?} : let final dynamic #t9 = #0#3#isSet = true in #0#3 = #0#0{self::WrapperB}.{self::WrapperB::inner}{self::Inner}.{self::Inner::other}{self::Other?}) == null)) {
          #t1 = "no other";
          break #L1;
        }
      }
    }
  } =>#t1);
}
