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

abstract class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  abstract get b() → self::B;
  abstract get i() → core::int;
}
abstract class B extends core::Object {
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
  abstract get c() → self::C;
  abstract get i() → core::int;
}
abstract class C extends core::Object {
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  abstract get i() → core::int;
}
static method ifCase(dynamic o) → dynamic {
  {
    hoisted self::A a;
    final synthesized dynamic #0#0 = o;
    if(#0#0 is self::A) {
      a = #0#0{self::A};
      {
        core::print(a);
      }
    }
  }
  {
    hoisted self::B b;
    final synthesized dynamic #1#0 = o;
    if(#1#0 is self::A) {
      b = #1#0{self::A}.{self::A::b}{self::B};
      {
        core::print(b);
      }
    }
  }
  {
    hoisted self::C c;
    final synthesized dynamic #2#0 = o;
    if(#2#0 is self::A) {
      c = #2#0{self::A}.{self::A::b}{self::B}.{self::B::c}{self::C};
      {
        core::print(c);
      }
    }
  }
  {
    hoisted core::int i;
    final synthesized dynamic #3#0 = o;
    if(#3#0 is self::A) {
      i = #3#0{self::A}.{self::A::b}{self::B}.{self::B::c}{self::C}.{self::C::i}{core::int};
      {
        core::print(i);
      }
    }
  }
  {
    hoisted self::B b;
    hoisted core::int i;
    final synthesized dynamic #4#0 = o;
    if(#4#0 is self::A) {
      b = #4#0{self::A}.{self::A::b}{self::B};
      i = #4#0{self::A}.{self::A::i}{core::int};
      {
        core::print(b);
        core::print(i);
      }
    }
  }
  {
    hoisted self::B b;
    final synthesized dynamic #5#0 = o;
    if(#5#0 is self::A && #C1 =={core::num::==}{(core::Object) → core::bool} #5#0{self::A}.{self::A::i}{core::int}) {
      b = #5#0{self::A}.{self::A::b}{self::B};
      {
        core::print(b);
      }
    }
  }
  {
    hoisted self::B b;
    final synthesized dynamic #6#0 = o;
    if(#6#0 is self::A && (let final self::B #t1 = b = #6#0{self::A}.{self::A::b}{self::B} in true) && #C1 =={core::num::==}{(core::Object) → core::bool} #6#0{self::A}.{self::A::i}{core::int}) {
      core::print(b);
    }
  }
  {
    hoisted self::B b;
    hoisted self::C c;
    final synthesized dynamic #7#0 = o;
    synthesized self::B #7#2;
    synthesized core::bool #7#2#isSet = false;
    if(#7#0 is self::A && (let final self::B #t2 = b = #7#2#isSet ?{self::B} #7#2{self::B} : let final core::bool* #t3 = #7#2#isSet = true in #7#2 = #7#0{self::A}.{self::A::b}{self::B} in true) && #C1 =={core::num::==}{(core::Object) → core::bool} #7#0{self::A}.{self::A::i}{core::int} && ((let final self::C #t4 = c = (#7#2#isSet ?{self::B} #7#2{self::B} : let final core::bool* #t5 = #7#2#isSet = true in #7#2 = #7#0{self::A}.{self::A::b}{self::B}).{self::B::c}{self::C} in true) && #C2 =={core::num::==}{(core::Object) → core::bool} (#7#2#isSet ?{self::B} #7#2{self::B} : let final core::bool* #t6 = #7#2#isSet = true in #7#2 = #7#0{self::A}.{self::A::b}{self::B}).{self::B::i}{core::int})) {
      core::print(b);
      core::print(c);
    }
  }
}
static method switchExpression(dynamic o) → dynamic
  return block {
    core::Object? #t7;
    final synthesized dynamic #0#0 = o;
    synthesized self::B #0#2;
    synthesized core::bool #0#2#isSet = false;
    synthesized self::C #0#3;
    synthesized core::bool #0#3#isSet = false;
    synthesized core::int #0#5;
    synthesized core::bool #0#5#isSet = false;
    synthesized core::bool #0#7;
    synthesized core::bool #0#7#isSet = false;
    #L1:
    {
      {
        hoisted self::A a;
        if(#0#0 is self::A) {
          a = #0#0{self::A};
          #t7 = a;
          break #L1;
        }
      }
      {
        hoisted self::B b;
        if(#0#0 is self::A) {
          b = #0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t8 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B};
          #t7 = b;
          break #L1;
        }
      }
      {
        hoisted self::C c;
        if(#0#0 is self::A) {
          c = #0#3#isSet ?{self::C} #0#3{self::C} : let final core::bool* #t9 = #0#3#isSet = true in #0#3 = (#0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t10 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B}).{self::B::c}{self::C};
          #t7 = c;
          break #L1;
        }
      }
      {
        hoisted core::int i;
        if(#0#0 is self::A) {
          i = (#0#3#isSet ?{self::C} #0#3{self::C} : let final core::bool* #t11 = #0#3#isSet = true in #0#3 = (#0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t12 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B}).{self::B::c}{self::C}).{self::C::i}{core::int};
          #t7 = i;
          break #L1;
        }
      }
      {
        hoisted self::B b;
        hoisted core::int i;
        if(#0#0 is self::A) {
          b = #0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t13 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B};
          i = #0#5#isSet ?{core::int} #0#5{core::int} : let final core::bool* #t14 = #0#5#isSet = true in #0#5 = #0#0{self::A}.{self::A::i}{core::int};
          #t7 = "${b}${i}";
          break #L1;
        }
      }
      {
        hoisted self::B b;
        if(#0#0 is self::A && (#0#7#isSet ?{core::bool} #0#7{core::bool} : let final core::bool* #t15 = #0#7#isSet = true in #0#7 = #C1 =={core::num::==}{(core::Object) → core::bool} (#0#5#isSet ?{core::int} #0#5{core::int} : let final core::bool* #t16 = #0#5#isSet = true in #0#5 = #0#0{self::A}.{self::A::i}{core::int}))) {
          b = #0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t17 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B};
          #t7 = b;
          break #L1;
        }
      }
      {
        hoisted self::B b;
        if(#0#0 is self::A && (let final self::B #t18 = b = #0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t19 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B} in true) && (#0#7#isSet ?{core::bool} #0#7{core::bool} : let final core::bool* #t20 = #0#7#isSet = true in #0#7 = #C1 =={core::num::==}{(core::Object) → core::bool} (#0#5#isSet ?{core::int} #0#5{core::int} : let final core::bool* #t21 = #0#5#isSet = true in #0#5 = #0#0{self::A}.{self::A::i}{core::int}))) {
          #t7 = b;
          break #L1;
        }
      }
      {
        hoisted self::B b;
        hoisted self::C c;
        if(#0#0 is self::A && (let final self::B #t22 = b = #0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t23 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B} in true) && (#0#7#isSet ?{core::bool} #0#7{core::bool} : let final core::bool* #t24 = #0#7#isSet = true in #0#7 = #C1 =={core::num::==}{(core::Object) → core::bool} (#0#5#isSet ?{core::int} #0#5{core::int} : let final core::bool* #t25 = #0#5#isSet = true in #0#5 = #0#0{self::A}.{self::A::i}{core::int})) && ((let final self::C #t26 = c = #0#3#isSet ?{self::C} #0#3{self::C} : let final core::bool* #t27 = #0#3#isSet = true in #0#3 = (#0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t28 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B}).{self::B::c}{self::C} in true) && #C2 =={core::num::==}{(core::Object) → core::bool} (#0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t29 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B}).{self::B::i}{core::int})) {
          #t7 = "${b}${c}";
          break #L1;
        }
      }
      {
        if(true) {
          #t7 = null;
          break #L1;
        }
      }
      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable type.");
    }
  } =>#t7;
static method switchStatement(dynamic o) → dynamic {
  dynamic v;
  #L2:
  {
    final synthesized dynamic #0#0 = o;
    synthesized self::B #0#2;
    synthesized core::bool #0#2#isSet = false;
    synthesized self::C #0#3;
    synthesized core::bool #0#3#isSet = false;
    synthesized core::int #0#5;
    synthesized core::bool #0#5#isSet = false;
    synthesized core::bool #0#7;
    synthesized core::bool #0#7#isSet = false;
    {
      hoisted self::A a;
      if(#0#0 is self::A && (let final self::A #t30 = a = #0#0{self::A} in true)) {
        {
          v = a;
          break #L2;
        }
      }
    }
    {
      hoisted self::B b;
      if(#0#0 is self::A && (let final self::B #t31 = b = #0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t32 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B} in true)) {
        {
          v = b;
          break #L2;
        }
      }
    }
    {
      hoisted self::C c;
      if(#0#0 is self::A && (let final self::C #t33 = c = #0#3#isSet ?{self::C} #0#3{self::C} : let final core::bool* #t34 = #0#3#isSet = true in #0#3 = (#0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t35 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B}).{self::B::c}{self::C} in true)) {
        {
          v = c;
          break #L2;
        }
      }
    }
    {
      hoisted core::int i;
      if(#0#0 is self::A && (let final core::int #t36 = i = (#0#3#isSet ?{self::C} #0#3{self::C} : let final core::bool* #t37 = #0#3#isSet = true in #0#3 = (#0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t38 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B}).{self::B::c}{self::C}).{self::C::i}{core::int} in true)) {
        {
          v = i;
          break #L2;
        }
      }
    }
    {
      hoisted self::B b;
      hoisted core::int i;
      if(#0#0 is self::A && (let final self::B #t39 = b = #0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t40 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B} in true) && (let final core::int #t41 = i = #0#5#isSet ?{core::int} #0#5{core::int} : let final core::bool* #t42 = #0#5#isSet = true in #0#5 = #0#0{self::A}.{self::A::i}{core::int} in true)) {
        {
          v = "${b}${i}";
          break #L2;
        }
      }
    }
    {
      hoisted self::B b;
      if(#0#0 is self::A && (#0#7#isSet ?{core::bool} #0#7{core::bool} : let final core::bool* #t43 = #0#7#isSet = true in #0#7 = #C1 =={core::num::==}{(core::Object) → core::bool} (#0#5#isSet ?{core::int} #0#5{core::int} : let final core::bool* #t44 = #0#5#isSet = true in #0#5 = #0#0{self::A}.{self::A::i}{core::int})) && (let final self::B #t45 = b = #0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t46 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B} in true)) {
        {
          v = b;
          break #L2;
        }
      }
    }
    {
      hoisted self::B b;
      if(#0#0 is self::A && (let final self::B #t47 = b = #0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t48 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B} in true) && (#0#7#isSet ?{core::bool} #0#7{core::bool} : let final core::bool* #t49 = #0#7#isSet = true in #0#7 = #C1 =={core::num::==}{(core::Object) → core::bool} (#0#5#isSet ?{core::int} #0#5{core::int} : let final core::bool* #t50 = #0#5#isSet = true in #0#5 = #0#0{self::A}.{self::A::i}{core::int}))) {
        {
          v = b;
          break #L2;
        }
      }
    }
    {
      hoisted self::B b;
      hoisted self::C c;
      if(#0#0 is self::A && (let final self::B #t51 = b = #0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t52 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B} in true) && (#0#7#isSet ?{core::bool} #0#7{core::bool} : let final core::bool* #t53 = #0#7#isSet = true in #0#7 = #C1 =={core::num::==}{(core::Object) → core::bool} (#0#5#isSet ?{core::int} #0#5{core::int} : let final core::bool* #t54 = #0#5#isSet = true in #0#5 = #0#0{self::A}.{self::A::i}{core::int})) && ((let final self::C #t55 = c = #0#3#isSet ?{self::C} #0#3{self::C} : let final core::bool* #t56 = #0#3#isSet = true in #0#3 = (#0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t57 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B}).{self::B::c}{self::C} in true) && #C2 =={core::num::==}{(core::Object) → core::bool} (#0#2#isSet ?{self::B} #0#2{self::B} : let final core::bool* #t58 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::b}{self::B}).{self::B::i}{core::int})) {
        {
          v = "${b}${c}";
        }
      }
    }
  }
  return v;
}

constants  {
  #C1 = 5
  #C2 = 7
}
