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

abstract class Foo extends core::Object {
  synthetic constructor •() → self::Foo
    : super core::Object::•()
    ;
  abstract get a() → core::int;
  abstract get b() → core::num;
  abstract get c() → core::num;
}
static method method1(dynamic o) → dynamic {
  {
    final synthesized dynamic #0#0 = o;
    synthesized core::num #0#3;
    synthesized core::bool #0#3#isSet = false;
    {
      hoisted core::int a;
      hoisted core::int b;
      if(#0#0 is self::Foo && (let final dynamic #t1 = a = #0#0{self::Foo}.{self::Foo::a}{core::int} in true) && (#0#3#isSet ?{core::num} #0#3{core::num} : let final dynamic #t2 = #0#3#isSet = true in #0#3 = #0#0{self::Foo}.{self::Foo::b}{core::num}) is core::int) {
        b = (#0#3#isSet ?{core::num} #0#3{core::num} : let final dynamic #t3 = #0#3#isSet = true in #0#3 = #0#0{self::Foo}.{self::Foo::b}{core::num}) as{Unchecked} core::int;
        {
          core::print(a.{core::num::+}(b){(core::num) → core::int});
        }
      }
    }
  }
}
static method method2(dynamic o) → dynamic {
  {
    final synthesized dynamic #0#0 = o;
    synthesized core::num #0#4;
    synthesized core::bool #0#4#isSet = false;
    {
      hoisted core::int a;
      hoisted core::num b;
      hoisted core::int c;
      if(#0#0 is self::Foo && (let final dynamic #t4 = a = #0#0{self::Foo}.{self::Foo::a}{core::int} in true) && (let final dynamic #t5 = b = #0#0{self::Foo}.{self::Foo::b}{core::num} in true) && (#0#4#isSet ?{core::num} #0#4{core::num} : let final dynamic #t6 = #0#4#isSet = true in #0#4 = #0#0{self::Foo}.{self::Foo::c}{core::num}) is core::int) {
        c = (#0#4#isSet ?{core::num} #0#4{core::num} : let final dynamic #t7 = #0#4#isSet = true in #0#4 = #0#0{self::Foo}.{self::Foo::c}{core::num}) as{Unchecked} core::int;
        {
          core::print(a.{core::num::+}(b){(core::num) → core::num}.{core::num::+}(c){(core::num) → core::num});
        }
      }
    }
  }
}
static method method3(dynamic o) → dynamic {
  {
    final synthesized dynamic #0#0 = o;
    synthesized core::num #0#3;
    synthesized core::bool #0#3#isSet = false;
    synthesized core::num #0#6;
    synthesized core::bool #0#6#isSet = false;
    {
      hoisted core::int a;
      hoisted core::bool isEven;
      hoisted core::int c;
      if(#0#0 is self::Foo && (let final dynamic #t8 = a = #0#0{self::Foo}.{self::Foo::a}{core::int} in true) && ((#0#3#isSet ?{core::num} #0#3{core::num} : let final dynamic #t9 = #0#3#isSet = true in #0#3 = #0#0{self::Foo}.{self::Foo::b}{core::num}) is core::int && (let final dynamic #t10 = isEven = ((#0#3#isSet ?{core::num} #0#3{core::num} : let final dynamic #t11 = #0#3#isSet = true in #0#3 = #0#0{self::Foo}.{self::Foo::b}{core::num}) as{Unchecked} core::int).{core::int::isEven}{core::bool} in true)) && (#0#6#isSet ?{core::num} #0#6{core::num} : let final dynamic #t12 = #0#6#isSet = true in #0#6 = #0#0{self::Foo}.{self::Foo::c}{core::num}) is core::int) {
        c = (#0#6#isSet ?{core::num} #0#6{core::num} : let final dynamic #t13 = #0#6#isSet = true in #0#6 = #0#0{self::Foo}.{self::Foo::c}{core::num}) as{Unchecked} core::int;
        {
          core::print(a.{core::num::+}(c){(core::num) → core::int});
          core::print(isEven);
        }
      }
    }
  }
}
