library #lib /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class TestAssertInitializer extends core::Object {
  constructor •() → self::TestAssertInitializer
    : super core::Object::•() {}
}
static const field core::bool constTrue = #C1;
static const field core::bool constFalse = #C2;
static const field core::bool constTrue2 = #C1;
static const field core::bool constFalse2 = #C2;
static method foo() → core::bool?
  return null;
static method testSimpleConditions() → void {
  {
    core::print("1_yes");
  }
  {
    core::print("3_yes");
  }
}
static method testAndConditions() → void {
  if((#C1) && self::foo()!) {
    core::print("1_yes");
  }
}
static method testOrConditions() → void {
  {
    core::print("1_yes");
  }
  if((#C2) || self::foo()!) {
    core::print("2_yes");
  }
  {
    core::print("4_yes");
  }
}
static method testNotConditions() → void {
  {
    core::print("2_yes");
  }
}
static method testConditionalExpressions() → dynamic {
  core::print("1_yes");
  core::print("4_yes ${self::foo()}");
}
static method testAsserts() → void {}
static method testRemovalOfStatementBodies() → dynamic {
  if(self::foo()!) {
  }
  while (self::foo()!) {
  }
  do {
  }
  while (self::foo()!)
  for (; ; ) {
  }
  {
    core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal2<core::int>(1, 2).{core::Iterable::iterator}{core::Iterator<core::int>};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
      core::int i = :sync-for-iterator.{core::Iterator::current}{core::int};
    }
  }
  {}
  try {
  }
  on core::Object catch(final core::Object e) {
  }
  {}
  switch(42) {
    #L1:
    case #C3:
      {}
  }
  switch(42) {
    #L2:
    default:
      {}
  }
}
static method main(core::List<core::String> args) → dynamic {
  self::testSimpleConditions();
  self::testAndConditions();
  self::testOrConditions();
  self::testNotConditions();
  self::testConditionalExpressions();
  self::testAsserts();
  new self::TestAssertInitializer::•();
  self::testRemovalOfStatementBodies();
}
constants  {
  #C1 = true
  #C2 = false
  #C3 = 10
}
