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

var result;

class Class {
  int instanceMethod() => 1;
  int instanceMethod() => 2;

  int get instanceGetter => 1;
  int get instanceGetter => 2;

  void set instanceSetter(value) {
    result = 1;
  }

  void set instanceSetter(value) {
    result = 2;
  }

  int instanceField = 1;
  int instanceField = 2;

  int instanceFieldAndSetter1 = 1;
  void set instanceFieldAndSetter1(int value) {
    result = 2;
  }

  void set instanceFieldAndSetter2(int value) {
    result = 2;
  }

  int instanceFieldAndSetter2 = 1;

  late final int instanceLateFinalFieldAndSetter1;
  void set instanceLateFinalFieldAndSetter1(int value) {
    result = 2;
  }

  void set instanceLateFinalFieldAndSetter2(int value) {
    result = 2;
  }

  late final int instanceLateFinalFieldAndSetter2;

  final int instanceDuplicateFieldAndSetter = 1;
  final int instanceDuplicateFieldAndSetter = 2;
  void set instanceDuplicateFieldAndSetter(int value) {
    result = 3;
  }

  final int instanceFieldAndDuplicateSetter = 1;
  void set instanceFieldAndDuplicateSetter(int value) {
    result = 2;
  }

  void set instanceFieldAndDuplicateSetter(int value) {
    result = 3;
  }

  final int instanceDuplicateFieldAndDuplicateSetter = 1;
  final int instanceDuplicateFieldAndDuplicateSetter = 2;
  void set instanceDuplicateFieldAndDuplicateSetter(int value) {
    result = 3;
  }

  void set instanceDuplicateFieldAndDuplicateSetter(int value) {
    result = 4;
  }

  int instanceMethodAndSetter1() => 1;
  void set instanceMethodAndSetter1(int value) {
    result = 2;
  }

  void set instanceMethodAndSetter2(int value) {
    result = 2;
  }

  int instanceMethodAndSetter2() => 1;
}

test() {
  Class c = new Class();
  c.instanceMethod();
  (c.instanceMethod)();
  c.instanceGetter;
  c.instanceSetter = 0;
  c.instanceField;
  c.instanceField = 0;
  c.instanceDuplicateFieldAndSetter;
  c.instanceDuplicateFieldAndSetter = 0;
  c.instanceFieldAndDuplicateSetter;
  c.instanceFieldAndDuplicateSetter = 0;
  c.instanceDuplicateFieldAndDuplicateSetter;
  c.instanceDuplicateFieldAndDuplicateSetter = 0;
}

main() {
  Class c = new Class();
  c.instanceFieldAndSetter1 = 0;
  expect(2, result);
  expect(1, c.instanceFieldAndSetter1);

  result = null;
  c.instanceFieldAndSetter2 = 0;
  expect(null, result);
  expect(0, c.instanceFieldAndSetter2);

  result = null;
  c.instanceLateFinalFieldAndSetter1 = 0;
  expect(2, result);
  throws(() => c.instanceLateFinalFieldAndSetter1);

  result = null;
  c.instanceLateFinalFieldAndSetter2 = 0;
  expect(null, result);
  expect(0, c.instanceLateFinalFieldAndSetter2);

  result = null;
  expect(1, c.instanceMethodAndSetter1());
  c.instanceMethodAndSetter1 = 0;
  expect(2, result);

  result = null;
  expect(1, c.instanceMethodAndSetter2());
  c.instanceMethodAndSetter2 = 0;
  expect(2, result);
}

expect(expected, actual) {
  if (expected != actual) throw 'Expected $expected, actual $actual';
}

throws(dynamic Function() f) {
  try {
    f();
  } catch (e) {
    print(e);
    return;
  }
  throw 'Expected exception.';
}
