/*
 * 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
 * ;
 * methodSignature:
 *   constructorSignature initializers? |
 *   factoryConstructorSignature |
 *   static? functionSignature |
 *   static? getterSignature |
 *   static? setterSignature |
 *   operatorSignature
 * ;
 * @description Checks that various class member method definitions which are
 * valid according to this syntax do not cause any errors and such class can 
 * be instantiated. 
 * @author msyabro
 */

class A {
  @B(1) factory A.f() {
    return new C();
  }
  @A() const A():_x = 0;
  @A() A.B():_x = 2;
  @B(1) A.C(): _x = 1 {}

  @A() static fun() {}
  @B(1) get x {}
  @A() set x(var v) {}
  @B(1) operator ==(dynamic other) => true;

  @A() final _x;
}

class B {
  @B(1) const B(this.y);
  @A() final y;
}

class C extends A {}

main() {
  A a = new A();
  A ab = new A.B();
  A i = new A.f();
  B b = new B(2);
}
