// 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.

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

  int field1; /// 41: ok
  num field2; /// 42: ok
  int field3; /// 43: ok
  int field4; /// 44: static type warning
  int field5; /// 45: ok
  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();
}
