// Copyright (c) 2023, 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:expect/expect.dart';

abstract class A {
  (Object?, dynamic) method();
  (Object?, dynamic) get getter;
  void set setter((int, int) Function(Object?, dynamic) f);
}

abstract class B {
  (dynamic, Object?) method();
  (dynamic, Object?) get getter;
  void set setter((int, int) Function(dynamic, Object?) f);
}

class C implements A, B {
  (int, int) method() => (42, 87);
  (int, int) get getter => (42, 87);
  void set setter((int, int) Function(dynamic, dynamic) f) {}
}

extension type E(C c) implements A, B {}

void method(E e) {
  var (a, b) = e.method();
  Expect.equals(42, a);
  Expect.equals(87, b);
  var (c, d) = e.getter;
  Expect.equals(42, c);
  Expect.equals(87, d);
  e.setter = (dynamic a, dynamic b) => (42, 87);
  var f = e.method;
  var (g, h) = f();
  Expect.equals(42, g);
  Expect.equals(87, h);
}

main() {
  method(E(C()));
}
