// Copyright (c) 2017, 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.

// The identifiers listed below are mentioned in the grammar, but none of
// them is a reserved word or a built-in identifier. Such an identifier can
// be used just like all other identifiers, with the exceptions mentioned
// below. Here are said 'known' identifiers:
//
//   `async`, `await`, `hide`, `of`, `on`, `show`, `sync`, `yield`
//
// The following exceptions apply:
//
//   It is a compile-time error to use `await` or `yield` as an identifier in
//   the body of a function marked `async`, `async*`, or `sync*`.
//
//   It is a compile-time error if an asynchronous for-in appears inside a
//   synchronous function.

import 'dart:async';

Future<int> f1() async {
  // Allowed:
  int async = 1;
  int await = 1;
  //  ^^^^^
  // [analyzer] SYNTACTIC_ERROR.ASYNC_KEYWORD_USED_AS_IDENTIFIER
  // [cfe] 'await' can't be used as an identifier in 'async', 'async*', or 'sync*' methods.
  int yield = 1;
  //  ^^^^^
  // [analyzer] SYNTACTIC_ERROR.ASYNC_KEYWORD_USED_AS_IDENTIFIER
  // [cfe] 'yield' can't be used as an identifier in 'async', 'async*', or 'sync*' methods.

  Stream<int> s = new Stream<int>.fromFuture(new Future<int>.value(1));
  await for (int i in s) {
    return i + 1;
  }
}

Stream<int> f2() async* {
  int async = 1;
  int await = 1;
  //  ^^^^^
  // [analyzer] SYNTACTIC_ERROR.ASYNC_KEYWORD_USED_AS_IDENTIFIER
  // [cfe] 'await' can't be used as an identifier in 'async', 'async*', or 'sync*' methods.
  int yield = 1;
  //  ^^^^^
  // [analyzer] SYNTACTIC_ERROR.ASYNC_KEYWORD_USED_AS_IDENTIFIER
  // [cfe] 'yield' can't be used as an identifier in 'async', 'async*', or 'sync*' methods.

  Stream<int> s = new Stream<int>.fromFuture(new Future<int>.value(1));
  await for (var i in s) {
    yield i + 1;
  }
}

Iterable<int> f3() sync* {
  int async = 1;
  int await = 1;
  //  ^^^^^
  // [analyzer] SYNTACTIC_ERROR.ASYNC_KEYWORD_USED_AS_IDENTIFIER
  // [cfe] 'await' can't be used as an identifier in 'async', 'async*', or 'sync*' methods.
  int yield = 1;
  //  ^^^^^
  // [analyzer] SYNTACTIC_ERROR.ASYNC_KEYWORD_USED_AS_IDENTIFIER
  // [cfe] 'yield' can't be used as an identifier in 'async', 'async*', or 'sync*' methods.

  Stream<int> s = new Stream<int>.fromFuture(new Future<int>.value(1));
  await for (int i in s) {
  //               ^^
  // [analyzer] COMPILE_TIME_ERROR.ASYNC_FOR_IN_WRONG_CONTEXT
  // [cfe] The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
    yield i + 1;
  }
}

int f4() {
  int async = 1;
  int await = 1;
  int yield = 1;

  Stream s = new Stream<int>.fromFuture(new Future<int>.value(1));
  await for (int i in s) {
  //               ^^
  // [analyzer] COMPILE_TIME_ERROR.ASYNC_FOR_IN_WRONG_CONTEXT
  // [cfe] The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
    return i + 1;
  }

}

main() {
  Future<int> f = f1();
  Stream s = f2();
  Iterable<int> i = f3();
  int x = f4();
}
