| OLD | NEW |
| 1 #!/usr/bin/env dart | 1 #!/usr/bin/env dart |
| 2 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 2 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 3 // for details. All rights reserved. Use of this source code is governed by a | 3 // for details. All rights reserved. Use of this source code is governed by a |
| 4 // BSD-style license that can be found in the LICENSE file. | 4 // BSD-style license that can be found in the LICENSE file. |
| 5 | 5 |
| 6 /// Command line tool to write checker errors as inline comments in the source | 6 /// Command line tool to write checker errors as inline comments in the source |
| 7 /// code of the program. This tool requires the info.json file created by | 7 /// code of the program. This tool requires the info.json file created by |
| 8 /// running devc.dart passing the arguments | 8 /// running devc.dart passing the arguments |
| 9 /// --dump-info --dump-info-file info.json | 9 /// --dump-info --dump-info-file info.json |
| 10 | 10 |
| 11 library dev_compiler.bin.edit_files; | 11 library dev_compiler.bin.edit_files; |
| 12 | 12 |
| 13 import 'dart:io'; | 13 import 'dart:io'; |
| 14 import 'dart:convert'; | 14 import 'dart:convert'; |
| 15 | 15 |
| 16 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext; |
| 16 import 'package:analyzer/src/generated/source.dart' show Source; | 17 import 'package:analyzer/src/generated/source.dart' show Source; |
| 17 import 'package:args/args.dart'; | 18 import 'package:args/args.dart'; |
| 18 import 'package:cli_util/cli_util.dart' show getSdkDir; | 19 import 'package:cli_util/cli_util.dart' show getSdkDir; |
| 19 import 'package:source_maps/refactor.dart'; | 20 import 'package:source_maps/refactor.dart'; |
| 20 import 'package:source_span/source_span.dart'; | 21 import 'package:source_span/source_span.dart'; |
| 21 | 22 |
| 23 import 'package:dev_compiler/src/analysis_context.dart'; |
| 22 import 'package:dev_compiler/src/options.dart'; | 24 import 'package:dev_compiler/src/options.dart'; |
| 23 import 'package:dev_compiler/src/summary.dart'; | 25 import 'package:dev_compiler/src/summary.dart'; |
| 24 import 'package:dev_compiler/src/checker/resolver.dart' show TypeResolver; | |
| 25 | 26 |
| 26 final ArgParser argParser = new ArgParser() | 27 final ArgParser argParser = new ArgParser() |
| 27 ..addOption('level', help: 'Minimum error level', defaultsTo: "info") | 28 ..addOption('level', help: 'Minimum error level', defaultsTo: "info") |
| 28 ..addOption('checkout-files-executable', | 29 ..addOption('checkout-files-executable', |
| 29 help: 'Executable to check out files from source control (e.g. svn)', | 30 help: 'Executable to check out files from source control (e.g. svn)', |
| 30 defaultsTo: null) | 31 defaultsTo: null) |
| 31 ..addOption('checkout-files-arg', | 32 ..addOption('checkout-files-arg', |
| 32 help: 'Arg to check out files from source control (e.g. checkout)', | 33 help: 'Arg to check out files from source control (e.g. checkout)', |
| 33 defaultsTo: null) | 34 defaultsTo: null) |
| 34 ..addOption('include-pattern', | 35 ..addOption('include-pattern', |
| (...skipping 15 matching lines...) Expand all Loading... |
| 50 void _showUsageAndExit() { | 51 void _showUsageAndExit() { |
| 51 print('usage: edit_files [<options>] <summary.json>\n'); | 52 print('usage: edit_files [<options>] <summary.json>\n'); |
| 52 print('<summary.json> GlobalSummary serialized as json.\n'); | 53 print('<summary.json> GlobalSummary serialized as json.\n'); |
| 53 print('<options> include:\n'); | 54 print('<options> include:\n'); |
| 54 print(argParser.usage); | 55 print(argParser.usage); |
| 55 exit(1); | 56 exit(1); |
| 56 } | 57 } |
| 57 | 58 |
| 58 class EditFileSummaryVisitor extends RecursiveSummaryVisitor { | 59 class EditFileSummaryVisitor extends RecursiveSummaryVisitor { |
| 59 var _files = new Map<String, TextEditTransaction>(); | 60 var _files = new Map<String, TextEditTransaction>(); |
| 60 TypeResolver typeResolver; | 61 AnalysisContext context; |
| 61 String level; | 62 String level; |
| 62 String checkoutFilesExecutable; | 63 String checkoutFilesExecutable; |
| 63 String checkoutFilesArg; | 64 String checkoutFilesArg; |
| 64 RegExp includePattern; | 65 RegExp includePattern; |
| 65 RegExp excludePattern; | 66 RegExp excludePattern; |
| 66 | 67 |
| 67 final Map<Uri, Source> _sources = <Uri, Source>{}; | 68 final Map<Uri, Source> _sources = <Uri, Source>{}; |
| 68 | 69 |
| 69 EditFileSummaryVisitor(this.typeResolver, this.level, | 70 EditFileSummaryVisitor(this.context, this.level, |
| 70 this.checkoutFilesExecutable, this.checkoutFilesArg, this.includePattern, | 71 this.checkoutFilesExecutable, this.checkoutFilesArg, this.includePattern, |
| 71 this.excludePattern); | 72 this.excludePattern); |
| 72 | 73 |
| 73 TextEditTransaction getEdits(String name) => _files.putIfAbsent(name, () { | 74 TextEditTransaction getEdits(String name) => _files.putIfAbsent(name, () { |
| 74 var fileContents = new File(name).readAsStringSync(); | 75 var fileContents = new File(name).readAsStringSync(); |
| 75 return new TextEditTransaction(fileContents, new SourceFile(fileContents)); | 76 return new TextEditTransaction(fileContents, new SourceFile(fileContents)); |
| 76 }); | 77 }); |
| 77 | 78 |
| 78 /// Find the corresponding [Source] for [uri]. | 79 /// Find the corresponding [Source] for [uri]. |
| 79 Source findSource(Uri uri) { | 80 Source findSource(Uri uri) { |
| 80 var source = _sources[uri]; | 81 var source = _sources[uri]; |
| 81 if (source != null) return source; | 82 if (source != null) return source; |
| 82 return _sources[uri] = typeResolver.context.sourceFactory.forUri('$uri'); | 83 return _sources[uri] = context.sourceFactory.forUri('$uri'); |
| 83 } | 84 } |
| 84 | 85 |
| 85 @override | 86 @override |
| 86 void visitMessage(MessageSummary message) { | 87 void visitMessage(MessageSummary message) { |
| 87 var uri = message.span.sourceUrl; | 88 var uri = message.span.sourceUrl; |
| 88 // Ignore dart: libraries. | 89 // Ignore dart: libraries. |
| 89 if (uri.scheme == 'dart') return; | 90 if (uri.scheme == 'dart') return; |
| 90 if (level != null) { | 91 if (level != null) { |
| 91 // Filter out messages with lower severity. | 92 // Filter out messages with lower severity. |
| 92 switch (message.level) { | 93 switch (message.level) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 } | 129 } |
| 129 | 130 |
| 130 var sdkDir = getSdkDir(argv); | 131 var sdkDir = getSdkDir(argv); |
| 131 if (sdkDir == null) { | 132 if (sdkDir == null) { |
| 132 print('Could not automatically find dart sdk path.'); | 133 print('Could not automatically find dart sdk path.'); |
| 133 print('Please pass in explicitly: --dart-sdk <path>'); | 134 print('Please pass in explicitly: --dart-sdk <path>'); |
| 134 exit(1); | 135 exit(1); |
| 135 } | 136 } |
| 136 | 137 |
| 137 var filename = args.rest.first; | 138 var filename = args.rest.first; |
| 138 var options = new ResolverOptions( | 139 var options = new CompilerOptions( |
| 140 dartSdkPath: sdkDir.path, |
| 139 useMultiPackage: args['use-multi-package'], | 141 useMultiPackage: args['use-multi-package'], |
| 140 packageRoot: args['package-root'], | 142 packageRoot: args['package-root'], |
| 141 packagePaths: args['package-paths'].split(',')); | 143 packagePaths: args['package-paths'].split(',')); |
| 142 | 144 |
| 143 var typeResolver = new TypeResolver.fromDir(sdkDir.path, options); | |
| 144 | |
| 145 Map json = JSON.decode(new File(filename).readAsStringSync()); | 145 Map json = JSON.decode(new File(filename).readAsStringSync()); |
| 146 var summary = GlobalSummary.parse(json); | 146 var summary = GlobalSummary.parse(json); |
| 147 var excludePattern = (args['exclude-pattern'] != null) | 147 var excludePattern = (args['exclude-pattern'] != null) |
| 148 ? new RegExp(args['exclude-pattern']) | 148 ? new RegExp(args['exclude-pattern']) |
| 149 : null; | 149 : null; |
| 150 var includePattern = (args['include-pattern'] != null) | 150 var includePattern = (args['include-pattern'] != null) |
| 151 ? new RegExp(args['include-pattern']) | 151 ? new RegExp(args['include-pattern']) |
| 152 : null; | 152 : null; |
| 153 | 153 |
| 154 var visitor = new EditFileSummaryVisitor(typeResolver, args['level'], | 154 var context = createAnalysisContext(options); |
| 155 var visitor = new EditFileSummaryVisitor(context, args['level'], |
| 155 args['checkout-files-executable'], args['checkout-files-arg'], | 156 args['checkout-files-executable'], args['checkout-files-arg'], |
| 156 includePattern, excludePattern); | 157 includePattern, excludePattern); |
| 157 summary.accept(visitor); | 158 summary.accept(visitor); |
| 158 visitor.build(); | 159 visitor.build(); |
| 159 } | 160 } |
| OLD | NEW |