Unverified Commit 53b348a5 authored by Devon Carew's avatar Devon Carew Committed by GitHub

have flutter analyze support --preview-dart-2 (#14582)

* have flutter analyze support --preview-dart-2

* review comments
parent 59fe5d0f
......@@ -19,6 +19,7 @@ class AnalyzeCommand extends FlutterCommand {
argParser.addFlag('current-package', help: 'Include the lib/main.dart file from the current directory, if any.', defaultsTo: true);
argParser.addFlag('dartdocs', help: 'List every public member that is lacking documentation (only works with --flutter-repo and without --watch).', defaultsTo: false, hide: !verboseHelp);
argParser.addFlag('watch', help: 'Run analysis continuously, watching the filesystem for changes.', negatable: false);
argParser.addFlag('preview-dart-2', help: 'Preview Dart 2.0 functionality.');
argParser.addOption('write', valueHelp: 'file', help: 'Also output the results to a file. This is useful with --watch if you want a file to always contain the latest results.');
argParser.addOption('dart-sdk', valueHelp: 'path-to-sdk', help: 'The path to the Dart SDK.', hide: !verboseHelp);
......@@ -57,9 +58,16 @@ class AnalyzeCommand extends FlutterCommand {
@override
Future<Null> runCommand() {
if (argResults['watch']) {
return new AnalyzeContinuously(argResults, runner.getRepoPackages()).analyze();
return new AnalyzeContinuously(
argResults, runner.getRepoPackages(), previewDart2: argResults['preview-dart-2']
).analyze();
} else {
return new AnalyzeOnce(argResults, runner.getRepoPackages(), workingDirectory: workingDirectory).analyze();
return new AnalyzeOnce(
argResults,
runner.getRepoPackages(),
workingDirectory: workingDirectory,
previewDart2: argResults['preview-dart-2'],
).analyze();
}
}
}
......@@ -20,9 +20,10 @@ import '../globals.dart';
import 'analyze_base.dart';
class AnalyzeContinuously extends AnalyzeBase {
AnalyzeContinuously(ArgResults argResults, this.repoPackages) : super(argResults);
AnalyzeContinuously(ArgResults argResults, this.repoPackages, { this.previewDart2: false }) : super(argResults);
final List<Directory> repoPackages;
final bool previewDart2;
String analysisTarget;
bool firstAnalysis = true;
......@@ -52,7 +53,7 @@ class AnalyzeContinuously extends AnalyzeBase {
analysisTarget = fs.currentDirectory.path;
}
final AnalysisServer server = new AnalysisServer(dartSdkPath, directories);
final AnalysisServer server = new AnalysisServer(dartSdkPath, directories, previewDart2: previewDart2);
server.onAnalyzing.listen((bool isAnalyzing) => _handleAnalysisStatus(server, isAnalyzing));
server.onErrors.listen(_handleAnalysisErrors);
......@@ -150,10 +151,11 @@ class AnalyzeContinuously extends AnalyzeBase {
}
class AnalysisServer {
AnalysisServer(this.sdk, this.directories);
AnalysisServer(this.sdk, this.directories, { this.previewDart2: false });
final String sdk;
final List<String> directories;
final bool previewDart2;
Process _process;
final StreamController<bool> _analyzingController = new StreamController<bool>.broadcast();
......@@ -170,6 +172,10 @@ class AnalysisServer {
sdk,
];
if (previewDart2) {
command.add('--preview-dart-2');
}
printTrace('dart ${command.skip(1).join(' ')}');
_process = await processManager.start(command);
// This callback hookup can't throw.
......
......@@ -23,13 +23,18 @@ typedef bool FileFilter(FileSystemEntity entity);
/// An aspect of the [AnalyzeCommand] to perform once time analysis.
class AnalyzeOnce extends AnalyzeBase {
AnalyzeOnce(ArgResults argResults, this.repoPackages, { this.workingDirectory }) : super(argResults);
AnalyzeOnce(ArgResults argResults, this.repoPackages, {
this.workingDirectory,
this.previewDart2: false,
}) : super(argResults);
final List<Directory> repoPackages;
/// The working directory for testing analysis using dartanalyzer
final Directory workingDirectory;
final bool previewDart2;
@override
Future<Null> analyze() async {
final Stopwatch stopwatch = new Stopwatch()..start();
......@@ -82,6 +87,10 @@ class AnalyzeOnce extends AnalyzeBase {
arguments.insert(1, packagesFile.path);
}
if (previewDart2) {
arguments.add('--preview-dart-2');
}
final String dartanalyzer = fs.path.join(Cache.flutterRoot, 'bin', 'cache', 'dart-sdk', 'bin', 'dartanalyzer');
arguments.insert(0, dartanalyzer);
bool noErrors = false;
......
......@@ -69,6 +69,44 @@ void main() {
}, overrides: <Type, Generator>{
OperatingSystemUtils: () => os
});
testUsingContext('--preview-dart-2', () async {
final String contents = "StringBuffer bar = StringBuffer('baz');";
tempDir.childFile('main.dart').writeAsStringSync(contents);
server = new AnalysisServer(dartSdkPath, <String>[tempDir.path], previewDart2: true);
int errorCount = 0;
final Future<bool> onDone = server.onAnalyzing.where((bool analyzing) => analyzing == false).first;
server.onErrors.listen((FileAnalysisErrors errors) {
errorCount += errors.errors.length;
});
await server.start();
await onDone;
expect(errorCount, 0);
}, overrides: <Type, Generator>{
OperatingSystemUtils: () => os
});
testUsingContext('no --preview-dart-2 shows errors', () async {
final String contents = "StringBuffer bar = StringBuffer('baz');";
tempDir.childFile('main.dart').writeAsStringSync(contents);
server = new AnalysisServer(dartSdkPath, <String>[tempDir.path], previewDart2: false);
int errorCount = 0;
final Future<bool> onDone = server.onAnalyzing.where((bool analyzing) => analyzing == false).first;
server.onErrors.listen((FileAnalysisErrors errors) {
errorCount += errors.errors.length;
});
await server.start();
await onDone;
expect(errorCount, 1);
}, overrides: <Type, Generator>{
OperatingSystemUtils: () => os
});
}
void _createSampleProject(Directory directory, { bool brokenCode: false }) {
......
......@@ -192,6 +192,45 @@ void bar() {
toolExit: true,
);
});
testUsingContext('--preview-dart-2', () async {
final String contents = '''
StringBuffer bar = StringBuffer('baz');
''';
final Directory tempDir = fs.systemTempDirectory.createTempSync();
tempDir.childFile('main.dart').writeAsStringSync(contents);
try {
await runCommand(
command: new AnalyzeCommand(workingDirectory: fs.directory(tempDir)),
arguments: <String>['analyze', '--preview-dart-2'],
statusTextContains: <String>['No issues found!'],
);
} finally {
tempDir.deleteSync(recursive: true);
}
});
testUsingContext('no --preview-dart-2 shows errors', () async {
final String contents = '''
StringBuffer bar = StringBuffer('baz');
''';
final Directory tempDir = fs.systemTempDirectory.createTempSync();
tempDir.childFile('main.dart').writeAsStringSync(contents);
try {
await runCommand(
command: new AnalyzeCommand(workingDirectory: fs.directory(tempDir)),
arguments: <String>['analyze'],
statusTextContains: <String>['1 issue found.'],
toolExit: true,
);
} finally {
tempDir.deleteSync(recursive: true);
}
});
});
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment