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 /*isAnonymousMixin,isEliminatedMixin*/  {
  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 /*isAnonymousMixin,isEliminatedMixin*/  {
  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 /*isEliminatedMixin*/  {
  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.{self::M::m} = 42;
  named.{self::N::superM} = 87;
  if(!named.{self::M::m}.{core::Object::==}(42)) {
    throw "Bad mixin translation of set:superM";
  }
  if(!named.{self::N::superM}.{core::Object::==}(87)) {
    throw "Bad mixin translation of get:superM";
  }
}
