// 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 leg_apiimpl; import 'dart:async'; import 'package:package_config/packages.dart'; import 'package:package_config/packages_file.dart' as pkgs; import 'package:package_config/src/packages_impl.dart' show MapPackages, NonFilePackagesDirectoryPackages; import 'package:package_config/src/util.dart' show checkValidPackageUri; import '../compiler_new.dart' as api; import 'common/tasks.dart' show GenericTask, Measurer; import 'common.dart'; import 'compiler.dart'; import 'diagnostics/messages.dart' show Message; import 'elements/elements.dart' as elements; import 'environment.dart'; import 'library_loader.dart'; import 'io/source_file.dart'; import 'options.dart' show CompilerOptions; import 'platform_configuration.dart' as platform_configuration; import 'resolved_uri_translator.dart'; import 'script.dart'; /// Implements the [Compiler] using a [api.CompilerInput] for supplying the /// sources. class CompilerImpl extends Compiler { final Measurer measurer; api.CompilerInput provider; api.CompilerDiagnostics handler; Packages packages; bool get mockableLibraryUsed => resolvedUriTranslator.isSet ? resolvedUriTranslator.mockableLibraryUsed : false; ForwardingResolvedUriTranslator resolvedUriTranslator; GenericTask userHandlerTask; GenericTask userProviderTask; GenericTask userPackagesDiscoveryTask; Uri get libraryRoot => options.platformConfigUri.resolve("."); CompilerImpl(this.provider, api.CompilerOutput outputProvider, this.handler, CompilerOptions options, {MakeReporterFunction makeReporter}) // NOTE: allocating measurer is done upfront to ensure the wallclock is // started before other computations. : measurer = new Measurer(enableTaskMeasurements: options.verbose), resolvedUriTranslator = new ForwardingResolvedUriTranslator(), super( options: options, outputProvider: outputProvider, environment: new _Environment(options.environment), makeReporter: makeReporter) { _Environment env = environment; env.compiler = this; tasks.addAll([ userHandlerTask = new GenericTask('Diagnostic handler', measurer), userProviderTask = new GenericTask('Input provider', measurer), userPackagesDiscoveryTask = new GenericTask('Package discovery', measurer), ]); } void log(message) { callUserHandler( null, null, null, null, message, api.Diagnostic.VERBOSE_INFO); } /// Report [exception] reading [uri]. Use [element] and [node] to compute /// the error location. void _reportReadError( Uri uri, elements.Element element, Spannable node, exception) { if (element == null || node == null) { reporter.reportErrorMessage(new SourceSpan(uri, 0, 0), MessageKind.READ_SELF_ERROR, {'uri': uri, 'exception': exception}); } else { reporter.withCurrentElement(element, () { reporter.reportErrorMessage(node, MessageKind.READ_URI_ERROR, {'uri': uri, 'exception': exception}); }); } } /** * Reads the script designated by [readableUri]. */ Future