// 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() {}
