library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:async" as asy;
import "dart:_internal" as _in;

static method foo() → dynamic {
  try {
    return;
  }
  finally {
    core::print("Hello from finally block!");
  }
}
static method bar(dynamic d) → dynamic /* originally async* */ {
  asy::_AsyncStarStreamController<dynamic>? :controller;
  dynamic :controller_stream;
  (dynamic) → dynamic :async_op_then;
  (core::Object, core::StackTrace) → dynamic :async_op_error;
  core::int :await_jump_var = 0;
  dynamic :await_ctx_var;
  dynamic :saved_try_context_var0;
  dynamic :saved_try_context_var1;
  dynamic :saved_try_context_var2;
  dynamic :exception0;
  dynamic :stack_trace0;
  function :async_op(dynamic :result_or_exception, dynamic :stack_trace) → dynamic yielding 
    try
      try {
        #L1:
        {
          {
            asy::Stream<dynamic> :stream = d as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Stream<dynamic>;
            asy::_StreamIterator<dynamic>? :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
            try
              #L2:
              while (true) {
                dynamic #t1 = asy::_asyncStarMoveNextHelper(:stream);
                [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future<core::bool>}, :async_op_then, :async_op_error) in null;
                if(_in::unsafeCast<core::bool>(:result_or_exception)) {
                  dynamic x = :for-iterator.{asy::_StreamIterator::current}{dynamic};
                  {
                    if(:controller.{asy::_AsyncStarStreamController::add}(x){(dynamic) → core::bool})
                      return null;
                    else
                      [yield] null;
                    if(:controller.{asy::_AsyncStarStreamController::addStream}(x as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Stream<dynamic>){(asy::Stream<dynamic>) → core::bool})
                      return null;
                    else
                      [yield] null;
                  }
                }
                else
                  break #L2;
              }
            finally
              if(!(:for-iterator.{asy::_StreamIterator::_subscription}{asy::StreamSubscription<dynamic>?} == null)) {
                [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(){() → asy::Future<dynamic>}, :async_op_then, :async_op_error) in null;
                :result_or_exception;
              }
          }
        }
        return;
      }
      on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
        :controller.{asy::_AsyncStarStreamController::addError}(exception, stack_trace){(core::Object, core::StackTrace) → void};
      }
    finally {
      :controller.{asy::_AsyncStarStreamController::close}(){() → dynamic};
    }
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :controller = new asy::_AsyncStarStreamController::•<dynamic>(:async_op);
  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream}{asy::Stream<dynamic>};
  return :controller_stream;
}
static method main() → dynamic {
  do {
    core::print("Hello from do-while!");
  }
  while (false)
  do {
    void x = core::print("Hello from do-while!");
  }
  while (false)
  {
    core::Iterator<core::String> :sync-for-iterator = core::_GrowableList::_literal1<core::String>("Hello from for-in!").{core::Iterable::iterator}{core::Iterator<core::String>};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
      core::String s = :sync-for-iterator.{core::Iterator::current}{core::String};
      {
        core::print(s);
      }
    }
  }
  {
    core::Iterator<core::String> :sync-for-iterator = core::_GrowableList::_literal1<core::String>("Hello from for-in without block!").{core::Iterable::iterator}{core::Iterator<core::String>};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
      core::String s = :sync-for-iterator.{core::Iterator::current}{core::String};
      core::print(s);
    }
  }
  dynamic s;
  {
    core::Iterator<dynamic> :sync-for-iterator = core::_GrowableList::_literal1<dynamic>("Hello from for-in without decl!").{core::Iterable::iterator}{core::Iterator<dynamic>};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
      final dynamic #t4 = :sync-for-iterator.{core::Iterator::current}{dynamic};
      {
        s = #t4;
        core::print(s);
      }
    }
  }
  {
    core::Iterator<dynamic> :sync-for-iterator = core::_GrowableList::_literal1<dynamic>("Hello from for-in without decl and block!").{core::Iterable::iterator}{core::Iterator<dynamic>};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
      final dynamic #t5 = :sync-for-iterator.{core::Iterator::current}{dynamic};
      {
        s = #t5;
        core::print(s);
      }
    }
  }
  core::print("Hello from labeled statement!");
  try {
    try {
      throw "Hello from rethrow!";
    }
    on core::Object catch(final core::Object e) {
      rethrow;
    }
  }
  on core::Object catch(final core::Object e) {
    core::print(e);
  }
  self::foo();
  core::bool done = false;
  while (!done) {
    done = true;
    core::print("Hello from while!");
  }
  ;
  assert(true);
  assert(true, "Hello from assert!");
  try {
    assert(false, "Hello from assert!");
  }
  on core::Object catch(final core::Object e) {
    core::print(e);
  }
  #L3:
  switch(1) {
    #L4:
    case #C1:
    case #C2:
      {
        core::print("Hello from switch case!");
        break #L3;
      }
    #L5:
    default:
      {
        break #L3;
      }
  }
  #L6:
  switch(4) {
    #L7:
    case #C2:
      {
        core::print("Hello from case 2!");
        break #L6;
      }
    #L8:
    case #C1:
      {
        core::print("Hello from case 1!");
        continue #L7;
      }
    #L9:
    case #C3:
      {
        core::print("Hello from case 0!");
        continue #L8;
      }
    #L10:
    case #C4:
      {
        core::print("Hello from case 4!");
        continue #L11;
      }
    #L11:
    default:
      {
        continue #L9;
      }
  }
  #L12:
  switch(4) {
    #L13:
    case #C1:
      {
        core::print("Hello from next case 1");
        break #L12;
      }
    #L14:
    default:
      {
        continue #L13;
      }
  }
  core::int i = 0;
  #L15:
  do
    #L16:
    {
      core::print("Hello from do-while!");
      if((i = i.{core::num::+}(1){(core::num) → core::int}).{core::num::<}(3){(core::num) → core::bool})
        break #L16;
      break #L15;
    }
  while (true)
  i = 0;
  #L17:
  while (true)
    #L18:
    {
      core::print("Hello from while!");
      if((i = i.{core::num::+}(1){(core::num) → core::int}).{core::num::<}(3){(core::num) → core::bool})
        break #L18;
      break #L17;
    }
}

constants  {
  #C1 = 1
  #C2 = 2
  #C3 = 0
  #C4 = 4
}
