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

abstract class M extends core::Object {
  field dynamic m = null;
  synthetic constructor •() → self::M
    : super core::Object::•()
    ;
}
abstract class N extends self::M {
  synthetic constructor •() → self::N
    : super self::M::•()
    ;
  set superM(dynamic value) → void {
    super.{self::M::m} = value;
  }
  get superM() → dynamic
    return super.{self::M::m};
}
class S extends core::Object {
  synthetic constructor •() → self::S
    : super core::Object::•()
    ;
}
abstract class _Named&S&M extends self::S implements self::M {
  field dynamic m = null;
  synthetic constructor •() → self::_Named&S&M
    : super self::S::•()
    ;
}
abstract class _Named&S&M&N extends self::_Named&S&M implements self::N {
  synthetic constructor •() → self::_Named&S&M&N
    : super self::_Named&S&M::•()
    ;
  set superM(dynamic value) → void {
    super.{self::M::m} = value;
  }
  get superM() → dynamic
    return super.{self::M::m};
}
class Named extends self::_Named&S&M&N implements self::M {
  field dynamic m = null;
  synthetic constructor •() → self::Named
    : super self::_Named&S&M&N::•()
    ;
}
static method main() → dynamic {
  self::Named named = new self::Named::•();
  named.m = 42;
  named.superM = 87;
  if(!named.m.==(42)) {
    throw "Bad mixin translation of set:superM";
  }
  if(!named.superM.==(87)) {
    throw "Bad mixin translation of get:superM";
  }
}
