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