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

import 'package:front_end/src/api_prototype/compiler_options.dart';
import 'package:front_end/src/api_prototype/memory_file_system.dart';

import 'incremental_suite.dart' show TestIncrementalCompiler, getOptions;

Future<void> main() async {
  await compile("import 'foo.dart' if (dart.library.bar) 'baz.dart';");
}

Future<void> compile(String data) async {
  Uri base = Uri.parse("org-dartlang-test:///");
  Uri sdkSummary = base.resolve("nonexisting.dill");
  Uri mainFile = base.resolve("main.dart");
  MemoryFileSystem fs = new MemoryFileSystem(base);
  CompilerOptions options = getOptions();
  options.fileSystem = fs;
  options.sdkRoot = null;
  options.sdkSummary = sdkSummary;
  options.librariesSpecificationUri = null;
  options.omitPlatform = true;
  options.onDiagnostic = (DiagnosticMessage message) {
    // ignored
  };
  fs.entityForUri(mainFile).writeAsStringSync(data);
  TestIncrementalCompiler compiler =
      new TestIncrementalCompiler(options, mainFile);
  await compiler.computeDelta();
}
