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

// Check that await from a call-via-field expression works.

import 'package:expect/expect.dart';

abstract class A<T> {
  T Function(List<int> raw) get decode;
}

class B extends A<int> {
  int Function(List<int> raw) get decode => (List<int> raw) => raw.first;
}

class C<T> {
  final A<T> aa;
  C(this.aa);
}

class D {
  final C<int> cc;
  D(this.cc);

  Future<int> read() async {
    return cc.aa.decode(await getList());
  }

  Future<List<int>> getList() async => <int>[42];
}

main() async {
  D dd = new D(new C<int>(new B()));
  Expect.equals(42, await dd.read());
}
