| // 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. |
| |
| library; |
| |
| import 'dart:async'; |
| |
| import 'package:compiler/compiler_api.dart' |
| as api |
| show CompilationResult, CompilerDiagnostics, CompilerOutput, Diagnostic; |
| import 'package:compiler/src/commandline_options.dart'; |
| import 'package:compiler/src/common.dart'; |
| import 'package:compiler/src/compiler.dart' show Compiler; |
| import 'package:compiler/src/diagnostics/messages.dart' show Message; |
| import 'package:compiler/src/null_compiler_output.dart' show NullCompilerOutput; |
| import 'package:compiler/src/options.dart' show CompilerOptions; |
| // ignore: implementation_imports |
| import 'package:front_end/src/api_unstable/dart2js.dart' as fe; |
| |
| import 'memory_source_file_helper.dart'; |
| |
| export 'package:compiler/compiler_api.dart' show CompilationResult; |
| |
| export 'diagnostic_helper.dart'; |
| export 'output_collector.dart'; |
| |
| String sdkPath = 'sdk/lib'; |
| |
| String sdkLibrariesSpecificationPath = '$sdkPath/libraries.json'; |
| |
| Uri sdkLibrariesSpecificationUri = Uri.base.resolve( |
| sdkLibrariesSpecificationPath, |
| ); |
| |
| Uri sdkPlatformBinariesUri = fe |
| .computePlatformBinariesLocation() |
| .resolve("dart2js_platform.dill") |
| .resolve('.'); |
| |
| String sdkPlatformBinariesPath = sdkPlatformBinariesUri.toString(); |
| |
| Uri buildPlatformBinariesUri = fe |
| .computePlatformBinariesLocation(forceBuildDir: true) |
| .resolve("dart2js_platform.dill") |
| .resolve('.'); |
| |
| String buildPlatformBinariesPath = buildPlatformBinariesUri.toString(); |
| |
| class MultiDiagnostics implements api.CompilerDiagnostics { |
| final List<api.CompilerDiagnostics> diagnosticsList; |
| |
| const MultiDiagnostics([this.diagnosticsList = const []]); |
| |
| @override |
| void report( |
| covariant Message? message, |
| Uri? uri, |
| int? begin, |
| int? end, |
| String text, |
| api.Diagnostic kind, |
| ) { |
| for (api.CompilerDiagnostics diagnostics in diagnosticsList) { |
| diagnostics.report(message, uri, begin, end, text, kind); |
| } |
| } |
| } |
| |
| api.CompilerDiagnostics createCompilerDiagnostics( |
| api.CompilerDiagnostics? diagnostics, |
| SourceFileProvider provider, { |
| bool showDiagnostics = true, |
| bool verbose = false, |
| }) { |
| if (showDiagnostics) { |
| if (diagnostics == null) { |
| diagnostics = FormattingDiagnosticHandler() |
| ..verbose = verbose |
| ..registerFileProvider(provider); |
| } else { |
| var formattingHandler = FormattingDiagnosticHandler() |
| ..verbose = verbose |
| ..registerFileProvider(provider); |
| diagnostics = MultiDiagnostics([diagnostics, formattingHandler]); |
| } |
| } else { |
| diagnostics ??= MultiDiagnostics(); |
| } |
| return diagnostics; |
| } |
| |
| // Cached kernel state. |
| fe.InitializedCompilerState? kernelInitializedCompilerState; |
| |
| /// memorySourceFiles can contain a map of string filename to string file |
| /// contents or string file name to binary file contents (hence the `dynamic` |
| /// type for the second parameter). |
| Future<api.CompilationResult> runCompiler({ |
| Map<String, dynamic> memorySourceFiles = const <String, dynamic>{}, |
| Uri? entryPoint, |
| api.CompilerDiagnostics? diagnosticHandler, |
| api.CompilerOutput? outputProvider, |
| List<String> options = const <String>[], |
| Map<String, String>? environment, |
| bool showDiagnostics = true, |
| Uri? librariesSpecificationUri, |
| Uri? platformBinaries, |
| Uri? packageConfig, |
| bool skipPackageConfig = false, |
| void Function(Compiler compiler)? beforeRun, |
| }) async { |
| entryPoint ??= Uri.parse('memory:main.dart'); |
| Compiler compiler = compilerFor( |
| entryPoint: entryPoint, |
| memorySourceFiles: memorySourceFiles, |
| diagnosticHandler: diagnosticHandler, |
| outputProvider: outputProvider, |
| options: options, |
| environment: environment, |
| showDiagnostics: showDiagnostics, |
| librariesSpecificationUri: librariesSpecificationUri, |
| platformBinaries: platformBinaries, |
| packageConfig: packageConfig, |
| skipPackageConfig: skipPackageConfig, |
| ); |
| if (beforeRun != null) { |
| beforeRun(compiler); |
| } |
| bool isSuccess = await compiler.run(); |
| fe.InitializedCompilerState? compilerState = kernelInitializedCompilerState = |
| compiler.initializedCompilerState; |
| return api.CompilationResult( |
| compiler, |
| isSuccess: isSuccess, |
| kernelInitializedCompilerState: compilerState, |
| ); |
| } |
| |
| Compiler compilerFor({ |
| Uri? entryPoint, |
| Map<String, dynamic> memorySourceFiles = const <String, dynamic>{}, |
| api.CompilerDiagnostics? diagnosticHandler, |
| api.CompilerOutput? outputProvider, |
| List<String> options = const <String>[], |
| Map<String, String>? environment, |
| bool showDiagnostics = true, |
| Uri? librariesSpecificationUri, |
| Uri? platformBinaries, |
| Uri? packageConfig, |
| bool skipPackageConfig = false, |
| }) { |
| retainDataForTesting = true; |
| librariesSpecificationUri ??= sdkLibrariesSpecificationUri; |
| |
| if (packageConfig == null && !skipPackageConfig) { |
| if (Platform.packageConfig != null) { |
| packageConfig = Uri.base.resolve(Platform.packageConfig!); |
| } else { |
| // The tests are run with the base directory as the SDK root |
| // so just use the package config there. |
| packageConfig = Uri.base.resolve('.dart_tool/package_config.json'); |
| } |
| } |
| |
| // Create a local in case we end up cloning memorySourceFiles. |
| Map<String, dynamic> sources = memorySourceFiles; |
| |
| MemorySourceFileProvider provider; |
| provider = MemorySourceFileProvider(sources); |
| diagnosticHandler = createCompilerDiagnostics( |
| diagnosticHandler, |
| provider, |
| showDiagnostics: showDiagnostics, |
| verbose: options.contains('-v') || options.contains('--verbose'), |
| ); |
| |
| outputProvider ??= const NullCompilerOutput(); |
| |
| options = [...options, '${Flags.entryUri}=$entryPoint']; |
| |
| CompilerOptions compilerOptions = |
| CompilerOptions.parse( |
| options, |
| librariesSpecificationUri: librariesSpecificationUri, |
| platformBinaries: platformBinaries, |
| ) |
| ..environment = environment ?? {} |
| ..packageConfig = packageConfig; |
| |
| compilerOptions.setDefaultOutputUriForTesting(); |
| compilerOptions.kernelInitializedCompilerState = |
| kernelInitializedCompilerState; |
| var compiler = Compiler( |
| provider, |
| outputProvider, |
| diagnosticHandler, |
| compilerOptions, |
| ); |
| |
| return compiler; |
| } |
| |
| void main() { |
| runCompiler(memorySourceFiles: {'main.dart': 'main() {}'}); |
| } |