library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "package:expect/expect.dart" as exp;

import "package:expect/expect.dart";

static const field core::int firstVar = #C1;
static const field core::int firstCatchVar = #C2;
static const field core::bool isEmptyVar = #C3;
static const field core::bool isNotEmptyVar = #C4;
static const field core::int lastVar = #C5;
static const field core::int lastCatchVar = #C2;
static const field core::int lengthVar = #C5;
static const field core::int singleVar = #C1;
static const field core::int singleCatchVar = #C2;
static const field core::int singleCatchVar2 = #C2;
static const field core::int getWithIndexVar = #C1;
static const field core::int rangeErrorCatchVar = #C2;
static const field core::List<core::int> mutableListVar = #C6;
static const field core::List<core::int> mutableListAddVar = #C8;
static method firstFn() → core::int {
  return (#C6).{core::Iterable::first};
}
static method firstCatchFn() → core::int {
  try {
    core::int v = (#C9).{core::Iterable::first};
  }
  on core::StateError catch(no-exception-var) {
    return 0;
  }
  return 1;
}
static method isEmptyFn() → core::bool {
  return (#C6).{core::Iterable::isEmpty};
}
static method isNotEmptyFn() → core::bool {
  return (#C6).{core::Iterable::isNotEmpty};
}
static method lastFn() → core::int {
  return (#C6).{core::Iterable::last};
}
static method lastCatchFn() → core::int {
  try {
    core::int v = (#C9).{core::Iterable::last};
  }
  on core::StateError catch(no-exception-var) {
    return 0;
  }
  return 1;
}
static method lengthFn() → core::int {
  return (#C6).{core::List::length};
}
static method singleFn() → core::int {
  return (#C10).{core::Iterable::single};
}
static method singleCatchFn() → core::int {
  try {
    core::int v = (#C9).{core::Iterable::single};
  }
  on core::StateError catch(no-exception-var) {
    return 0;
  }
  return 1;
}
static method singleCatchFn2() → core::int {
  try {
    core::int v = (#C6).{core::Iterable::single};
  }
  on core::StateError catch(no-exception-var) {
    return 0;
  }
  return 1;
}
static method getWithIndexFn() → core::int {
  return (#C10).{core::List::[]}(0);
}
static method rangeErrorCatchFn() → core::int {
  try {
    core::int v = (#C10).{core::List::[]}(1);
  }
  on core::RangeError catch(no-exception-var) {
    return 0;
  }
  return 1;
}
static method mutableList() → core::List<core::int> {
  core::List<core::int> x = core::_GrowableList::_literal2<core::int>(1, 2);
  return x;
}
static method mutableListAdd() → core::List<core::int> {
  core::List<core::int> x = core::_GrowableList::_literal2<core::int>(1, 2);
  x.{core::List::add}(3);
  return x;
}
static method main() → void {
  exp::Expect::equals(#C1, 1);
  exp::Expect::equals(#C2, 0);
  exp::Expect::equals(#C3, false);
  exp::Expect::equals(#C4, true);
  exp::Expect::equals(#C5, 2);
  exp::Expect::equals(#C2, 0);
  exp::Expect::equals(#C5, 2);
  exp::Expect::equals(#C1, 1);
  exp::Expect::equals(#C2, 0);
  exp::Expect::equals(#C2, 0);
  exp::Expect::equals(#C1, 1);
  exp::Expect::equals(#C2, 0);
  exp::Expect::equals(#C6, #C6);
  exp::Expect::equals(#C8, #C8);
}

constants  {
  #C1 = 1
  #C2 = 0
  #C3 = false
  #C4 = true
  #C5 = 2
  #C6 = <core::int*>[#C1, #C5]
  #C7 = 3
  #C8 = <core::int*>[#C1, #C5, #C7]
  #C9 = <core::int*>[]
  #C10 = <core::int*>[#C1]
}
