library;
import self as self;
import "dart:core" as core;
import "issue52302_lib.dart" as iss;

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

abstract base class MixesInMixesInMixin extends self::_MixesInMixesInMixin&Object&MixesInMixin {
  synthetic constructor •() → self::MixesInMixesInMixin
    : super self::_MixesInMixesInMixin&Object&MixesInMixin::•()
    ;
}
abstract class _MixesInMixesInMixin&Object&MixesInMixin = core::Object with iss::MixesInMixin /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_MixesInMixesInMixin&Object&MixesInMixin
    : super core::Object::•()
    ;
  abstract synthetic mixin-stub get iterator() → core::Iterator<core::int>; -> core::Iterable::iterator
  synthetic mixin-super-stub method cast<R extends core::Object? = dynamic>() → core::Iterable<self::_MixesInMixesInMixin&Object&MixesInMixin::cast::R%>
    return super.{core::Iterable::cast}<self::_MixesInMixesInMixin&Object&MixesInMixin::cast::R%>();
  synthetic mixin-super-stub method followedBy(covariant-by-class core::Iterable<core::int> other) → core::Iterable<core::int>
    return super.{core::Iterable::followedBy}(other);
  synthetic mixin-super-stub method map<T extends core::Object? = dynamic>((core::int) → self::_MixesInMixesInMixin&Object&MixesInMixin::map::T% toElement) → core::Iterable<self::_MixesInMixesInMixin&Object&MixesInMixin::map::T%>
    return super.{core::Iterable::map}<self::_MixesInMixesInMixin&Object&MixesInMixin::map::T%>(toElement);
  synthetic mixin-super-stub method where((core::int) → core::bool test) → core::Iterable<core::int>
    return super.{core::Iterable::where}(test);
  synthetic mixin-super-stub method whereType<T extends core::Object? = dynamic>() → core::Iterable<self::_MixesInMixesInMixin&Object&MixesInMixin::whereType::T%>
    return super.{core::Iterable::whereType}<self::_MixesInMixesInMixin&Object&MixesInMixin::whereType::T%>();
  synthetic mixin-super-stub method expand<T extends core::Object? = dynamic>((core::int) → core::Iterable<self::_MixesInMixesInMixin&Object&MixesInMixin::expand::T%> toElements) → core::Iterable<self::_MixesInMixesInMixin&Object&MixesInMixin::expand::T%>
    return super.{core::Iterable::expand}<self::_MixesInMixesInMixin&Object&MixesInMixin::expand::T%>(toElements);
  synthetic mixin-super-stub method contains(core::Object? element) → core::bool
    return super.{core::Iterable::contains}(element);
  synthetic mixin-super-stub method forEach((core::int) → void action) → void
    return super.{core::Iterable::forEach}(action);
  synthetic mixin-super-stub method reduce(covariant-by-class (core::int, core::int) → core::int combine) → core::int
    return super.{core::Iterable::reduce}(combine);
  synthetic mixin-super-stub method fold<T extends core::Object? = dynamic>(self::_MixesInMixesInMixin&Object&MixesInMixin::fold::T% initialValue, (self::_MixesInMixesInMixin&Object&MixesInMixin::fold::T%, core::int) → self::_MixesInMixesInMixin&Object&MixesInMixin::fold::T% combine) → self::_MixesInMixesInMixin&Object&MixesInMixin::fold::T%
    return super.{core::Iterable::fold}<self::_MixesInMixesInMixin&Object&MixesInMixin::fold::T%>(initialValue, combine);
  synthetic mixin-super-stub method every((core::int) → core::bool test) → core::bool
    return super.{core::Iterable::every}(test);
  synthetic mixin-super-stub method join([core::String separator = #C1]) → core::String
    return super.{core::Iterable::join}(separator);
  synthetic mixin-super-stub method any((core::int) → core::bool test) → core::bool
    return super.{core::Iterable::any}(test);
  synthetic mixin-super-stub method toList({core::bool growable = #C2}) → core::List<core::int>
    return super.{core::Iterable::toList}(growable: growable);
  synthetic mixin-super-stub method toSet() → core::Set<core::int>
    return super.{core::Iterable::toSet}();
  synthetic mixin-super-stub get length() → core::int
    return super.{core::Iterable::length};
  synthetic mixin-super-stub get isEmpty() → core::bool
    return super.{core::Iterable::isEmpty};
  synthetic mixin-super-stub get isNotEmpty() → core::bool
    return super.{core::Iterable::isNotEmpty};
  synthetic mixin-super-stub method take(core::int count) → core::Iterable<core::int>
    return super.{core::Iterable::take}(count);
  synthetic mixin-super-stub method takeWhile((core::int) → core::bool test) → core::Iterable<core::int>
    return super.{core::Iterable::takeWhile}(test);
  synthetic mixin-super-stub method skip(core::int count) → core::Iterable<core::int>
    return super.{core::Iterable::skip}(count);
  synthetic mixin-super-stub method skipWhile((core::int) → core::bool test) → core::Iterable<core::int>
    return super.{core::Iterable::skipWhile}(test);
  synthetic mixin-super-stub get first() → core::int
    return super.{core::Iterable::first};
  synthetic mixin-super-stub get last() → core::int
    return super.{core::Iterable::last};
  synthetic mixin-super-stub get single() → core::int
    return super.{core::Iterable::single};
  synthetic mixin-super-stub method firstWhere((core::int) → core::bool test, {covariant-by-class () →? core::int orElse = #C3}) → core::int
    return super.{core::Iterable::firstWhere}(test, orElse: orElse);
  synthetic mixin-super-stub method lastWhere((core::int) → core::bool test, {covariant-by-class () →? core::int orElse = #C3}) → core::int
    return super.{core::Iterable::lastWhere}(test, orElse: orElse);
  synthetic mixin-super-stub method singleWhere((core::int) → core::bool test, {covariant-by-class () →? core::int orElse = #C3}) → core::int
    return super.{core::Iterable::singleWhere}(test, orElse: orElse);
  synthetic mixin-super-stub method elementAt(core::int index) → core::int
    return super.{core::Iterable::elementAt}(index);
  synthetic mixin-super-stub method toString() → core::String
    return super.{core::Iterable::toString}();
}
static method main() → void {}

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

abstract mixin class MixesInMixin = core::Object with core::Iterable<core::int> /*hasConstConstructor*/  {
  const synthetic constructor •() → iss::MixesInMixin
    : super core::Object::•()
    ;
  abstract synthetic mixin-stub get iterator() → core::Iterator<core::int>; -> core::Iterable::iterator
  synthetic mixin-super-stub method cast<R extends core::Object? = dynamic>() → core::Iterable<iss::MixesInMixin::cast::R%>
    return super.{core::Iterable::cast}<iss::MixesInMixin::cast::R%>();
  synthetic mixin-super-stub method followedBy(covariant-by-class core::Iterable<core::int> other) → core::Iterable<core::int>
    return super.{core::Iterable::followedBy}(other);
  synthetic mixin-super-stub method map<T extends core::Object? = dynamic>((core::int) → iss::MixesInMixin::map::T% toElement) → core::Iterable<iss::MixesInMixin::map::T%>
    return super.{core::Iterable::map}<iss::MixesInMixin::map::T%>(toElement);
  synthetic mixin-super-stub method where((core::int) → core::bool test) → core::Iterable<core::int>
    return super.{core::Iterable::where}(test);
  synthetic mixin-super-stub method whereType<T extends core::Object? = dynamic>() → core::Iterable<iss::MixesInMixin::whereType::T%>
    return super.{core::Iterable::whereType}<iss::MixesInMixin::whereType::T%>();
  synthetic mixin-super-stub method expand<T extends core::Object? = dynamic>((core::int) → core::Iterable<iss::MixesInMixin::expand::T%> toElements) → core::Iterable<iss::MixesInMixin::expand::T%>
    return super.{core::Iterable::expand}<iss::MixesInMixin::expand::T%>(toElements);
  synthetic mixin-super-stub method contains(core::Object? element) → core::bool
    return super.{core::Iterable::contains}(element);
  synthetic mixin-super-stub method forEach((core::int) → void action) → void
    return super.{core::Iterable::forEach}(action);
  synthetic mixin-super-stub method reduce(covariant-by-class (core::int, core::int) → core::int combine) → core::int
    return super.{core::Iterable::reduce}(combine);
  synthetic mixin-super-stub method fold<T extends core::Object? = dynamic>(iss::MixesInMixin::fold::T% initialValue, (iss::MixesInMixin::fold::T%, core::int) → iss::MixesInMixin::fold::T% combine) → iss::MixesInMixin::fold::T%
    return super.{core::Iterable::fold}<iss::MixesInMixin::fold::T%>(initialValue, combine);
  synthetic mixin-super-stub method every((core::int) → core::bool test) → core::bool
    return super.{core::Iterable::every}(test);
  synthetic mixin-super-stub method join([core::String separator = #C1]) → core::String
    return super.{core::Iterable::join}(separator);
  synthetic mixin-super-stub method any((core::int) → core::bool test) → core::bool
    return super.{core::Iterable::any}(test);
  synthetic mixin-super-stub method toList({core::bool growable = #C2}) → core::List<core::int>
    return super.{core::Iterable::toList}(growable: growable);
  synthetic mixin-super-stub method toSet() → core::Set<core::int>
    return super.{core::Iterable::toSet}();
  synthetic mixin-super-stub get length() → core::int
    return super.{core::Iterable::length};
  synthetic mixin-super-stub get isEmpty() → core::bool
    return super.{core::Iterable::isEmpty};
  synthetic mixin-super-stub get isNotEmpty() → core::bool
    return super.{core::Iterable::isNotEmpty};
  synthetic mixin-super-stub method take(core::int count) → core::Iterable<core::int>
    return super.{core::Iterable::take}(count);
  synthetic mixin-super-stub method takeWhile((core::int) → core::bool test) → core::Iterable<core::int>
    return super.{core::Iterable::takeWhile}(test);
  synthetic mixin-super-stub method skip(core::int count) → core::Iterable<core::int>
    return super.{core::Iterable::skip}(count);
  synthetic mixin-super-stub method skipWhile((core::int) → core::bool test) → core::Iterable<core::int>
    return super.{core::Iterable::skipWhile}(test);
  synthetic mixin-super-stub get first() → core::int
    return super.{core::Iterable::first};
  synthetic mixin-super-stub get last() → core::int
    return super.{core::Iterable::last};
  synthetic mixin-super-stub get single() → core::int
    return super.{core::Iterable::single};
  synthetic mixin-super-stub method firstWhere((core::int) → core::bool test, {covariant-by-class () →? core::int orElse = #C3}) → core::int
    return super.{core::Iterable::firstWhere}(test, orElse: orElse);
  synthetic mixin-super-stub method lastWhere((core::int) → core::bool test, {covariant-by-class () →? core::int orElse = #C3}) → core::int
    return super.{core::Iterable::lastWhere}(test, orElse: orElse);
  synthetic mixin-super-stub method singleWhere((core::int) → core::bool test, {covariant-by-class () →? core::int orElse = #C3}) → core::int
    return super.{core::Iterable::singleWhere}(test, orElse: orElse);
  synthetic mixin-super-stub method elementAt(core::int index) → core::int
    return super.{core::Iterable::elementAt}(index);
  synthetic mixin-super-stub method toString() → core::String
    return super.{core::Iterable::toString}();
}

constants  {
  #C1 = ""
  #C2 = true
  #C3 = null
}
