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

// test w/ `pub run test -N prefer_const_constructors`


/// Inlined for testing.
library meta;

class _Literal {
  const _Literal();
}

const _Literal literal = _Literal();

class A {
  const A({A parent});
  const A.a();
}

void accessA_0() {
  A a = A(); // LINT
  A a1 = A( // LINT
    parent: A.a(), // LINT
  );
}

void accessA_1() {
  A a = new A(); // LINT
}

void accessA_2() {
  A a = const A(); // OK
}

class B {
  B();
}

void accessB() {
  B b = new B(); // OK
}

class C {
  final int x;

  const C(this.x);
}

C foo(int x) => new C(x); // OK
C bar() => const C(5); // OK
C baz() => new C(5); // LINT

void objectId() {
  Object id = new Object(); // OK
}

class E {
  final String s;

  const E(this.s);

  static E m1(int i) => new E('$i'); // OK
  static E m2() => new E('adjacent' 'string'); // LINT
  static E m3(int i) => new E('adjacent' '$i'); // OK
  static E m4(String s) => new E(s); // OK
  static void m5() {
    final String s = '';
    E e = new E(s); // OK
  }
}

class F {
  final List<F> l;

  const F(this.l);

  static F m1() => new F(null); // LINT
  static F m2(List<F> l) => new F(l); // OK
  static F m3(F f) => new F([f]); // OK
}

class G {
  final Map<G, G> m;

  const G(this.m);

  static G m1() => new G(null); // LINT
  static G m2(Map<G, G> m) => new G(m); // OK
  static G m3(G g) => new G({g: g}); // OK
}

// optional new : https://github.com/dart-lang/linter/issues/995
class H {}
class I {
  final H foo;
  const I({this.foo});

  I makeI() => I(foo: H()); // OK
}

class J<T> {
  const J();
}
void gimmeJ<T>() => new J<T>(); // OK
void gimmeJofString() => new J<String>(); // LINT
void gimmeJofDynamic() => new J<dynamic>(); // LINT

class K {
  @literal
  const K();
}

k() {
  var kk = K(); // OK (handled by analyzer hint)
}
