|  | // Copyright (c) 2019, 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:testing/src/run_tests.dart" as run_tests; | 
|  | import 'package:kernel/src/tool/dump.dart' as dump; | 
|  | import '../test/utils/io_utils.dart' show computeRepoDir; | 
|  | import '_fasta/abcompile.dart' as abcompile; | 
|  | import '_fasta/compile.dart' as compile; | 
|  | import '_fasta/compile_platform.dart' as compile_platform; | 
|  | import '_fasta/generate_experimental_flags.dart' as generate_experimental_flags; | 
|  | import '_fasta/generate_messages.dart' as generate_messages; | 
|  | import '_fasta/log_analyzer.dart' as log_analyzer; | 
|  | import '_fasta/log_collector.dart' as log_collector; | 
|  | import '_fasta/outline.dart' as outline; | 
|  | import '_fasta/parser.dart' as parser; | 
|  | import '_fasta/scanner.dart' as scanner; | 
|  |  | 
|  | final String repoDir = computeRepoDir(); | 
|  |  | 
|  | final String toolDir = '$repoDir/pkg/front_end/tool/_fasta'; | 
|  |  | 
|  | final String kernelBin = '$repoDir/pkg/kernel/bin'; | 
|  |  | 
|  | String get dartVm => | 
|  | Platform.isWindows ? '$repoDir/sdk/bin/dart.bat' : '$repoDir/sdk/bin/dart'; | 
|  |  | 
|  | Future<void> main(List<String> args) async { | 
|  | List<String> extraVmArguments = []; | 
|  | String script; | 
|  | List<String> scriptArguments = []; | 
|  |  | 
|  | int index = 0; | 
|  | for (; index < args.length; index++) { | 
|  | String arg = args[index]; | 
|  | if (arg.startsWith('-')) { | 
|  | extraVmArguments.add(arg); | 
|  | } else { | 
|  | break; | 
|  | } | 
|  | } | 
|  | if (args.length == index) { | 
|  | stop("No command provided."); | 
|  | } | 
|  | String command = args[index++]; | 
|  | List<String> remainingArguments = args.skip(index).toList(); | 
|  |  | 
|  | dynamic Function(List<String>) mainFunction; | 
|  |  | 
|  | switch (command) { | 
|  | case 'abcompile': | 
|  | mainFunction = abcompile.main; | 
|  | script = '${toolDir}/abcompile.dart'; | 
|  | break; | 
|  | case 'compile': | 
|  | mainFunction = compile.main; | 
|  | script = '${toolDir}/compile.dart'; | 
|  | break; | 
|  | case 'compile-platform': | 
|  | mainFunction = compile_platform.main; | 
|  | script = '${toolDir}/compile_platform.dart'; | 
|  | break; | 
|  | case 'log': | 
|  | mainFunction = log_analyzer.main; | 
|  | script = '${toolDir}/log_analyzer.dart'; | 
|  | break; | 
|  | case 'logd': | 
|  | mainFunction = log_collector.main; | 
|  | script = '${toolDir}/log_collector.dart'; | 
|  | break; | 
|  | case 'outline': | 
|  | mainFunction = outline.main; | 
|  | script = '${toolDir}/outline.dart'; | 
|  | break; | 
|  | case 'parser': | 
|  | mainFunction = parser.main; | 
|  | script = '${toolDir}/parser.dart'; | 
|  | break; | 
|  | case 'scanner': | 
|  | mainFunction = scanner.main; | 
|  | script = '${toolDir}/scanner.dart'; | 
|  | break; | 
|  | case 'dump-ir': | 
|  | mainFunction = dump.main; | 
|  | script = '${kernelBin}/dump.dart'; | 
|  | if (remainingArguments.isEmpty || remainingArguments.length > 2) { | 
|  | stop("Usage: $command dillFile [output]"); | 
|  | } | 
|  | break; | 
|  | case 'testing': | 
|  | mainFunction = run_tests.main; | 
|  | script = '${repoDir}/pkg/testing/bin/testing.dart'; | 
|  | scriptArguments.add('--config=${repoDir}/pkg/front_end/testing.json'); | 
|  | break; | 
|  | case 'generate-messages': | 
|  | mainFunction = generate_messages.main; | 
|  | script = '${toolDir}/generate_messages.dart'; | 
|  | break; | 
|  | case 'generate-experimental-flags': | 
|  | mainFunction = generate_experimental_flags.main; | 
|  | script = '${toolDir}/generate_experimental_flags.dart'; | 
|  | break; | 
|  | default: | 
|  | stop("'$command' isn't a valid subcommand."); | 
|  | } | 
|  |  | 
|  | if (extraVmArguments.isNotEmpty || !assertsEnabled) { | 
|  | List<String> arguments = []; | 
|  | arguments.addAll(extraVmArguments); | 
|  | arguments.add('--enable-asserts'); | 
|  | arguments.add(script); | 
|  | arguments.addAll(remainingArguments); | 
|  | arguments.addAll(scriptArguments); | 
|  |  | 
|  | print('Running: ${dartVm} ${arguments.join(' ')}'); | 
|  | Process process = await Process.start(dartVm, arguments, | 
|  | mode: ProcessStartMode.inheritStdio); | 
|  | exitCode = await process.exitCode; | 
|  | } else { | 
|  | // Run within the same VM if no VM arguments are provided. | 
|  | List<String> arguments = []; | 
|  | arguments.addAll(remainingArguments); | 
|  | arguments.addAll(scriptArguments); | 
|  |  | 
|  | print('Calling: ${script} ${arguments.join(' ')}'); | 
|  | await mainFunction(arguments); | 
|  | } | 
|  | } | 
|  |  | 
|  | Never stop(String message) { | 
|  | stderr.write(message); | 
|  | exit(2); | 
|  | } | 
|  |  | 
|  | final bool assertsEnabled = () { | 
|  | try { | 
|  | assert(false); | 
|  | return false; | 
|  | } catch (_) { | 
|  | return true; | 
|  | } | 
|  | }(); |