// Copyright (c) 2016, 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:analyzer/src/context/cache.dart';
import 'package:analyzer/task/model.dart';
import 'package:args/args.dart';
import 'package:kernel/analyzer/loader.dart';
import 'package:kernel/kernel.dart';
import 'package:package_config/discovery.dart';

ArgParser parser = new ArgParser()
  ..addOption('sdk',
      help: 'Path to Dart SDK', valueHelp: 'path', defaultsTo: '/usr/lib/dart')
  ..addOption('packages',
      abbr: 'p',
      help: 'Path to the packages folder or .packages file',
      valueHelp: 'path')
  ..addFlag('strong', help: 'Use strong mode');

String get usage => '''
Usage: frontend_bench [options] FILE.dart

Benchmark the analyzer-based frontend.

Options:
${parser.options}
''';

main(List<String> args) {
  if (args.length == 0) {
    print(usage);
    exit(1);
  }
  ArgResults options = parser.parse(args);

  if (options.rest.length != 1) {
    print('Exactly one file must be given');
    exit(1);
  }

  String sdk = options['sdk'];
  String packagePath = options['packages'];
  bool strongMode = options['strong'];

  String path = options.rest.single;
  var packages =
      getPackagesDirectory(new Uri(scheme: 'file', path: packagePath));
  Repository repository = new Repository();

  new DartLoader(
          repository,
          new DartOptions(
              strongMode: strongMode, sdk: sdk, packagePath: packagePath),
          packages)
      .loadProgram(path);

  CacheEntry.recomputedCounts.forEach((key, value) {
    print('Recomputed $key $value times');
  });

  AnalysisTask.stopwatchMap.forEach((key, Stopwatch watch) {
    print('$key took ${watch.elapsedMilliseconds} ms');
  });
}
