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

// @dart = 2.9

import 'package:expect/expect.dart';

// Regression test for badly named generator body.

Future<void> goo(Future Function() f) async {
  Expect.equals(102, (await f()).keys.single);
  Expect.equals(104, (await f()).keys.single);
}

Future<T> identity<T>(T x) async => x;

extension Gloop<T> on Map<T, List<T>> {
  // An async method using a 'complex' generator type `Map<T, List<T>>`.  This
  // requires a separated entry and body, which requires a name, and the name
  // must be legal JavaScript.
  Future<Map<T, List<T>>> foo(int x) async {
    var result = await identity({(x += this.length) as T: <T>[]});
    return result;
  }

  Future<int> bar(int x) async {
    // An async closure using a 'complex' generator type `Map<T, Set<T>>`.  This
    // requires a separated entry and body, which requires a name, and the name
    // must be legal JavaScript.
    await goo(() async => {(x += this.length) as T: <T>{}});
    return x;
  }
}

main() async {
  // Test method.
  Map<int, List<int>> o1 = {1: [], 2: []};
  var o2 = await o1.foo(100);
  var o3 = await o2.foo(100);
  Expect.equals('{102: []}', '$o2');
  Expect.equals('{101: []}', '$o3');

  // Test closure.
  Map<int, List<int>> o = {1: [], 2: []};
  int x = await o.bar(100);
  Expect.equals(104, x);
}
