library;
import self as self;
import "dart:core" as core;
import "cache_lookups_lib.dart" as cac;

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

class Class extends core::Object {
  synthetic constructor •() → self::Class
    : super core::Object::•()
    ;
  get field() → core::int {
    self::counter = self::counter.{core::num::+}(1){(core::num) → core::int};
    return 42;
  }
}
static field core::int counter = 0;
static method test(dynamic o) → dynamic {
  #L1:
  {
    final synthesized dynamic #0#0 = o;
    synthesized core::int #0#2;
    synthesized core::bool #0#2#isSet = false;
    synthesized core::bool #0#10;
    synthesized core::bool #0#10#isSet = false;
    synthesized dynamic #0#12;
    synthesized core::bool #0#12#isSet = false;
    synthesized dynamic #0#13;
    synthesized core::bool #0#13#isSet = false;
    {
      if(#0#0 is self::Class && #C1 =={core::num::==}{(core::Object) → core::bool} (#0#2#isSet ?{core::int} #0#2{core::int} : let final dynamic #t1 = #0#2#isSet = true in #0#2 = #0#0{self::Class}.{self::Class::field}{core::int}) || #0#0 is self::Class && #C2 =={core::num::==}{(core::Object) → core::bool} (#0#2#isSet ?{core::int} #0#2{core::int} : let final dynamic #t2 = #0#2#isSet = true in #0#2 = #0#0{self::Class}.{self::Class::field}{core::int})) {
        {
          core::print("Class");
          break #L1;
        }
      }
    }
    {
      hoisted core::int a;
      if(#0#0 is core::List<dynamic> && (#0#10#isSet ?{core::bool} #0#10{core::bool} : let final dynamic #t3 = #0#10#isSet = true in #0#10 = #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3) && ((#0#12#isSet ?{dynamic} #0#12{dynamic} : let final dynamic #t4 = #0#12#isSet = true in #0#12 = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic}) is core::int && (let final dynamic #t5 = a = (#0#12#isSet ?{dynamic} #0#12{dynamic} : let final dynamic #t6 = #0#12#isSet = true in #0#12 = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic}) as{Unchecked} core::int in true)) && #C2 =={core::num::==}{(core::Object) → core::bool} (#0#13#isSet ?{dynamic} #0#13{dynamic} : let final dynamic #t7 = #0#13#isSet = true in #0#13 = #0#0{core::List<dynamic>}.{core::List::[]}(1){(core::int) → dynamic}) || #0#0 is core::List<dynamic> && (#0#10#isSet ?{core::bool} #0#10{core::bool} : let final dynamic #t8 = #0#10#isSet = true in #0#10 = #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3) && ((#0#12#isSet ?{dynamic} #0#12{dynamic} : let final dynamic #t9 = #0#12#isSet = true in #0#12 = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic}) is core::int && (let final dynamic #t10 = a = (#0#12#isSet ?{dynamic} #0#12{dynamic} : let final dynamic #t11 = #0#12#isSet = true in #0#12 = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic}) as{Unchecked} core::int in true)) && #C3 =={core::num::==}{(core::Object) → core::bool} (#0#13#isSet ?{dynamic} #0#13{dynamic} : let final dynamic #t12 = #0#13#isSet = true in #0#13 = #0#0{core::List<dynamic>}.{core::List::[]}(1){(core::int) → dynamic})) {
        {
          core::print("List");
        }
      }
    }
  }
}
static method main() → dynamic {
  self::expect(0, self::counter);
  self::test(null);
  self::expect(0, self::counter);
  self::test(new self::Class::•());
  self::expect(1, self::counter);
  self::test(new cac::CustomList::•<core::int>(<core::int>[0, 1]));
  self::expect(2, self::counter);
  self::test(new cac::CustomList::•<core::int>(<core::int>[0, 2]));
  self::expect(3, self::counter);
  self::test(new cac::CustomList::•<core::int>(<core::int>[0, 3]));
  self::expect(4, self::counter);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}

library;
import self as cac;
import "dart:core" as core;
import "cache_lookups.dart" as self;
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 cac::_CustomList&Object&ListMixin<cac::CustomList::E%> {
  final field core::List<cac::CustomList::E%> list;
  constructor •(core::List<cac::CustomList::E%> list) → cac::CustomList<cac::CustomList::E%>
    : cac::CustomList::list = list, super cac::_CustomList&Object&ListMixin::•()
    ;
  get length() → core::int {
    self::counter = self::counter.{core::num::+}(1){(core::num) → core::int};
    return this.{cac::CustomList::list}{core::List<cac::CustomList::E%>}.{core::List::length}{core::int};
  }
  set length(core::int value) → void {
    this.{cac::CustomList::list}{core::List<cac::CustomList::E%>}.{core::List::length} = value;
  }
  operator [](core::int index) → cac::CustomList::E%
    return this.{cac::CustomList::list}{core::List<cac::CustomList::E%>}.{core::List::[]}(index){(core::int) → cac::CustomList::E%};
  operator []=(core::int index, covariant-by-class cac::CustomList::E% value) → void {
    this.{cac::CustomList::list}{core::List<cac::CustomList::E%>}.{core::List::[]=}(index, value){(core::int, cac::CustomList::E%) → void};
  }
}
abstract class _CustomList&Object&ListMixin<E extends core::Object? = dynamic> = core::Object with col::ListBase<cac::_CustomList&Object&ListMixin::E%> /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → cac::_CustomList&Object&ListMixin<cac::_CustomList&Object&ListMixin::E%>
    : super core::Object::•()
    ;
  synthetic mixin-super-stub get first() → cac::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::first};
  synthetic mixin-super-stub set first(covariant-by-class cac::_CustomList&Object&ListMixin::E% value) → void
    return super.{col::ListBase::first} = value;
  synthetic mixin-super-stub get last() → cac::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::last};
  synthetic mixin-super-stub set last(covariant-by-class cac::_CustomList&Object&ListMixin::E% value) → void
    return super.{col::ListBase::last} = value;
  synthetic mixin-super-stub get iterator() → core::Iterator<cac::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::iterator};
  synthetic mixin-super-stub method elementAt(core::int index) → cac::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::elementAt}(index);
  synthetic mixin-super-stub method followedBy(covariant-by-class core::Iterable<cac::_CustomList&Object&ListMixin::E%> other) → core::Iterable<cac::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::followedBy}(other);
  synthetic mixin-super-stub method forEach((cac::_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() → cac::_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((cac::_CustomList&Object&ListMixin::E%) → core::bool test) → core::bool
    return super.{col::ListBase::every}(test);
  synthetic mixin-super-stub method any((cac::_CustomList&Object&ListMixin::E%) → core::bool test) → core::bool
    return super.{col::ListBase::any}(test);
  synthetic mixin-super-stub method firstWhere((cac::_CustomList&Object&ListMixin::E%) → core::bool test, {covariant-by-class () →? cac::_CustomList&Object&ListMixin::E% orElse = #C4}) → cac::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::firstWhere}(test, orElse: orElse);
  synthetic mixin-super-stub method lastWhere((cac::_CustomList&Object&ListMixin::E%) → core::bool test, {covariant-by-class () →? cac::_CustomList&Object&ListMixin::E% orElse = #C4}) → cac::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::lastWhere}(test, orElse: orElse);
  synthetic mixin-super-stub method singleWhere((cac::_CustomList&Object&ListMixin::E%) → core::bool test, {covariant-by-class () →? cac::_CustomList&Object&ListMixin::E% orElse = #C4}) → cac::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::singleWhere}(test, orElse: orElse);
  synthetic mixin-super-stub method join([core::String separator = #C5]) → core::String
    return super.{col::ListBase::join}(separator);
  synthetic mixin-super-stub method where((cac::_CustomList&Object&ListMixin::E%) → core::bool test) → core::Iterable<cac::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::where}(test);
  synthetic mixin-super-stub method whereType<T extends core::Object? = dynamic>() → core::Iterable<cac::_CustomList&Object&ListMixin::whereType::T%>
    return super.{col::ListBase::whereType}<cac::_CustomList&Object&ListMixin::whereType::T%>();
  synthetic mixin-super-stub method map<T extends core::Object? = dynamic>((cac::_CustomList&Object&ListMixin::E%) → cac::_CustomList&Object&ListMixin::map::T% f) → core::Iterable<cac::_CustomList&Object&ListMixin::map::T%>
    return super.{col::ListBase::map}<cac::_CustomList&Object&ListMixin::map::T%>(f);
  synthetic mixin-super-stub method expand<T extends core::Object? = dynamic>((cac::_CustomList&Object&ListMixin::E%) → core::Iterable<cac::_CustomList&Object&ListMixin::expand::T%> f) → core::Iterable<cac::_CustomList&Object&ListMixin::expand::T%>
    return super.{col::ListBase::expand}<cac::_CustomList&Object&ListMixin::expand::T%>(f);
  synthetic mixin-super-stub method reduce(covariant-by-class (cac::_CustomList&Object&ListMixin::E%, cac::_CustomList&Object&ListMixin::E%) → cac::_CustomList&Object&ListMixin::E% combine) → cac::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::reduce}(combine);
  synthetic mixin-super-stub method fold<T extends core::Object? = dynamic>(cac::_CustomList&Object&ListMixin::fold::T% initialValue, (cac::_CustomList&Object&ListMixin::fold::T%, cac::_CustomList&Object&ListMixin::E%) → cac::_CustomList&Object&ListMixin::fold::T% combine) → cac::_CustomList&Object&ListMixin::fold::T%
    return super.{col::ListBase::fold}<cac::_CustomList&Object&ListMixin::fold::T%>(initialValue, combine);
  synthetic mixin-super-stub method skip(core::int count) → core::Iterable<cac::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::skip}(count);
  synthetic mixin-super-stub method skipWhile((cac::_CustomList&Object&ListMixin::E%) → core::bool test) → core::Iterable<cac::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::skipWhile}(test);
  synthetic mixin-super-stub method take(core::int count) → core::Iterable<cac::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::take}(count);
  synthetic mixin-super-stub method takeWhile((cac::_CustomList&Object&ListMixin::E%) → core::bool test) → core::Iterable<cac::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::takeWhile}(test);
  synthetic mixin-super-stub method toList({core::bool growable = #C6}) → core::List<cac::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::toList}(growable: growable);
  synthetic mixin-super-stub method toSet() → core::Set<cac::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::toSet}();
  synthetic mixin-super-stub method add(covariant-by-class cac::_CustomList&Object&ListMixin::E% element) → void
    return super.{col::ListBase::add}(element);
  synthetic mixin-super-stub method addAll(covariant-by-class core::Iterable<cac::_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((cac::_CustomList&Object&ListMixin::E%) → core::bool test) → void
    return super.{col::ListBase::removeWhere}(test);
  synthetic mixin-super-stub method retainWhere((cac::_CustomList&Object&ListMixin::E%) → core::bool test) → void
    return super.{col::ListBase::retainWhere}(test);
  synthetic mixin-super-stub method col::_filter((cac::_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<cac::_CustomList&Object&ListMixin::cast::R%>
    return super.{col::ListBase::cast}<cac::_CustomList&Object&ListMixin::cast::R%>();
  synthetic mixin-super-stub method removeLast() → cac::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::removeLast}();
  synthetic mixin-super-stub method sort([(cac::_CustomList&Object&ListMixin::E%, cac::_CustomList&Object&ListMixin::E%) →? core::int compare = #C4]) → void
    return super.{col::ListBase::sort}(compare);
  synthetic mixin-super-stub method shuffle([math::Random? random = #C4]) → void
    return super.{col::ListBase::shuffle}(random);
  synthetic mixin-super-stub method asMap() → core::Map<core::int, cac::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::asMap}();
  synthetic mixin-super-stub operator +(covariant-by-class core::List<cac::_CustomList&Object&ListMixin::E%> other) → core::List<cac::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::+}(other);
  synthetic mixin-super-stub method sublist(core::int start, [core::int? end = #C4]) → core::List<cac::_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<cac::_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 cac::_CustomList&Object&ListMixin::E? fill = #C4]) → 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<cac::_CustomList&Object&ListMixin::E%> iterable, [core::int skipCount = #C1]) → 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<cac::_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 = #C1]) → core::int
    return super.{col::ListBase::indexOf}(element, start);
  synthetic mixin-super-stub method indexWhere((cac::_CustomList&Object&ListMixin::E%) → core::bool test, [core::int start = #C1]) → core::int
    return super.{col::ListBase::indexWhere}(test, start);
  synthetic mixin-super-stub method lastIndexOf(covariant-by-class core::Object? element, [core::int? start = #C4]) → core::int
    return super.{col::ListBase::lastIndexOf}(element, start);
  synthetic mixin-super-stub method lastIndexWhere((cac::_CustomList&Object&ListMixin::E%) → core::bool test, [core::int? start = #C4]) → core::int
    return super.{col::ListBase::lastIndexWhere}(test, start);
  synthetic mixin-super-stub method insert(core::int index, covariant-by-class cac::_CustomList&Object&ListMixin::E% element) → void
    return super.{col::ListBase::insert}(index, element);
  synthetic mixin-super-stub method removeAt(core::int index) → cac::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::removeAt}(index);
  synthetic mixin-super-stub method insertAll(core::int index, covariant-by-class core::Iterable<cac::_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<cac::_CustomList&Object&ListMixin::E%> iterable) → void
    return super.{col::ListBase::setAll}(index, iterable);
  synthetic mixin-super-stub get reversed() → core::Iterable<cac::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::reversed};
  synthetic mixin-super-stub method toString() → core::String
    return super.{col::ListBase::toString}();
}

constants  {
  #C1 = 0
  #C2 = 1
  #C3 = 2
  #C4 = null
  #C5 = ""
  #C6 = true
}
