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

class Test1 extends core::Object {
  field core::int prop = null;
  synthetic constructor •() → self::Test1
    : 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 •() → self::Test2
    : 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 •() → self::Test3
    : 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 {}
