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

class Test1 extends core::Object {
  field core::int t = null;
  constructor •() → void
    : super core::Object::•()
    ;
  method test() → void {
    core::int v1 = this.{self::Test1::t} = self::getInt();
    core::num v2 = this.{self::Test1::t} = self::getNum();
    core::int v4 = let final dynamic #t1 = this.{self::Test1::t} in #t1.{core::num::==}(null) ? this.{self::Test1::t} = self::getInt() : #t1;
    core::num v5 = let final dynamic #t2 = this.{self::Test1::t} in #t2.{core::num::==}(null) ? this.{self::Test1::t} = self::getNum() : #t2;
    core::int v7 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(self::getInt());
    core::num v8 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(self::getNum());
    core::int v10 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(1);
    core::int v11 = let final dynamic #t3 = this.{self::Test1::t} in let final dynamic #t4 = this.{self::Test1::t} = #t3.{core::num::+}(1) in #t3;
  }
}
class Test2 extends core::Object {
  field core::num t = null;
  constructor •() → void
    : super core::Object::•()
    ;
  method test() → void {
    core::int v1 = this.{self::Test2::t} = self::getInt();
    core::num v2 = this.{self::Test2::t} = self::getNum();
    core::double v3 = this.{self::Test2::t} = self::getDouble();
    core::num v4 = let final dynamic #t5 = this.{self::Test2::t} in #t5.{core::num::==}(null) ? this.{self::Test2::t} = self::getInt() : #t5;
    core::num v5 = let final dynamic #t6 = this.{self::Test2::t} in #t6.{core::num::==}(null) ? this.{self::Test2::t} = self::getNum() : #t6;
    core::num v6 = let final dynamic #t7 = this.{self::Test2::t} in #t7.{core::num::==}(null) ? this.{self::Test2::t} = self::getDouble() : #t7;
    core::num v7 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getInt());
    core::num v8 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getNum());
    core::num v9 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getDouble());
    core::num v10 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(1);
    core::num v11 = let final dynamic #t8 = this.{self::Test2::t} in let final dynamic #t9 = this.{self::Test2::t} = #t8.{core::num::+}(1) in #t8;
  }
}
class Test3 extends core::Object {
  field core::double t = null;
  constructor •() → void
    : super core::Object::•()
    ;
  method test3() → void {
    core::num v2 = this.{self::Test3::t} = self::getNum();
    core::double v3 = this.{self::Test3::t} = self::getDouble();
    core::num v5 = let final dynamic #t10 = this.{self::Test3::t} in #t10.{core::num::==}(null) ? this.{self::Test3::t} = self::getNum() : #t10;
    core::double v6 = let final dynamic #t11 = this.{self::Test3::t} in #t11.{core::num::==}(null) ? this.{self::Test3::t} = self::getDouble() : #t11;
    core::double v7 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getInt());
    core::double v8 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getNum());
    core::double v9 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getDouble());
    core::double v10 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(1);
    core::double v11 = let final dynamic #t12 = this.{self::Test3::t} in let final dynamic #t13 = this.{self::Test3::t} = #t12.{core::double::+}(1) in #t12;
  }
}
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 {}
