/*
 * Copyright (c) 2018, 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.
 */
/**
 * @assertion  For set literals with element type T, the static type is always
 * Set<T>, but static analysis will reject an assignment of a non-constant set
 * literal to a type that is not a super-type of LinkedHashSet<T> (an implicit
 * down-cast below the type LinkedHashSet<T>), and of a constant set literal to
 * a type that is not a super-type of Set<T> (that is, any implicit down-cast).
 *
 * @description Check that static analysis will reject an assignment of a
 * non-constant set literal to a type that is not a super-type of
 * LinkedHashSet<T>
 * @author sgrekhov@unipro.ru
 */
import "dart:collection";

class C<T> with SetMixin<T> implements LinkedHashSet<T> {


  factory C({bool equals(T e1, T e2),
    int hashCode(T e),
    bool isValidKey(potentialKey)}) {}

  @override
  bool add(T value) {
    // TODO: implement add
    return null;
  }

  @override
  T lookup(Object element) {
    // TODO: implement lookup
    return null;
  }

  @override
  bool remove(Object value) {
    // TODO: implement remove
    return null;
  }

  @override
  bool contains(Object element) {
    // TODO: implement contains
    return null;
  }

  @override
  Set<T> toSet() {
    // TODO: implement toSet
    return null;
  }

  @override
  // TODO: implement iterator
  Iterator<T> get iterator => null;

  @override
  // TODO: implement length
  int get length => null;
}

main() {
  C<int> c = <int> {};                        //# 01: compile-time error
  C<int> c = {3, 1, 4,};                      //# 02: compile-time error
  C c = {3, 1, 4,};                           //# 03: compile-time error
  dynamic d;
  C c = {3, 1, 4,null, d};                    //# 04: compile-time error
}
