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 v4 = let final dynamic #t1 = t in let final dynamic #t2 = #t1.prop in #t2.==(null) ? #t1.prop = self::getInt() : #t2;
    dynamic v7 = let final dynamic #t3 = t in #t3.prop = #t3.prop.+(self::getInt());
    dynamic v10 = let final dynamic #t4 = t in #t4.prop = #t4.prop.+(1);
    dynamic v11 = let final dynamic #t5 = t in let final dynamic #t6 = #t5.prop in let final dynamic #t7 = #t5.prop = #t6.+(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 {
    dynamic v1 = t.prop = self::getInt();
    dynamic v2 = t.prop = self::getNum();
    dynamic v3 = t.prop = self::getDouble();
    dynamic v4 = let final dynamic #t8 = t in let final dynamic #t9 = #t8.prop in #t9.==(null) ? #t8.prop = self::getInt() : #t9;
    dynamic v5 = let final dynamic #t10 = t in let final dynamic #t11 = #t10.prop in #t11.==(null) ? #t10.prop = self::getNum() : #t11;
    dynamic v6 = let final dynamic #t12 = t in let final dynamic #t13 = #t12.prop in #t13.==(null) ? #t12.prop = self::getDouble() : #t13;
    dynamic v7 = let final dynamic #t14 = t in #t14.prop = #t14.prop.+(self::getInt());
    dynamic v8 = let final dynamic #t15 = t in #t15.prop = #t15.prop.+(self::getNum());
    dynamic v9 = let final dynamic #t16 = t in #t16.prop = #t16.prop.+(self::getDouble());
    dynamic v10 = let final dynamic #t17 = t in #t17.prop = #t17.prop.+(1);
    dynamic v11 = let final dynamic #t18 = t in let final dynamic #t19 = #t18.prop in let final dynamic #t20 = #t18.prop = #t19.+(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 {
    dynamic v3 = t.prop = self::getDouble();
    dynamic v6 = let final dynamic #t21 = t in let final dynamic #t22 = #t21.prop in #t22.==(null) ? #t21.prop = self::getDouble() : #t22;
    dynamic v7 = let final dynamic #t23 = t in #t23.prop = #t23.prop.+(self::getInt());
    dynamic v8 = let final dynamic #t24 = t in #t24.prop = #t24.prop.+(self::getNum());
    dynamic v9 = let final dynamic #t25 = t in #t25.prop = #t25.prop.+(self::getDouble());
    dynamic v10 = let final dynamic #t26 = t in #t26.prop = #t26.prop.+(1);
    dynamic v11 = let final dynamic #t27 = t in let final dynamic #t28 = #t27.prop in let final dynamic #t29 = #t27.prop = #t28.+(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 {}
