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

class W extends core::Object {
  field core::String native;
  constructor •() → void
    : self::W::native = "field", super core::Object::•()
    ;
}
class X extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method native() → core::String
    return "method";
}
abstract class Y1 extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  abstract get native() → core::String;
}
class Y2 extends self::Y1 {
  synthetic constructor •() → void
    : super self::Y1::•()
    ;
  @core::override
  get native() → core::String
    return "getter";
}
class Z extends core::Object {
  field core::String f = null;
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  set native(core::String s) → dynamic
    return this.{self::Z::f} = s;
}
static method main() → dynamic {
  core::print(new self::W::•().native);
  core::print(new self::X::•().native());
  core::print(new self::Y2::•().native);
  core::print((let final dynamic #t1 = new self::Z::•() in let final dynamic #t2 = #t1.native = "setter" in #t1).f);
}
