/*
 * Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 * for details. All rights reserved. Use of this source code is governed by a
 * BSD-style license that can be found in the LICENSE file.
 */
/**
 * @assertion Functions include function declarations, methods, getters,
 * setters, constructors and function literals.
 * All functions have a signature and a body.
 * functionSignature:
 *   metadata returnType? identifier formalParameterList
 * ;
 * returnType: void | type
 * ;
 * functionBody:
 *   async? '=>' expression ';' | (async | async* | sync*)? block
 * ;
 * block:
 *   '{' statements '}'
 * ;
 *
 * @description Checks that any specified statement can be in a body
 * of a function of the form [functionSignature '{' statements '}']
 *
 * @author msyabro
 */

class A {}

main() {
  //Blocks
  f_blocks() { {} }
  g_blocks() { int x; { int y; } }

  //Expression statements
  f_expression() { 2 + 3; }
  g_expression() { "string"; }
  h_expression() { ; }

  //Variable declaration
  f_declaration() { int x; }
  g_declaration() { A a; }

  //If
  f_if() { if (1 > 0) { true; } }
  g_if() { if (1 > 0) { true; } else { false; } }

  //For
  f_for() { for (int i = 0; i < 100; i++) { i--; } }
  g_for() { for (int i in [1, 2, 3, 4, 5]); }

  //While
  f_while() { while (true) true; }

  //Do
  f_do() {do f_blocks(); while (true);}

  //Switch
  f_switch() {
    switch (1 + 1) {
      case 1:
        false;
        break;
      case 2:
        true;
        break;
      default:
        false;
        break;
    }
  }

  //Try
  f_try() { try {} catch (e) {} }
  g_try() { try { throw "exception"; } on String catch (s) {} finally {} }

  //Return
  f_return() { return 1; }

  //Labels
  f_label() { label: int x; }

  //Break
  f_break() { while (true) { break; } }
  g_break() { label: while (true) { break label; } }

  //Continue
  f_continue() { while (true) continue; }
  g_continue() { label: while (true) continue label; }

  //Throw
  f_throw() { throw ""; }

  //Assert
  f_assert() { assert(true); }
}
