main = <No Member>;
library from "org-dartlang-test:///lib.dart" as lib {

  abstract class A extends dart.core::Object {
    field dart.core::int? _#A#x = null;
    field dart.core::bool _#A#x#isSet = false;
    synthetic constructor •() → lib::A
      : super dart.core::Object::•()
      ;
    get x() → dart.core::int
      return this.{lib::A::_#A#x#isSet}{dart.core::bool} ?{dart.core::int} let final dart.core::int? #t1 = this.{lib::A::_#A#x}{dart.core::int?} in #t1{dart.core::int} : throw new dart._internal::LateError::fieldNI("x");
    set x(dart.core::int x#param) → void {
      this.{lib::A::_#A#x#isSet} = true;
      this.{lib::A::_#A#x} = x#param;
    }
  }
}
library from "org-dartlang-test:///main.dart" as main {

  import "org-dartlang-test:///lib.dart";

  class B extends dart.core::Object implements lib::A {
    field dart.core::int x = 3;
    synthetic constructor •() → main::B
      : super dart.core::Object::•()
      ;
    no-such-method-forwarder get /* from org-dartlang-test:///lib.dart */ _#A#x#isSet() → dynamic
      return this.{dart.core::Object::noSuchMethod}(new dart.core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, dart.core::Map::unmodifiable<dart.core::Symbol*, dynamic>(#C4))){(dart.core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} dynamic;
    no-such-method-forwarder get /* from org-dartlang-test:///lib.dart */ _#A#x() → dart.core::int?
      return this.{dart.core::Object::noSuchMethod}(new dart.core::_InvocationMirror::_withType(#C5, 1, #C2, #C3, dart.core::Map::unmodifiable<dart.core::Symbol*, dynamic>(#C4))){(dart.core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} dart.core::int?;
    no-such-method-forwarder set /* from org-dartlang-test:///lib.dart */ _#A#x#isSet(dynamic value) → void
      return this.{dart.core::Object::noSuchMethod}(new dart.core::_InvocationMirror::_withType(#C6, 2, #C2, dart.core::List::unmodifiable<dynamic>(dart.core::_GrowableList::_literal1<dynamic>(value)), dart.core::Map::unmodifiable<dart.core::Symbol*, dynamic>(#C4))){(dart.core::Invocation) → dynamic};
    no-such-method-forwarder set /* from org-dartlang-test:///lib.dart */ _#A#x(dart.core::int? value) → void
      return this.{dart.core::Object::noSuchMethod}(new dart.core::_InvocationMirror::_withType(#C7, 2, #C2, dart.core::List::unmodifiable<dynamic>(dart.core::_GrowableList::_literal1<dynamic>(value)), dart.core::Map::unmodifiable<dart.core::Symbol*, dynamic>(#C4))){(dart.core::Invocation) → dynamic};
  }
}
constants  {
  #C1 = #org-dartlang-test:///main.dart::_#A#x#isSet
  #C2 = <dart.core::Type*>[]
  #C3 = <dynamic>[]
  #C4 = <dart.core::Symbol*, dynamic>{)
  #C5 = #org-dartlang-test:///main.dart::_#A#x
  #C6 = #org-dartlang-test:///main.dart::_#A#x#isSet=
  #C7 = #org-dartlang-test:///main.dart::_#A#x=
}
