blob: 8d36bb90f4433c486284d1303679095a85f3390a [file] [log] [blame]
#!/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');