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

// This test case checks that inference works for spread collections, and that
// the errors are reported when necessary.

/*@testedFeatures=inference*/

Map<K, V> bar<K, V>() => null;

foo(dynamic dynVar) {
  List<int> spread = <int>[1, 2, 3];
  Map<String, int> mapSpread = <String, int>{"foo": 4, "bar": 2};
  int notSpreadInt = 42;
  int Function() notSpreadFunction = null;
  // Note that all values are actually ints.
  Map<int, num> mapIntNum = <int, num>{42: 42};
  List<num> listNum = <num>[42];

  var /*@type=List<dynamic>**/ lhs10 = /*@ typeArgs=dynamic */ [
    ...
    /*@ typeArgs=dynamic */ []
  ];

  var /*@type=Set<dynamic>**/ set10 = <dynamic>{
    ... /*@ typeArgs=dynamic */ []
  };

  var /*@type=Map<dynamic, dynamic>**/ map10 = <dynamic, dynamic>{
    ...
    /*@ typeArgs=dynamic, dynamic */ {}
  };

  var /*@type=Map<dynamic, dynamic>**/ map10ambiguous =
      /*@ typeArgs=dynamic, dynamic */ {
    ... /*@ typeArgs=dynamic, dynamic */ {}
  };

  var /*@type=List<int*>**/ lhs20 = /*@typeArgs=int**/ [...spread];

  var /*@type=Set<int*>**/ set20 = /*@typeArgs=int**/ {...spread, 42};

  var /*@type=Set<int*>**/ set20ambiguous = /*@typeArgs=int**/ {...spread};

  var /*@type=Map<String*, int*>**/ map20 = /*@typeArgs=String*, int**/
      {...mapSpread, "baz": 42};

  var /*@type=Map<String*, int*>**/ map20ambiguous = /*@typeArgs=String*, int**/
      {...mapSpread};

  var /*@type=List<dynamic>**/ lhs21 = /*@ typeArgs=dynamic */ [
    ...(spread as dynamic)
  ];

  var /*@type=Set<dynamic>**/ set21 = /*@ typeArgs=dynamic */ {
    ...(spread as dynamic),
    42
  };

  var /*@type=Map<dynamic, dynamic>**/ map21 = /*@ typeArgs=dynamic, dynamic */
      {...(mapSpread as dynamic), "baz": 42};

  dynamic map21ambiguous = {...(mapSpread as dynamic)};

  List<int> lhs22 = /*@typeArgs=int**/ [... /*@typeArgs=int**/ []];

  Set<int> set22 = /*@typeArgs=int**/ {... /*@typeArgs=int**/ [], 42};

  Set<int> set22ambiguous = /*@typeArgs=int**/ {... /*@typeArgs=int**/ []};

  Map<String, int> map22 = /*@typeArgs=String*, int**/
      {... /*@typeArgs=String*, int**/ {}};

  List<List<int>> lhs23 = /*@typeArgs=List<int*>**/ [
    ... /*@typeArgs=List<int*>**/
    [/*@typeArgs=int**/ []]
  ];

  Set<List<int>> set23 = /*@typeArgs=List<int*>**/ {
    ... /*@typeArgs=List<int*>**/
    [/*@typeArgs=int**/ []],
    <int>[42]
  };

  Set<List<int>> set23ambiguous = /*@typeArgs=List<int*>**/
      {
    ... /*@typeArgs=List<int*>**/ [/*@typeArgs=int**/ []]
  };

  Map<String, List<int>> map23 = /*@typeArgs=String*, List<int*>**/
      {
    ... /*@typeArgs=String*, List<int*>**/ {"baz": /*@typeArgs=int**/ [] }
  };

  dynamic map24ambiguous = {...spread, ...mapSpread};

  int lhs30 = /*@typeArgs=int**/ [...spread];

  int set30 = /*@typeArgs=int**/ {...spread, 42};

  int set30ambiguous = /*@typeArgs=int**/
      {...spread};

  int map30 = /*@typeArgs=String*, int**/
      {...mapSpread, "baz": 42};

  int map30ambiguous = /*@typeArgs=String*, int**/
      {...mapSpread};

  List<dynamic> lhs40 = <dynamic>[...notSpreadInt];

  Set<dynamic> set40 = <dynamic>{...notSpreadInt};

  Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...notSpreadInt};

  List<dynamic> lhs50 = <dynamic>[...notSpreadFunction];

  Set<dynamic> set50 = <dynamic>{...notSpreadFunction};

  Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...notSpreadFunction};

  List<String> lhs60 = <String>[...spread];

  Set<String> set60 = <String>{...spread};

  Map<int, int> map60 = <int, int>{...mapSpread};

  Map<String, String> map61 = <String, String>{...mapSpread};

  List<int> lhs70 = <int>[...null];

  Set<int> set70 = <int>{...null};

  var /*@type=Set<dynamic>**/ set71ambiguous = /*@ typeArgs=dynamic */
      {
    ...null,
    ... /*@ typeArgs=dynamic */
    []
  };

  Map<String, int> map70 = <String, int>{...null};

  List<int> lhs80 = <int>[...?null];

  Set<int> set80 = <int>{...?null};

  var /*@type=Set<dynamic>**/ set81ambiguous = /*@ typeArgs=dynamic */
      {...?null, ... /*@ typeArgs=dynamic */ []};

  Map<String, int> map80 = <String, int>{...?null};

  var /*@type=Map<String*, int*>**/ map90 = <String, int>{
    ... /*@typeArgs=String*, int**/ bar()
  };

  List<int> list100 = <int>[...listNum];

  Map<num, int> map100 = <num, int>{...mapIntNum};

  List<int> list110 = <int>[...dynVar];

  Map<num, int> map110 = <num, int>{...dynVar};
}

main() {}
