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

library dart2js_util;

import 'dart:async' show Future;
import 'dart:io' show Path;

import '../../../compiler/compiler.dart' as api;
import '../../../compiler/implementation/mirrors/dart2js_mirror.dart' as dart2js
    show analyze, Dart2JsMirrorSystem;
import '../../../compiler/implementation/mirrors/mirrors.dart'
    show MirrorSystem;
import '../../../compiler/implementation/source_file_provider.dart'
    show FormattingDiagnosticHandler, SourceFileProvider;
import '../../../compiler/implementation/filenames.dart'
    show appendSlash, currentDirectory;

// TODO(johnniwinther): Support client configurable providers.

/**
 * Returns a future that completes to a non-null String when [script]
 * has been successfully compiled.
 */
// TODO(amouravski): Remove this method and call dart2js via a process instead.
Future<String> compile(String script,
                       String libraryRoot,
                       {String packageRoot,
                        List<String> options: const <String>[],
                        api.DiagnosticHandler diagnosticHandler}) {
  SourceFileProvider provider = new SourceFileProvider();
  if (diagnosticHandler == null) {
    diagnosticHandler =
        new FormattingDiagnosticHandler(provider).diagnosticHandler;
  }
  Uri scriptUri = currentDirectory.resolve(script.toString());
  Uri libraryUri = currentDirectory.resolve(appendSlash('$libraryRoot'));
  Uri packageUri = null;
  if (packageRoot != null) {
    packageUri = currentDirectory.resolve(appendSlash('$packageRoot'));
  }
  return api.compile(scriptUri, libraryUri, packageUri,
      provider.readStringFromUri, diagnosticHandler, options);
}

/**
 * Analyzes set of libraries and provides a mirror system which can be used for
 * static inspection of the source code.
 */
Future<MirrorSystem> analyze(List<String> libraries,
                             String libraryRoot,
                             {String packageRoot,
                              List<String> options: const <String>[],
                              api.DiagnosticHandler diagnosticHandler}) {
  SourceFileProvider provider = new SourceFileProvider();
  if (diagnosticHandler == null) {
    diagnosticHandler =
        new FormattingDiagnosticHandler(provider).diagnosticHandler;
  }
  Uri libraryUri = currentDirectory.resolve(appendSlash('$libraryRoot'));
  Uri packageUri = null;
  if (packageRoot != null) {
    packageUri = currentDirectory.resolve(appendSlash('$packageRoot'));
  }
  List<Uri> librariesUri = <Uri>[];
  for (String library in libraries) {
    librariesUri.add(currentDirectory.resolve(library));
  }
  return dart2js.analyze(librariesUri, libraryUri, packageUri,
                         provider.readStringFromUri, diagnosticHandler,
                         options);
}
