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

/*spec.library: 
 a_pre_fragments=[
  p1: {units: [6{libA}], usedBy: [], needs: []},
  p2: {units: [1{libB}], usedBy: [], needs: []},
  p3: {units: [2{libC}], usedBy: [], needs: []},
  p4: {units: [4{libA, libC}], usedBy: [], needs: []},
  p5: {units: [5{libB, libC}], usedBy: [], needs: []},
  p6: {units: [3{libA, libB, libC}], usedBy: [], needs: []}],
 b_finalized_fragments=[
  f1: [6{libA}],
  f2: [1{libB}],
  f3: [2{libC}],
  f6: [3{libA, libB, libC}]],
 c_steps=[
  libA=(f6, f1),
  libB=(f6, f2),
  libC=(f6, f3)]
*/

/*two-frag.library: 
 a_pre_fragments=[
  p1: {units: [1{libB}, 6{libA}], usedBy: [p2], needs: []},
  p2: {units: [5{libB, libC}, 4{libA, libC}, 2{libC}], usedBy: [p3], needs: [p1]},
  p3: {units: [3{libA, libB, libC}], usedBy: [], needs: [p2]}],
 b_finalized_fragments=[
  f1: [1{libB}, 6{libA}],
  f2: [2{libC}],
  f3: [3{libA, libB, libC}]],
 c_steps=[
  libA=(f3, f1),
  libB=(f3, f1),
  libC=(f3, f2)]
*/

/*three-frag.library: 
 a_pre_fragments=[
  p1: {units: [6{libA}], usedBy: [p4], needs: []},
  p2: {units: [1{libB}], usedBy: [p4], needs: []},
  p3: {units: [2{libC}], usedBy: [p4], needs: []},
  p4: {units: [3{libA, libB, libC}, 5{libB, libC}, 4{libA, libC}], usedBy: [], needs: [p3, p2, p1]}],
 b_finalized_fragments=[
  f1: [6{libA}],
  f2: [1{libB}],
  f3: [2{libC}],
  f4: [3{libA, libB, libC}]],
 c_steps=[
  libA=(f4, f1),
  libB=(f4, f2),
  libC=(f4, f3)]
*/

// @dart = 2.7

import 'liba.dart' deferred as libA;
import 'libb.dart' deferred as libB;
import 'libc.dart' deferred as libC;

/*member: foo:
 constants=[
  FunctionConstant(callFooMethod)=1{libB},
  FunctionConstant(createB2)=2{libC},
  FunctionConstant(createC3)=2{libC},
  FunctionConstant(createD3)=2{libC},
  FunctionConstant(createDooFunFunFoo)=2{libC},
  FunctionConstant(isDooFunFunFoo)=1{libB},
  FunctionConstant(isFoo)=1{libB},
  FunctionConstant(isFoo)=2{libC},
  FunctionConstant(isFoo)=6{libA},
  FunctionConstant(isFunFunFoo)=1{libB},
  FunctionConstant(isFunFunFoo)=2{libC},
  FunctionConstant(isFunFunFoo)=6{libA},
  FunctionConstant(isMega)=6{libA}],
 member_unit=main{}
*/
void foo() async {
  await libA.loadLibrary();
  await libB.loadLibrary();
  await libC.loadLibrary();
  print((libA.isFoo)(null as dynamic));
  print((libA.isFunFunFoo)(null as dynamic));
  print((libA.isFoo)(null as dynamic));
  print((libA.isMega)(null as dynamic));

  print((libB.isFoo)(null as dynamic));
  print((libB.callFooMethod)());
  print((libB.isFunFunFoo)(null as dynamic));
  print((libB.isDooFunFunFoo)(null as dynamic));

  print((libC.isFoo)(null as dynamic));
  print((libC.isFunFunFoo)(null as dynamic));
  print((libC.createB2)());
  print((libC.createC3)());
  print((libC.createD3)());
  print((libC.createDooFunFunFoo)());
}

/*member: main:member_unit=main{}*/
main() {
  foo();
}
