// 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); }
}
