library;
import self as self;
import "dart:core" as core;
import "no_such_method_private_setter_lib.dart" as no_;

import "org-dartlang-testcase:///no_such_method_private_setter_lib.dart";

class Foo extends core::Object implements no_::Bar {
  synthetic constructor •() → self::Foo*
    : super core::Object::•()
    ;
  no-such-method-forwarder get /* from org-dartlang-testcase:///no_such_method_private_setter_lib.dart */ _x() → core::int*
    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::int*;
  no-such-method-forwarder set /* from org-dartlang-testcase:///no_such_method_private_setter_lib.dart */ _x(core::int* value) → void
    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
}
static method main() → dynamic {
  no_::baz(new self::Foo::•());
}

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

class Bar extends core::Object {
  field core::int* _x = null;
  synthetic constructor •() → no_::Bar*
    : super core::Object::•()
    ;
}
static method baz(no_::Bar* bar) → void {
  return;
}

constants  {
  #C1 = #org-dartlang-testcase:///no_such_method_private_setter.dart::_x
  #C2 = <core::Type*>[]
  #C3 = <dynamic>[]
  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
  #C5 = #org-dartlang-testcase:///no_such_method_private_setter.dart::_x=
}
