| #!/usr/bin/env dart |
| // 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. |
| |
| /// Command-line tool that runs dartanalyzer on a sdk under the perspective of |
| /// one tool. |
| // TODO(sigmund): generalize this to support other tools, not just ddc. |
| |
| import 'dart:io'; |
| import 'package:args/args.dart'; |
| import 'package:front_end/src/fasta/resolve_input_uri.dart'; |
| |
| import 'patch_sdk.dart' as patch; |
| |
| void main(List<String> argv) { |
| var args = _parser.parse(argv); |
| String baseDir = args['out'] as String; |
| if (baseDir == null) { |
| var tmp = Directory.systemTemp.createTempSync('check_sdk-'); |
| baseDir = tmp.path; |
| } |
| var baseUri = resolveInputUri(baseDir.endsWith('/') ? baseDir : '$baseDir/'); |
| var sdkDir = baseUri.resolve('sdk/').toFilePath(); |
| print('Generating a patched sdk at ${baseUri.path}'); |
| |
| Uri librariesJson = args['libraries'] != null |
| ? resolveInputUri(args['libraries'] as String) |
| : Platform.script.resolve('../../../sdk_nnbd/lib/libraries.json'); |
| patch.main([ |
| '--libraries', |
| librariesJson.toFilePath(), |
| '--target', |
| args['target'] as String, |
| '--out', |
| sdkDir, |
| '--merge-parts', |
| '--nnbd', |
| ]); |
| |
| var emptyProgramUri = baseUri.resolve('empty_program.dart'); |
| File.fromUri(emptyProgramUri).writeAsStringSync('main() {}'); |
| |
| print('Running dartanalyzer'); |
| var dart = Uri.base.resolve(Platform.resolvedExecutable); |
| var analyzerSnapshot = Uri.base |
| .resolve(Platform.resolvedExecutable) |
| .resolve('snapshots/dartanalyzer.dart.snapshot'); |
| var result = Process.runSync(dart.toFilePath(), [ |
| analyzerSnapshot.toFilePath(), |
| '--dart-sdk=${sdkDir}', |
| '--format', |
| 'machine', |
| '--sdk-warnings', |
| '--no-hints', |
| emptyProgramUri.toFilePath() |
| ]); |
| |
| stdout.write(result.stdout); |
| String errors = result.stderr as String; |
| var count = errors.trim().split('\n').length; |
| print('$count analyzer errors. Errors emitted to ${baseUri.path}errors.txt'); |
| File.fromUri(baseUri.resolve('errors.txt')).writeAsStringSync(errors); |
| } |
| |
| final _parser = ArgParser() |
| ..addOption('libraries', |
| help: 'Path to the nnbd libraries.json (defaults to the one under ' |
| 'sdk_nnbd/lib/libraries.json.') |
| ..addOption('out', |
| help: 'Path to an output folder (defaults to a new tmp folder).') |
| ..addOption('target', |
| help: 'The target tool. ' |
| 'This name matches one of the possible targets in libraries.json ' |
| 'and it is used to pick which patch files will be applied.', |
| allowed: ['dartdevc', 'dart2js', 'dart2js_server', 'vm', 'flutter'], |
| defaultsTo: 'dartdevc'); |