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

import 'dart:io';

import 'package:args/args.dart';
import 'package:expect/expect.dart';
import 'package:kernel/kernel.dart';
import 'package:kernel/binary/ast_to_binary.dart';
import 'package:vm/kernel_front_end.dart';

main() async {
  final outDir =
      Directory.systemTemp.createTempSync("incremental_load_from_dill_test");

  final dillFile = outDir.uri.resolve("dart2js.dart.dill").toFilePath();
  final unlinkedDillFile =
      outDir.uri.resolve("dart2js.dart.unlinked.dill").toFilePath();
  final unlinkedDillTxtFile =
      outDir.uri.resolve("dart2js.dart.unlinked dill.txt").toFilePath();

  final executable = Platform.executable;
  if (!executable.endsWith('out/ReleaseX64/dart')) {
    return;
  }

  final platformDill = Uri.parse(executable).resolve('vm_platform.dill');

  try {
    final arguments = <String>[
      '--no-link-platform',
      '--platform=$platformDill',
      '--output=$dillFile',
      'pkg/compiler/lib/src/dart2js.dart',
    ];

    // Compile dart2js.dart.
    final ArgParser argParser = createCompilerArgParser();
    final int exitCode =
        await runCompiler(argParser.parse(arguments), '<usage>');
    Expect.equals(0, exitCode);

    // Load the dart2js.dart.dill and write the unlinked version.
    final component = loadComponentFromBinary(dillFile);
    final IOSink sink = new File(unlinkedDillFile).openWrite();
    final printer = new BinaryPrinter(sink,
        libraryFilter: (lib) => !lib.importUri.isScheme('dart'));
    printer.writeComponentFile(component);
    await sink.close();

    // Ensure we can load the unlinked dill file and ensure it doesn't include
    // core libraries.
    final unlinkedComponent = loadComponentFromBinary(unlinkedDillFile);
    final coreLibraryCount = unlinkedComponent.libraries
        .where(
            (lib) => lib.importUri.isScheme('dart') && lib.members.isNotEmpty)
        .length;
    Expect.equals(0, coreLibraryCount);

    // Ensure we can print the unlinked kernel to text.
    writeComponentToText(unlinkedComponent, path: unlinkedDillTxtFile);
  } finally {
    outDir.deleteSync(recursive: true);
  }
}
