library /*isNonNullableByDefault*/;
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 = self::S with self::M /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Named&S&M
    : super self::S::•()
    ;
  mixin-super-stub get m() → dynamic
    return super.{self::M::m};
  mixin-super-stub set m(dynamic value) → void
    return super.{self::M::m} = value;
}
abstract class _Named&S&M&N = self::_Named&S&M with self::N /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Named&S&M&N
    : super self::_Named&S&M::•()
    ;
  mixin-super-stub get superM() → dynamic
    return super.{self::N::superM};
  mixin-super-stub set superM(dynamic value) → void
    return super.{self::N::superM} = value;
}
class Named = self::_Named&S&M&N with self::M {
  synthetic constructor •() → self::Named
    : super self::_Named&S&M&N::•()
    ;
  mixin-super-stub get m() → dynamic
    return super.{self::M::m};
  mixin-super-stub set m(dynamic value) → void
    return super.{self::M::m} = value;
}
static method main() → dynamic {
  self::Named named = new self::Named::•();
  named.{self::Named::m} = 42;
  named.{self::_Named&S&M&N::superM} = 87;
  if(!(named.{self::Named::m}{dynamic} =={core::Object::==}{(core::Object) → core::bool} 42)) {
    throw "Bad mixin translation of set:superM";
  }
  if(!(named.{self::_Named&S&M&N::superM}{dynamic} =={core::Object::==}{(core::Object) → core::bool} 87)) {
    throw "Bad mixin translation of get:superM";
  }
}
