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

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