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

// @dart = 2.9

import "package:expect/expect.dart";

// Checks that abstract instance methods are correctly resolved.

int get length => throw "error: top-level getter called";
set height(x) {
  throw "error: top-level setter called";
}

width() {
  throw "error: top-level function called";
}

abstract class A {
  int get length; //    Abstract instance getter.
  set height(int x); // Abstract instance setter.
  int width(); //       Abstract instance method.

  // Must resolve to non-abstract length getter in subclass.
  get useLength => length;
  // Must resolve to non-abstract height setter in subclass.
  setHeight(x) => height = x;
  // Must resolve to non-abstract width() method in subclass.
  useWidth() => width();
}

class A1 extends A {
  int length; // Implies a length getter.
  int height; // Implies a height setter.
  int width() => 345;
  A1(this.length);
}

main() {
  var a = new A1(123);
  Expect.equals(123, a.useLength);
  a.setHeight(234);
  Expect.equals(234, a.height);
  Expect.equals(345, a.useWidth());
  print([a.useLength, a.height, a.useWidth()]);
}
