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

/*member: main:[null]*/
main() {
  generativeConstructorCall();
  factoryConstructorCall2();
  factoryConstructorCall3();
  classWithFinalFieldInitializer();
  classWithNonFinalFieldInitializer();
  classWithExplicitFieldInitializer();
  classWithFieldInitializerInBody();
  classWithNullNoFieldInitializerInBody();
  classWithNullFieldInitializerInBody();
  classWithNullMaybeFieldInitializerInBody();
  classWithNullFinalFieldInitializer();
}

////////////////////////////////////////////////////////////////////////////////
/// Call default constructor of a field-less class.
////////////////////////////////////////////////////////////////////////////////

/*member: Class1.:[exact=Class1]*/
class Class1 {}

/*member: generativeConstructorCall:[exact=Class1]*/
generativeConstructorCall() => Class1();

////////////////////////////////////////////////////////////////////////////////
/// Call factory constructor that returns an instance of the same class.
////////////////////////////////////////////////////////////////////////////////

class Class3 {
  /*member: Class3.:[exact=Class3]*/
  factory Class3() => Class3.named();
  /*member: Class3.named:[exact=Class3]*/
  Class3.named();
}

/*member: factoryConstructorCall2:[exact=Class3]*/
factoryConstructorCall2() => Class3();

////////////////////////////////////////////////////////////////////////////////
/// Call factory constructor that returns an instance of another class.
////////////////////////////////////////////////////////////////////////////////

class Class4a {
  /*member: Class4a.:[exact=Class4b]*/
  factory Class4a() => Class4b();
}

/*member: Class4b.:[exact=Class4b]*/
class Class4b implements Class4a {}

/*member: factoryConstructorCall3:[exact=Class4b]*/
factoryConstructorCall3() => Class4a();

////////////////////////////////////////////////////////////////////////////////
/// Call constructor with final field initialization.
////////////////////////////////////////////////////////////////////////////////

class Class5 {
  final /*member: Class5.field:[exact=JSUInt31]*/ field;

  /*member: Class5.:[exact=Class5]*/
  Class5(this. /*[exact=JSUInt31]*/ field);
}

/*member: classWithFinalFieldInitializer:[exact=Class5]*/
classWithFinalFieldInitializer() => Class5(0);

////////////////////////////////////////////////////////////////////////////////
/// Call constructor with non-final field initialization.
////////////////////////////////////////////////////////////////////////////////

class Class6 {
  var /*member: Class6.field:[exact=JSUInt31]*/ field;

  /*member: Class6.:[exact=Class6]*/
  Class6(this. /*[exact=JSUInt31]*/ field);
}

/*member: classWithNonFinalFieldInitializer:[exact=Class6]*/
classWithNonFinalFieldInitializer() => Class6(0);

////////////////////////////////////////////////////////////////////////////////
/// Call constructor with explicit field initialization.
////////////////////////////////////////////////////////////////////////////////

class Class7 {
  var /*member: Class7.field:[exact=JSUInt31]*/ field;

  /*member: Class7.:[exact=Class7]*/
  Class7(/*[exact=JSUInt31]*/ value) : this.field = value;
}

/*member: classWithExplicitFieldInitializer:[exact=Class7]*/
classWithExplicitFieldInitializer() => Class7(0);

////////////////////////////////////////////////////////////////////////////////
/// Call constructor with field initialization in the constructor body.
////////////////////////////////////////////////////////////////////////////////

class Class8 {
  var /*member: Class8.field:[exact=JSUInt31]*/ field;

  /*member: Class8.:[exact=Class8]*/
  Class8(/*[exact=JSUInt31]*/ value) {
    this. /*update: [exact=Class8]*/ field = value;
  }
}

/*member: classWithFieldInitializerInBody:[exact=Class8]*/
classWithFieldInitializerInBody() => Class8(0);

////////////////////////////////////////////////////////////////////////////////
/// Instance field with `null` initializer and no assignment in the constructor
/// body.
////////////////////////////////////////////////////////////////////////////////

class Class9 {
  var /*member: Class9.field:[null]*/ field = null;

  /*member: Class9.:[exact=Class9]*/
  Class9() {}
}

/*member: classWithNullNoFieldInitializerInBody:[exact=Class9]*/
classWithNullNoFieldInitializerInBody() => Class9();

////////////////////////////////////////////////////////////////////////////////
/// Instance field with `null` initializer and an assignment in the constructor
/// body.
////////////////////////////////////////////////////////////////////////////////

class Class10 {
  var /*member: Class10.field:[exact=JSUInt31]*/ field = null;

  /*member: Class10.:[exact=Class10]*/
  Class10(/*[exact=JSUInt31]*/ value) {
    this. /*update: [exact=Class10]*/ field = value;
  }
}

/*member: classWithNullFieldInitializerInBody:[exact=Class10]*/
classWithNullFieldInitializerInBody() => Class10(0);

////////////////////////////////////////////////////////////////////////////////
/// Instance field with `null` initializer and an assignment in one of the
/// constructor bodies.
////////////////////////////////////////////////////////////////////////////////

class Class11 {
  var /*member: Class11.field:[null|exact=JSUInt31]*/ field = null;

  /*member: Class11.a:[exact=Class11]*/
  Class11.a(/*[exact=JSUInt31]*/ value) {
    this. /*update: [exact=Class11]*/ field = value;
  }

  /*member: Class11.b:[exact=Class11]*/
  Class11.b() {}
}

/*member: classWithNullMaybeFieldInitializerInBody:[exact=Class11]*/
classWithNullMaybeFieldInitializerInBody() {
  Class11.a(0);
  return Class11.b();
}

////////////////////////////////////////////////////////////////////////////////
/// Final instance field with `null` initializer.
////////////////////////////////////////////////////////////////////////////////

class Class12 {
  final /*member: Class12.field:[null]*/ field = null;

  /*member: Class12.:[exact=Class12]*/
  Class12();
}

/*member: classWithNullFinalFieldInitializer:[exact=Class12]*/
classWithNullFinalFieldInitializer() {
  return Class12();
}
