// 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.

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