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

import "package:meta/meta.dart" show virtual;

class A {
  get getter1 => null; //# 01: ok
  num get getter2 => null; //# 02: ok
  num get getter3 => null; //# 03: ok
  int get getter4 => null; //# 04: ok
  int get getter5 => null; //# 05: static type warning
  int get getter6 => null; //# 06: ok
  int get getter7 => null; //# 07: static type warning
  int get getter8 => null; //# 08: static type warning

  set setter1(_) => null; //# 21: ok
  void set setter2(_) {} //# 22: ok
  set setter3(_) => null; //# 23: ok
  set setter4(_) => null; //# 24: ok
  set setter5(num _) => null; //# 25: ok
  set setter6(num _) => null; //# 26: ok
  set setter7(int _) => null; //# 27: ok
  set setter8(int _) => null; //# 28: static type warning
  set setter9(int _) => null; //# 29: ok
  set setter10(int _) => null; //# 30: static type warning
  set setter11(int _) => null; //# 31: static type warning

  @virtual int field1; //# 41: ok
  num field2; //# 42: ok
  int field3; //# 43: ok
  int field4; //# 44: static type warning
  int field5; //# 45: ok
  @virtual num field6; //# 46: ok
  num field7; //# 47: static type warning
  num get field8 => null; //# 48: static type warning
  num field9; //# 49: ok
  num field10; //# 50: ok
  set field11(int _) {} //# 51: ok
  void set field12(int _) {} //# 52: ok
  num field13; //# 53: static type warning
  set field14(num _) {} //# 54: static type warning
}

class B extends A {
  num get getter6 => null; //# 06: continued
  set setter9(num _) => null; //# 29: continued
  num field5; //# 45: continued
}

abstract class I {
  num get getter7 => null; //# 07: continued
  String get getter8 => null; //# 08: continued
  int get getter9 => null; //# 09: static type warning
  int get getter10 => null; //# 10: static type warning
  int get getter11 => null; //# 11: static type warning
  set setter10(num _) => null; //# 30: continued
  set setter11(String _) => null; //# 31: continued
  set setter12(int _) => null; //# 32: static type warning
  set setter13(int _) => null; //# 33: static type warning
  set setter13(num _) => null; //# 33a: static type warning
  set setter14(int _) => null; //# 34: static type warning
}

abstract class J {
  String get getter9 => null; //# 09: continued
  num get getter10 => null; //# 10: continued
  num get getter11 => null; //# 11: continued
  set setter12(String _) => null; //# 32: continued
  set setter13(num _) => null; //# 33: continued
  set setter13(int _) => null; //# 33a: continued
  set setter14(num _) => null; //# 34: continued
}

abstract class Class extends B implements I, J {
  get getter1 => null; //# 01: continued
  num get getter2 => null; //# 02: continued
  int get getter3 => null; //# 03: continued
  num get getter4 => null; //# 04: continued
  double get getter5 => null; //# 05: continued
  double get getter6 => null; //# 06: continued
  double get getter7 => null; //# 07: continued
  double get getter8 => null; //# 08: continued
  double get getter9 => null; //# 09: continued

  set setter1(_) => null; //# 21: continued
  set setter2(_) => null; //# 22: continued
  void set setter3(_) {} //# 23: continued
  void set setter4(_) {} //# 24: continued
  set setter5(num _) => null; //# 25: continued
  set setter6(int _) => null; //# 26: continued
  set setter7(num _) => null; //# 27: continued
  set setter8(double _) => null; //# 28: continued
  set setter9(double _) => null; //# 29: continued
  set setter10(double _) => null; //# 30: continued
  set setter11(double _) => null; //# 31: continued
  set setter12(double _) => null; //# 32: continued

  int field1; //# 41: continued
  int field2; //# 42: continued
  num field3; //# 43: continued
  double field4; //# 44: continued
  double field5; //# 45: continued
  int get field6 => null; //# 46: continued
  String get field7 => null; //# 47: continued
  String field8; //# 48: continued
  set field9(int _) {} //# 49: continued
  void set field10(int _) {} //# 50: continued
  num field11; //# 51: continued
  num field12; //# 52: continued
  set field13(String _) {} //# 53: continued
  String field14; //# 54: continued
}

class SubClass extends Class {
  double get getter10 => null; //# 10: continued
  String get getter11 => null; //# 11: continued
  set setter13(double _) => null; //# 33: continued
  set setter13(double _) => null; //# 33a: continued
  set setter14(String _) => null; //# 34: continued
}

main() {
  new SubClass();
}
