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

  abstract class Bar extends dart.core::Object {
    field dart.core::bool field = true;
    synthetic constructor •() → lib1::Bar
      : super dart.core::Object::•()
      ;
    abstract method method() → void;
    abstract get getter() → dart.core::bool;
    abstract set setter(dart.core::bool b) → void;
  }
}
library from "org-dartlang-test:///main.dart" as main {

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

  class Foo1 extends lib1::Bar {
    synthetic constructor •() → main::Foo1
      : super lib1::Bar::•()
      ;
    method noSuchMethod(dart.core::Invocation msg) → dynamic {
      dart.core::print("noSouchMethod!!");
    }
    no-such-method-forwarder method method() → void
      return this.{main::Foo1::noSuchMethod}(new dart.core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(#C4))){(dart.core::Invocation) → dynamic};
    no-such-method-forwarder get getter() → dart.core::bool
      return this.{main::Foo1::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} dart.core::bool;
    no-such-method-forwarder set setter(dart.core::bool b) → void
      return this.{main::Foo1::noSuchMethod}(new dart.core::_InvocationMirror::_withType(#C6, 2, #C2, dart.core::List::unmodifiable<dynamic>(dart.core::_GrowableList::_literal1<dynamic>(b)), dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(#C4))){(dart.core::Invocation) → dynamic};
  }
  class Foo2 extends dart.core::Object implements lib1::Bar {
    synthetic constructor •() → main::Foo2
      : super dart.core::Object::•()
      ;
    method noSuchMethod(dart.core::Invocation msg) → dynamic {
      dart.core::print("noSouchMethod!!");
    }
    no-such-method-forwarder get field() → dart.core::bool
      return this.{main::Foo2::noSuchMethod}(new dart.core::_InvocationMirror::_withType(#C7, 1, #C2, #C3, dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(#C4))){(dart.core::Invocation) → dynamic} as{TypeError,ForDynamic} dart.core::bool;
    no-such-method-forwarder set field(dart.core::bool value) → void
      return this.{main::Foo2::noSuchMethod}(new dart.core::_InvocationMirror::_withType(#C8, 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 method method() → void
      return this.{main::Foo2::noSuchMethod}(new dart.core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(#C4))){(dart.core::Invocation) → dynamic};
    no-such-method-forwarder get getter() → dart.core::bool
      return this.{main::Foo2::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} dart.core::bool;
    no-such-method-forwarder set setter(dart.core::bool b) → void
      return this.{main::Foo2::noSuchMethod}(new dart.core::_InvocationMirror::_withType(#C6, 2, #C2, dart.core::List::unmodifiable<dynamic>(dart.core::_GrowableList::_literal1<dynamic>(b)), dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(#C4))){(dart.core::Invocation) → dynamic};
  }
}
constants  {
  #C1 = #method
  #C2 = <dart.core::Type*>[]
  #C3 = <dynamic>[]
  #C4 = <dart.core::Symbol*, dynamic>{}
  #C5 = #getter
  #C6 = #setter=
  #C7 = #field
  #C8 = #field=
}
