|  | // 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:async'; | 
|  | import 'dart:io'; | 
|  |  | 
|  | import 'package:_fe_analyzer_shared/src/testing/annotated_code_helper.dart'; | 
|  | import 'package:args/args.dart'; | 
|  | import 'package:compiler/src/commandline_options.dart'; | 
|  | import 'package:compiler/src/dart2js.dart' as entry; | 
|  | import 'package:expect/async_helper.dart'; | 
|  | import 'package:expect/expect.dart'; | 
|  | import 'package:sourcemap_testing/src/stepping_helper.dart'; | 
|  |  | 
|  | import 'package:compiler/src/util/memory_compiler.dart'; | 
|  |  | 
|  | void main(List<String> args) { | 
|  | ArgParser argParser = ArgParser(allowTrailingOptions: true); | 
|  | argParser.addFlag('debug', abbr: 'd', defaultsTo: false); | 
|  | argParser.addFlag('verbose', abbr: 'v', defaultsTo: false); | 
|  | argParser.addFlag('continued', abbr: 'c', defaultsTo: false); | 
|  | ArgResults argResults = argParser.parse(args); | 
|  | Directory dataDir = Directory.fromUri(Platform.script.resolve('stepping')); | 
|  | asyncTest(() async { | 
|  | bool continuing = false; | 
|  | await for (FileSystemEntity entity in dataDir.list()) { | 
|  | String name = entity.uri.pathSegments.last; | 
|  | if (argResults.rest.isNotEmpty && | 
|  | !argResults.rest.contains(name) && | 
|  | !continuing) { | 
|  | continue; | 
|  | } | 
|  | print('----------------------------------------------------------------'); | 
|  | print('Checking ${entity.uri}'); | 
|  | print('----------------------------------------------------------------'); | 
|  | String annotatedCode = await File.fromUri(entity.uri).readAsString(); | 
|  | await testAnnotatedCode( | 
|  | annotatedCode, | 
|  | verbose: argResults['verbose'], | 
|  | debug: argResults['debug'], | 
|  | ); | 
|  | if (argResults['continued']) { | 
|  | continuing = true; | 
|  | } | 
|  | } | 
|  | }); | 
|  | } | 
|  |  | 
|  | const String kernelMarker = 'kernel.'; | 
|  |  | 
|  | Future testAnnotatedCode( | 
|  | String code, { | 
|  | bool debug = false, | 
|  | bool verbose = false, | 
|  | }) async { | 
|  | AnnotatedCode annotatedCode = AnnotatedCode.fromText( | 
|  | code, | 
|  | commentStart, | 
|  | commentEnd, | 
|  | ); | 
|  | print(annotatedCode.sourceCode); | 
|  | Map<String, AnnotatedCode> split = splitByPrefixes(annotatedCode, [ | 
|  | kernelMarker, | 
|  | ]); | 
|  | print('---from kernel------------------------------------------------------'); | 
|  | await runTest( | 
|  | split[kernelMarker]!, | 
|  | kernelMarker, | 
|  | debug: debug, | 
|  | verbose: verbose, | 
|  | ); | 
|  | } | 
|  |  | 
|  | Future runTest( | 
|  | AnnotatedCode annotatedCode, | 
|  | String config, { | 
|  | bool debug = false, | 
|  | bool verbose = false, | 
|  | List<String> options = const <String>[], | 
|  | }) async { | 
|  | Directory dir = Directory.systemTemp.createTempSync('stepping_test'); | 
|  | String testFileName = 'test.dart'; | 
|  | String path = dir.path; | 
|  | String inputFile = '$path/$testFileName'; | 
|  | File(inputFile).writeAsStringSync(annotatedCode.sourceCode); | 
|  | String outputFile = '$path/js.js'; | 
|  | List<String> arguments = <String>[ | 
|  | '--out=$outputFile', | 
|  | inputFile, | 
|  | Flags.disableInlining, | 
|  | ]; | 
|  | CompilationResult compilationResult = await entry.internalMain(arguments); | 
|  | Expect.isTrue(compilationResult.isSuccess); | 
|  | List<String> scriptD8Command = [ | 
|  | '$sdkPath/_internal/js_runtime/lib/preambles/d8.js', | 
|  | outputFile, | 
|  | ]; | 
|  | ProcessResult result = runD8AndStep( | 
|  | dir.path, | 
|  | testFileName, | 
|  | annotatedCode, | 
|  | scriptD8Command, | 
|  | ); | 
|  | List<String> d8output = result.stdout.split("\n"); | 
|  | if (verbose) { | 
|  | d8output.forEach(print); | 
|  | } | 
|  | checkD8Steps(dir.path, d8output, annotatedCode, debug: debug); | 
|  | dir.deleteSync(recursive: true); | 
|  | } |