library test /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

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