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

// @dart = 2.9

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;

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

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();
}
