library;
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, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try
      try {
        #L1:
        {
          {
            asy::Stream<dynamic>* :stream = d as{TypeError,ForDynamic} 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, :async_op) in null;
                if(_in::unsafeCast<core::bool>(:result)) {
                  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} 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, :async_op) in null;
                :result;
              }
          }
        }
        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 dynamic catch(final dynamic e) {
      rethrow;
    }
  }
  on dynamic catch(final dynamic 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 dynamic catch(final dynamic 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
}
