// Copyright (c) 2013, 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 'dart:async';

import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/analyze.dart' as source_mirrors;
import '../../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart';

TypeMirror createInstantiation(TypeSourceMirror type,
                               List<TypeMirror> typeArguments) {
  return type.createInstantiation(typeArguments);
}

Future<MirrorSystem> analyze(String test) {
  Uri repository = Platform.script.resolve('../../../../');
  Uri testUri = repository.resolve('tests/lib/mirrors/$test');
  return analyzeUri(testUri);
}


Future<MirrorSystem> analyzeUri(Uri testUri) {
  Uri repository = Platform.script.resolve('../../../../');
  Uri libraryRoot = repository.resolve('sdk/');
  Uri packageRoot = Uri.base.resolve('${Platform.packageRoot}/');
  var provider = new CompilerSourceFileProvider();
  var handler = new FormattingDiagnosticHandler(provider);
  return source_mirrors.analyze(
      [testUri],
      libraryRoot,
      packageRoot,
      provider,
      handler);
}