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

class A extends core::Object {
  field core::double? foo1 = null;
  field core::String? foo2 = null;
  field core::int foo3 = 0;
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  operator []=(core::bool key, core::String? value) → void {}
  operator [](core::bool key) → core::String?
    return "";
}
class B extends self::A {
  synthetic constructor •() → self::B
    : super self::A::•()
    ;
  method test() → dynamic {
    {
      let final core::bool #t1 = false in super.{self::A::[]}(#t1) == null ?{core::String?} super.{self::A::[]=}(#t1, "") : null;
      core::String x = let final core::bool #t2 = false in let final core::String? #t3 = super.{self::A::[]}(#t2) in #t3 == null ?{core::String} let final core::String #t4 = "" in let final void #t5 = super.{self::A::[]=}(#t2, #t4) in #t4 : #t3{core::String};
    }
  }
}
extension E on dynamic {
  operator []= = self::E|[]=;
  operator [] = self::E|[];
}
static extension-member method E|[]=(lowered final dynamic #this, core::String key, core::int? value) → void {}
static extension-member method E|[](lowered final dynamic #this, core::String key) → core::int?
  return 0;
static method main() → dynamic {
  {
    self::A a = new self::A::•();
    let final self::A #t6 = a in #t6 == null ?{core::double?} null : #t6.{self::A::foo1}{core::double?} == null ?{core::double?} #t6.{self::A::foo1} = 42.0 : null;
    core::double? x = let final self::A #t7 = a in #t7 == null ?{core::double?} null : let final core::double? #t8 = #t7.{self::A::foo1}{core::double?} in #t8 == null ?{core::double} #t7.{self::A::foo1} = 42.0 : #t8{core::double};
  }
  {
    final core::Map<core::String, core::Map<core::String, core::String>> nestedMap = <core::String, core::Map<core::String, core::String>>{};
    let final core::Map<core::String, core::Map<core::String, core::String>> #t9 = nestedMap in #t9 == null ?{core::Map<core::String, core::String>?} null : let final core::String #t10 = "hello" in #t9.{core::Map::[]}(#t10){(core::Object?) → core::Map<core::String, core::String>?} == null ?{core::Map<core::String, core::String>?} #t9.{core::Map::[]=}(#t10, <core::String, core::String>{}){(core::String, core::Map<core::String, core::String>) → void} : null;
    core::Map<core::String, core::String>? x = let final core::Map<core::String, core::Map<core::String, core::String>> #t11 = nestedMap in #t11 == null ?{core::Map<core::String, core::String>?} null : let final core::String #t12 = "hello" in let final core::Map<core::String, core::String>? #t13 = #t11.{core::Map::[]}(#t12){(core::Object?) → core::Map<core::String, core::String>?} in #t13 == null ?{core::Map<core::String, core::String>} let final core::Map<core::String, core::String> #t14 = <core::String, core::String>{} in let final void #t15 = #t11.{core::Map::[]=}(#t12, #t14){(core::String, core::Map<core::String, core::String>) → void} in #t14 : #t13{core::Map<core::String, core::String>};
  }
  {
    let final dynamic #t16 = false in let final core::String #t17 = "hello" in self::E|[](#t16, #t17) == null ?{core::int?} self::E|[]=(#t16, #t17, 1) : null;
    core::int x = let final dynamic #t18 = false in let final core::String #t19 = "hello" in let final core::int? #t20 = self::E|[](#t18, #t19) in #t20 == null ?{core::int} let final core::int #t21 = 1 in let final void #t22 = self::E|[]=(#t18, #t19, #t21) in #t21 : #t20{core::int};
  }
  {
    self::A a = new self::A::•();
    let final self::A #t23 = a in #t23.{self::A::foo2}{core::String?} == null ?{core::String?} #t23.{self::A::foo2} = "" : null;
    core::String x = let final self::A #t24 = a in let final core::String? #t25 = #t24.{self::A::foo2}{core::String?} in #t25 == null ?{core::String} #t24.{self::A::foo2} = "" : #t25{core::String};
  }
  {
    core::bool? b1;
    core::bool? b2;
    b1 == null ?{core::bool?} b1 = false : null;
    core::bool x = let final core::bool? #t26 = b2 in #t26 == null ?{core::bool} b2 = false : #t26{core::bool};
  }
  {
    self::A? a = new self::A::•();
    let final self::A #t27 = a{self::A} in #t27 == null ?{core::int?} null : #t27.{self::A::foo3} = #t27.{self::A::foo3}{core::int}.{core::num::+}(1){(core::num) → core::int};
  }
}
