| // Copyright 2015 The Chromium Authors. 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:args/args.dart'; |
| import 'package:path/path.dart' as path; |
| |
| import '../base/utils.dart'; |
| import '../cache.dart'; |
| import '../globals.dart'; |
| |
| /// Common behavior for `flutter analyze` and `flutter analyze --watch` |
| abstract class AnalyzeBase { |
| /// The parsed argument results for execution. |
| final ArgResults argResults; |
| |
| AnalyzeBase(this.argResults); |
| |
| /// Called by [AnalyzeCommand] to start the analysis process. |
| Future<Null> analyze(); |
| |
| void dumpErrors(Iterable<String> errors) { |
| if (argResults['write'] != null) { |
| try { |
| final RandomAccessFile resultsFile = new File(argResults['write']).openSync(mode: FileMode.WRITE); |
| try { |
| resultsFile.lockSync(); |
| resultsFile.writeStringSync(errors.join('\n')); |
| } finally { |
| resultsFile.close(); |
| } |
| } catch (e) { |
| printError('Failed to save output to "${argResults['write']}": $e'); |
| } |
| } |
| } |
| |
| void writeBenchmark(Stopwatch stopwatch, int errorCount, int membersMissingDocumentation) { |
| final String benchmarkOut = 'analysis_benchmark.json'; |
| Map<String, dynamic> data = <String, dynamic>{ |
| 'time': (stopwatch.elapsedMilliseconds / 1000.0), |
| 'issues': errorCount, |
| 'missingDartDocs': membersMissingDocumentation |
| }; |
| new File(benchmarkOut).writeAsStringSync(toPrettyJson(data)); |
| printStatus('Analysis benchmark written to $benchmarkOut ($data).'); |
| } |
| |
| bool get isBenchmarking => argResults['benchmark']; |
| } |
| |
| /// Return `true` if [fileList] contains a path that resides inside the Flutter repository. |
| /// If [fileList] is empty, then return `true` if the current directory resides inside the Flutter repository. |
| bool inRepo(List<String> fileList) { |
| if (fileList == null || fileList.isEmpty) |
| fileList = <String>[path.current]; |
| String root = path.normalize(path.absolute(Cache.flutterRoot)); |
| String prefix = root + Platform.pathSeparator; |
| for (String file in fileList) { |
| file = path.normalize(path.absolute(file)); |
| if (file == root || file.startsWith(prefix)) |
| return true; |
| } |
| return false; |
| } |