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

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

class Class extends core::Object {
  synthetic constructor •() → self::Class
    ;
  get field() → core::int
    ;
}
static field core::int counter;
static method test(dynamic o) → dynamic
  ;
static method main() → dynamic
  ;
static method expect(dynamic expected, dynamic actual) → dynamic
  ;

library;
import self as self2;
import "dart:core" as core;
import "dart:collection" as col;
import "dart:math" as math;

import "dart:collection";
import "org-dartlang-testcase:///cache_lookups.dart";

class CustomList<E extends core::Object? = dynamic> extends self2::_CustomList&Object&ListMixin<self2::CustomList::E%> {
  final field core::List<self2::CustomList::E%> list;
  constructor •(core::List<self2::CustomList::E%> list) → self2::CustomList<self2::CustomList::E%>
    ;
  get length() → core::int
    ;
  set length(core::int value) → void
    ;
  operator [](core::int index) → self2::CustomList::E%
    ;
  operator []=(core::int index, covariant-by-class self2::CustomList::E% value) → void
    ;
}
abstract class _CustomList&Object&ListMixin<E extends core::Object? = dynamic> = core::Object with col::ListBase<self2::_CustomList&Object&ListMixin::E%> /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self2::_CustomList&Object&ListMixin<self2::_CustomList&Object&ListMixin::E%>
    : super core::Object::•()
    ;
  synthetic mixin-super-stub get first() → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::first};
  synthetic mixin-super-stub set first(covariant-by-class self2::_CustomList&Object&ListMixin::E% value) → void
    return super.{col::ListBase::first} = value;
  synthetic mixin-super-stub get last() → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::last};
  synthetic mixin-super-stub set last(covariant-by-class self2::_CustomList&Object&ListMixin::E% value) → void
    return super.{col::ListBase::last} = value;
  synthetic mixin-super-stub get iterator() → core::Iterator<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::iterator};
  synthetic mixin-super-stub method elementAt(core::int index) → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::elementAt}(index);
  synthetic mixin-super-stub method followedBy(covariant-by-class core::Iterable<self2::_CustomList&Object&ListMixin::E%> other) → core::Iterable<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::followedBy}(other);
  synthetic mixin-super-stub method forEach((self2::_CustomList&Object&ListMixin::E%) → void action) → void
    return super.{col::ListBase::forEach}(action);
  synthetic mixin-super-stub get isEmpty() → core::bool
    return super.{col::ListBase::isEmpty};
  synthetic mixin-super-stub get isNotEmpty() → core::bool
    return super.{col::ListBase::isNotEmpty};
  synthetic mixin-super-stub get single() → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::single};
  synthetic mixin-super-stub method contains(core::Object? element) → core::bool
    return super.{col::ListBase::contains}(element);
  synthetic mixin-super-stub method every((self2::_CustomList&Object&ListMixin::E%) → core::bool test) → core::bool
    return super.{col::ListBase::every}(test);
  synthetic mixin-super-stub method any((self2::_CustomList&Object&ListMixin::E%) → core::bool test) → core::bool
    return super.{col::ListBase::any}(test);
  synthetic mixin-super-stub method firstWhere((self2::_CustomList&Object&ListMixin::E%) → core::bool test, {covariant-by-class () →? self2::_CustomList&Object&ListMixin::E% orElse = #C1}) → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::firstWhere}(test, orElse: orElse);
  synthetic mixin-super-stub method lastWhere((self2::_CustomList&Object&ListMixin::E%) → core::bool test, {covariant-by-class () →? self2::_CustomList&Object&ListMixin::E% orElse = #C1}) → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::lastWhere}(test, orElse: orElse);
  synthetic mixin-super-stub method singleWhere((self2::_CustomList&Object&ListMixin::E%) → core::bool test, {covariant-by-class () →? self2::_CustomList&Object&ListMixin::E% orElse = #C1}) → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::singleWhere}(test, orElse: orElse);
  synthetic mixin-super-stub method join([core::String separator = #C2]) → core::String
    return super.{col::ListBase::join}(separator);
  synthetic mixin-super-stub method where((self2::_CustomList&Object&ListMixin::E%) → core::bool test) → core::Iterable<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::where}(test);
  synthetic mixin-super-stub method whereType<T extends core::Object? = dynamic>() → core::Iterable<self2::_CustomList&Object&ListMixin::whereType::T%>
    return super.{col::ListBase::whereType}<self2::_CustomList&Object&ListMixin::whereType::T%>();
  synthetic mixin-super-stub method map<T extends core::Object? = dynamic>((self2::_CustomList&Object&ListMixin::E%) → self2::_CustomList&Object&ListMixin::map::T% f) → core::Iterable<self2::_CustomList&Object&ListMixin::map::T%>
    return super.{col::ListBase::map}<self2::_CustomList&Object&ListMixin::map::T%>(f);
  synthetic mixin-super-stub method expand<T extends core::Object? = dynamic>((self2::_CustomList&Object&ListMixin::E%) → core::Iterable<self2::_CustomList&Object&ListMixin::expand::T%> f) → core::Iterable<self2::_CustomList&Object&ListMixin::expand::T%>
    return super.{col::ListBase::expand}<self2::_CustomList&Object&ListMixin::expand::T%>(f);
  synthetic mixin-super-stub method reduce(covariant-by-class (self2::_CustomList&Object&ListMixin::E%, self2::_CustomList&Object&ListMixin::E%) → self2::_CustomList&Object&ListMixin::E% combine) → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::reduce}(combine);
  synthetic mixin-super-stub method fold<T extends core::Object? = dynamic>(self2::_CustomList&Object&ListMixin::fold::T% initialValue, (self2::_CustomList&Object&ListMixin::fold::T%, self2::_CustomList&Object&ListMixin::E%) → self2::_CustomList&Object&ListMixin::fold::T% combine) → self2::_CustomList&Object&ListMixin::fold::T%
    return super.{col::ListBase::fold}<self2::_CustomList&Object&ListMixin::fold::T%>(initialValue, combine);
  synthetic mixin-super-stub method skip(core::int count) → core::Iterable<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::skip}(count);
  synthetic mixin-super-stub method skipWhile((self2::_CustomList&Object&ListMixin::E%) → core::bool test) → core::Iterable<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::skipWhile}(test);
  synthetic mixin-super-stub method take(core::int count) → core::Iterable<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::take}(count);
  synthetic mixin-super-stub method takeWhile((self2::_CustomList&Object&ListMixin::E%) → core::bool test) → core::Iterable<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::takeWhile}(test);
  synthetic mixin-super-stub method toList({core::bool growable = #C3}) → core::List<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::toList}(growable: growable);
  synthetic mixin-super-stub method toSet() → core::Set<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::toSet}();
  synthetic mixin-super-stub method add(covariant-by-class self2::_CustomList&Object&ListMixin::E% element) → void
    return super.{col::ListBase::add}(element);
  synthetic mixin-super-stub method addAll(covariant-by-class core::Iterable<self2::_CustomList&Object&ListMixin::E%> iterable) → void
    return super.{col::ListBase::addAll}(iterable);
  synthetic mixin-super-stub method remove(core::Object? element) → core::bool
    return super.{col::ListBase::remove}(element);
  synthetic mixin-super-stub method col::_closeGap(core::int start, core::int end) → void
    return super.{col::ListBase::_closeGap}(start, end);
  synthetic mixin-super-stub method removeWhere((self2::_CustomList&Object&ListMixin::E%) → core::bool test) → void
    return super.{col::ListBase::removeWhere}(test);
  synthetic mixin-super-stub method retainWhere((self2::_CustomList&Object&ListMixin::E%) → core::bool test) → void
    return super.{col::ListBase::retainWhere}(test);
  synthetic mixin-super-stub method col::_filter((self2::_CustomList&Object&ListMixin::E%) → core::bool test, core::bool retainMatching) → void
    return super.{col::ListBase::_filter}(test, retainMatching);
  synthetic mixin-super-stub method clear() → void
    return super.{col::ListBase::clear}();
  synthetic mixin-super-stub method cast<R extends core::Object? = dynamic>() → core::List<self2::_CustomList&Object&ListMixin::cast::R%>
    return super.{col::ListBase::cast}<self2::_CustomList&Object&ListMixin::cast::R%>();
  synthetic mixin-super-stub method removeLast() → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::removeLast}();
  synthetic mixin-super-stub method sort([(self2::_CustomList&Object&ListMixin::E%, self2::_CustomList&Object&ListMixin::E%) →? core::int compare = #C1]) → void
    return super.{col::ListBase::sort}(compare);
  synthetic mixin-super-stub method shuffle([math::Random? random = #C1]) → void
    return super.{col::ListBase::shuffle}(random);
  synthetic mixin-super-stub method asMap() → core::Map<core::int, self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::asMap}();
  synthetic mixin-super-stub operator +(covariant-by-class core::List<self2::_CustomList&Object&ListMixin::E%> other) → core::List<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::+}(other);
  synthetic mixin-super-stub method sublist(core::int start, [core::int? end = #C1]) → core::List<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::sublist}(start, end);
  synthetic mixin-super-stub method getRange(core::int start, core::int end) → core::Iterable<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::getRange}(start, end);
  synthetic mixin-super-stub method removeRange(core::int start, core::int end) → void
    return super.{col::ListBase::removeRange}(start, end);
  synthetic mixin-super-stub method fillRange(core::int start, core::int end, [covariant-by-class self2::_CustomList&Object&ListMixin::E? fill = #C1]) → void
    return super.{col::ListBase::fillRange}(start, end, fill);
  synthetic mixin-super-stub method setRange(core::int start, core::int end, covariant-by-class core::Iterable<self2::_CustomList&Object&ListMixin::E%> iterable, [core::int skipCount = #C4]) → void
    return super.{col::ListBase::setRange}(start, end, iterable, skipCount);
  synthetic mixin-super-stub method replaceRange(core::int start, core::int end, covariant-by-class core::Iterable<self2::_CustomList&Object&ListMixin::E%> newContents) → void
    return super.{col::ListBase::replaceRange}(start, end, newContents);
  synthetic mixin-super-stub method indexOf(covariant-by-class core::Object? element, [core::int start = #C4]) → core::int
    return super.{col::ListBase::indexOf}(element, start);
  synthetic mixin-super-stub method indexWhere((self2::_CustomList&Object&ListMixin::E%) → core::bool test, [core::int start = #C4]) → core::int
    return super.{col::ListBase::indexWhere}(test, start);
  synthetic mixin-super-stub method lastIndexOf(covariant-by-class core::Object? element, [core::int? start = #C1]) → core::int
    return super.{col::ListBase::lastIndexOf}(element, start);
  synthetic mixin-super-stub method lastIndexWhere((self2::_CustomList&Object&ListMixin::E%) → core::bool test, [core::int? start = #C1]) → core::int
    return super.{col::ListBase::lastIndexWhere}(test, start);
  synthetic mixin-super-stub method insert(core::int index, covariant-by-class self2::_CustomList&Object&ListMixin::E% element) → void
    return super.{col::ListBase::insert}(index, element);
  synthetic mixin-super-stub method removeAt(core::int index) → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::removeAt}(index);
  synthetic mixin-super-stub method insertAll(core::int index, covariant-by-class core::Iterable<self2::_CustomList&Object&ListMixin::E%> iterable) → void
    return super.{col::ListBase::insertAll}(index, iterable);
  synthetic mixin-super-stub method setAll(core::int index, covariant-by-class core::Iterable<self2::_CustomList&Object&ListMixin::E%> iterable) → void
    return super.{col::ListBase::setAll}(index, iterable);
  synthetic mixin-super-stub get reversed() → core::Iterable<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::reversed};
  synthetic mixin-super-stub method toString() → core::String
    return super.{col::ListBase::toString}();
}

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