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

class Test1 extends core::Object {
  field core::int prop = null;
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  static method test(self::Test1 t) → void {
    core::int v1 = t.{self::Test1::prop} = self::getInt();
    core::int v4 = let final self::Test1 #t1 = t in let final core::int #t2 = #t1.{self::Test1::prop} in #t2.{core::num::==}(null) ?{core::int} #t1.{self::Test1::prop} = self::getInt() : #t2;
    core::int v7 = let final self::Test1 #t3 = t in #t3.{self::Test1::prop} = #t3.{self::Test1::prop}.{core::num::+}(self::getInt());
    core::int v10 = let final self::Test1 #t4 = t in #t4.{self::Test1::prop} = #t4.{self::Test1::prop}.{core::num::+}(1);
    core::int v11 = let final self::Test1 #t5 = t in let final core::int #t6 = #t5.{self::Test1::prop} in let final core::int #t7 = #t5.{self::Test1::prop} = #t6.{core::num::+}(1) in #t6;
  }
}
class Test2 extends core::Object {
  field core::num prop = null;
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  static method test(self::Test2 t) → void {
    core::int v1 = t.{self::Test2::prop} = self::getInt();
    core::num v2 = t.{self::Test2::prop} = self::getNum();
    core::double v3 = t.{self::Test2::prop} = self::getDouble();
    core::num v4 = let final self::Test2 #t8 = t in let final core::num #t9 = #t8.{self::Test2::prop} in #t9.{core::num::==}(null) ?{core::num} #t8.{self::Test2::prop} = self::getInt() : #t9;
    core::num v5 = let final self::Test2 #t10 = t in let final core::num #t11 = #t10.{self::Test2::prop} in #t11.{core::num::==}(null) ?{core::num} #t10.{self::Test2::prop} = self::getNum() : #t11;
    core::num v6 = let final self::Test2 #t12 = t in let final core::num #t13 = #t12.{self::Test2::prop} in #t13.{core::num::==}(null) ?{core::num} #t12.{self::Test2::prop} = self::getDouble() : #t13;
    core::num v7 = let final self::Test2 #t14 = t in #t14.{self::Test2::prop} = #t14.{self::Test2::prop}.{core::num::+}(self::getInt());
    core::num v8 = let final self::Test2 #t15 = t in #t15.{self::Test2::prop} = #t15.{self::Test2::prop}.{core::num::+}(self::getNum());
    core::num v9 = let final self::Test2 #t16 = t in #t16.{self::Test2::prop} = #t16.{self::Test2::prop}.{core::num::+}(self::getDouble());
    core::num v10 = let final self::Test2 #t17 = t in #t17.{self::Test2::prop} = #t17.{self::Test2::prop}.{core::num::+}(1);
    core::num v11 = let final self::Test2 #t18 = t in let final core::num #t19 = #t18.{self::Test2::prop} in let final core::num #t20 = #t18.{self::Test2::prop} = #t19.{core::num::+}(1) in #t19;
  }
}
class Test3 extends core::Object {
  field core::double prop = null;
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  static method test3(self::Test3 t) → void {
    core::double v3 = t.{self::Test3::prop} = self::getDouble();
    core::double v6 = let final self::Test3 #t21 = t in let final core::double #t22 = #t21.{self::Test3::prop} in #t22.{core::num::==}(null) ?{core::double} #t21.{self::Test3::prop} = self::getDouble() : #t22;
    core::double v7 = let final self::Test3 #t23 = t in #t23.{self::Test3::prop} = #t23.{self::Test3::prop}.{core::double::+}(self::getInt());
    core::double v8 = let final self::Test3 #t24 = t in #t24.{self::Test3::prop} = #t24.{self::Test3::prop}.{core::double::+}(self::getNum());
    core::double v9 = let final self::Test3 #t25 = t in #t25.{self::Test3::prop} = #t25.{self::Test3::prop}.{core::double::+}(self::getDouble());
    core::double v10 = let final self::Test3 #t26 = t in #t26.{self::Test3::prop} = #t26.{self::Test3::prop}.{core::double::+}(1);
    core::double v11 = let final self::Test3 #t27 = t in let final core::double #t28 = #t27.{self::Test3::prop} in let final core::double #t29 = #t27.{self::Test3::prop} = #t28.{core::double::+}(1) in #t28;
  }
}
static method getInt() → core::int
  return 0;
static method getNum() → core::num
  return 0;
static method getDouble() → core::double
  return 0.0;
static method main() → dynamic {}
