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