/*
 * Copyright (c) 2011, 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 classDefinition:
 *   metadata abstract? class identifier typeParameters? (superclass mixins?)?
 * interfaces? ‘{’ (metadata classMemberDefinition)* ‘}’ |
 *   metadata abstract? class mixinApplicationClass
 * ;
 * .  .  .
 * classMemberDefinition:
 *   declaration ';' |
 *   methodSignature functionBody
 * ;
 * .  .  .
 * declaration:
 *   constantConstructorSignature (redirection | initializers)? |
 *   constructorSignature (redirection | initializers)? |
 *   external constantConstructorSignature |
 *   external constructorSignature |
 *   (external static?)? getterSignature |
 *   (external static?)? setterSignature |
 *   external? operatorSignature |
 *   (external static?)? functionSignature |
 *   static (final | const) type? staticFinalDeclarationList |
 *   final type? initializedIdentifierList |
 *   static? (var | type) initializedIdentifierList
 * ;
 * staticFinalDeclarationList:
 *   staticFinalDeclaration (', ' staticFinalDeclaration)*
 * ;
 * staticFinalDeclaration:
 *   identifier '=' expression
 * ;
 * @description Checks that various class member declarations that are valid
 * according to this syntax do not cause any errors and such class can be
 * instantiated.
 * @author kaigorodov
 * @reviewer rodionov
 */

class A {
  const A(): this.anotherConstructor();
  const A.anotherConstructor();
  static final x = 1, y = 2;
  static final int z = 3;
  static const x1 = 1, y1 = 2;
  static const int z1 = 3;
}

class B {
  const B();
  B.anotherConstructor(): this.oneMoreConstructor();
  B.oneMoreConstructor() {}
  static var initialized = 1;
  static int initialized2 = 2;
}

class C {
  const C(): x = 1;
  final x;
  final int x1=-1;
}

class D {
  D();
  D.name() : a = 2;
  var x, y = 2, z;
  int a = 1;
  static int? typed;
  static var untyped;
}

class E {
  E(): this.D();
  E.D();
  static var nonInitialized;
}

class F {
  F(): x = 1, y = 2;
  var x, y;
  int? x1, y1;
  var x2=2, y3=2;
}

abstract class Abstract {
  func();
  funcWithParams(p1, p2);
  funcWithOptionalParams([p1 = 1, p2 = 2]);
  funcWithOptionalParams2({p1: 1, p2: 2});
  get val;
  set val(var v);
  operator ==(dynamic other);

  var _val;
}

class Concrete extends Abstract {
  func() {}
  funcWithParams(p1, p2) {}
  funcWithOptionalParams([p1 = 1, p2 = 2]) {}
  funcWithOptionalParams2({p1: 1, p2: 2}) {}
  get val => _val;
  set val(var v) {_val = v;}
  operator ==(dynamic other) {return identical(this, other);}
}

main() {
  A a = const A();
  B b = new B();
  C c = const C();
  D d = new D();
  E e = new E();
  F f = new F();
  Abstract abst = new Concrete();
}
