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

static method test1(dynamic x) → dynamic {
  #L1:
  {
    final synthesized dynamic #0#0 = x;
    {
      hoisted core::int x;
      if(#0#0 is core::int && (let final dynamic #t1 = x = #0#0{core::int} in true)) {
        {
          {
            core::String x = "foo";
            return x;
          }
        }
      }
    }
    {
      {
        {
          return "bar";
        }
      }
    }
  }
}
static method test2(dynamic x) → dynamic {
  #L2:
  {
    final synthesized dynamic #0#0 = x;
    synthesized core::bool #0#4;
    synthesized core::bool #0#4#isSet = false;
    synthesized dynamic #0#6;
    synthesized core::bool #0#6#isSet = false;
    synthesized dynamic #0#7;
    synthesized core::bool #0#7#isSet = false;
    {
      lowered hoisted core::int x#case#0;
      lowered hoisted core::int x#case#1;
      if(#0#0 is core::List<dynamic> && (#0#4#isSet ?{core::bool} #0#4{core::bool} : let final dynamic #t2 = #0#4#isSet = true in #0#4 = #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1) && ((#0#6#isSet ?{dynamic} #0#6{dynamic} : let final dynamic #t3 = #0#6#isSet = true in #0#6 = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic}) is core::int && (let final dynamic #t4 = x#case#0 = (#0#6#isSet ?{dynamic} #0#6{dynamic} : let final dynamic #t5 = #0#6#isSet = true in #0#6 = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic}) as{Unchecked} core::int in true)) || #0#0 is core::List<dynamic> && (#0#4#isSet ?{core::bool} #0#4{core::bool} : let final dynamic #t6 = #0#4#isSet = true in #0#4 = #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1) && ((#0#7#isSet ?{dynamic} #0#7{dynamic} : let final dynamic #t7 = #0#7#isSet = true in #0#7 = #0#0{core::List<dynamic>}.{core::List::[]}(1){(core::int) → dynamic}) is core::int && (let final dynamic #t8 = x#case#1 = (#0#7#isSet ?{dynamic} #0#7{dynamic} : let final dynamic #t9 = #0#7#isSet = true in #0#7 = #0#0{core::List<dynamic>}.{core::List::[]}(1){(core::int) → dynamic}) as{Unchecked} core::int in true))) {
        {
          core::String x = "foo";
          return x;
        }
      }
    }
    {
      {
        {
          return "bar";
        }
      }
    }
  }
}
static method test3(dynamic x) → dynamic {
  {
    final synthesized dynamic #0#0 = x;
    {
      hoisted core::int x;
      if(#0#0 is core::int) {
        x = #0#0{core::int};
        {
          core::String x = "foo";
          return x;
        }
      }
      else {
        return "bar";
      }
    }
  }
}
static method test4(dynamic x) → dynamic {
  core::Function f = () → core::int => 0;
  {
    final synthesized dynamic #0#0 = x;
    {
      hoisted core::int x;
      if(#0#0 is core::int) {
        x = #0#0{core::int};
        {
          core::String x = (() → core::String {
            f = () → core::int => 1;
            return "foo";
          })(){() → core::String};
        }
      }
    }
  }
  return f();
}
static method main() → dynamic {
  self::expectEquals(self::test1(0), "foo");
  self::expectEquals(self::test1("foo"), "bar");
  self::expectEquals(self::test2(<core::Object>[0, false]), "foo");
  self::expectEquals(self::test2(<core::Object>[false, 0]), "foo");
  self::expectEquals(self::test2("foo"), "bar");
  self::expectEquals(self::test3(0), "foo");
  self::expectEquals(self::test3("foo"), "bar");
  self::expectEquals(self::test4(0), 1);
  self::expectEquals(self::test4("foo"), 0);
}
static method expectEquals(dynamic x, dynamic y) → dynamic {
  if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {
    throw "Expected '${x}' to be equal to '${y}'.";
  }
}

constants  {
  #C1 = 2
}
