OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library analyzer_cli.src.analyzer_impl; | 5 library analyzer_cli.src.analyzer_impl; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:collection'; | 8 import 'dart:collection'; |
9 import 'dart:io'; | 9 import 'dart:io'; |
10 | 10 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 /// specified on the command line as though it is reached via a "package:" | 59 /// specified on the command line as though it is reached via a "package:" |
60 /// URI, but avoid suppressing its output in the event that the user has not | 60 /// URI, but avoid suppressing its output in the event that the user has not |
61 /// specified the "--package-warnings" option. | 61 /// specified the "--package-warnings" option. |
62 String _selfPackageName; | 62 String _selfPackageName; |
63 | 63 |
64 AnalyzerImpl(this.analysisOptions, this.context, this.analysisDriver, | 64 AnalyzerImpl(this.analysisOptions, this.context, this.analysisDriver, |
65 this.librarySource, this.options, this.stats, this.startTime); | 65 this.librarySource, this.options, this.stats, this.startTime); |
66 | 66 |
67 /// Returns the maximal [ErrorSeverity] of the recorded errors. | 67 /// Returns the maximal [ErrorSeverity] of the recorded errors. |
68 ErrorSeverity get maxErrorSeverity { | 68 ErrorSeverity get maxErrorSeverity { |
69 var status = ErrorSeverity.NONE; | 69 ErrorSeverity status = ErrorSeverity.NONE; |
70 for (AnalysisErrorInfo errorInfo in errorInfos) { | 70 for (AnalysisErrorInfo errorInfo in errorInfos) { |
71 for (AnalysisError error in errorInfo.errors) { | 71 for (AnalysisError error in errorInfo.errors) { |
72 if (_processError(error) == null) { | 72 if (_defaultSeverityProcessor(error) == null) { |
73 continue; | 73 continue; |
74 } | 74 } |
75 var severity = computeSeverity(error, options); | 75 ErrorSeverity severity = computeSeverity(error, options); |
76 status = status.max(severity); | 76 status = status.max(severity); |
77 } | 77 } |
78 } | 78 } |
79 return status; | 79 return status; |
80 } | 80 } |
81 | 81 |
82 void addCompilationUnitSource( | 82 void addCompilationUnitSource( |
83 CompilationUnitElement unit, Set<CompilationUnitElement> units) { | 83 CompilationUnitElement unit, Set<CompilationUnitElement> units) { |
84 if (unit == null || !units.add(unit)) { | 84 if (unit == null || !units.add(unit)) { |
85 return; | 85 return; |
(...skipping 25 matching lines...) Expand all Loading... |
111 for (LibraryElement child in library.exportedLibraries) { | 111 for (LibraryElement child in library.exportedLibraries) { |
112 addLibrarySources(child, libraries, units); | 112 addLibrarySources(child, libraries, units); |
113 } | 113 } |
114 } | 114 } |
115 | 115 |
116 /// Treats the [sourcePath] as the top level library and analyzes it using | 116 /// Treats the [sourcePath] as the top level library and analyzes it using |
117 /// the analysis engine. If [printMode] is `0`, then no error or performance | 117 /// the analysis engine. If [printMode] is `0`, then no error or performance |
118 /// information is printed. If [printMode] is `1`, then errors will be printed
. | 118 /// information is printed. If [printMode] is `1`, then errors will be printed
. |
119 /// If [printMode] is `2`, then performance information will be printed, and | 119 /// If [printMode] is `2`, then performance information will be printed, and |
120 /// it will be marked as being for a cold VM. | 120 /// it will be marked as being for a cold VM. |
121 Future<ErrorSeverity> analyze({int printMode: 1}) async { | 121 Future<ErrorSeverity> analyze(ErrorFormatter formatter, |
| 122 {int printMode: 1}) async { |
122 setupForAnalysis(); | 123 setupForAnalysis(); |
123 return await _analyze(printMode); | 124 return await _analyze(printMode, formatter); |
124 } | 125 } |
125 | 126 |
126 /// Fills [errorInfos] using [sources]. | 127 /// Fills [errorInfos] using [sources]. |
127 Future<Null> prepareErrors() async { | 128 Future<Null> prepareErrors() async { |
128 PerformanceTag previous = _prepareErrorsTag.makeCurrent(); | 129 PerformanceTag previous = _prepareErrorsTag.makeCurrent(); |
129 try { | 130 try { |
130 for (Source source in sources) { | 131 for (Source source in sources) { |
131 if (analysisDriver != null) { | 132 if (analysisDriver != null) { |
132 String path = source.fullName; | 133 String path = source.fullName; |
133 ErrorsResult errorsResult = await analysisDriver.getErrors(path); | 134 ErrorsResult errorsResult = await analysisDriver.getErrors(path); |
(...skipping 19 matching lines...) Expand all Loading... |
153 /// Setup local fields such as the analysis context for analysis. | 154 /// Setup local fields such as the analysis context for analysis. |
154 void setupForAnalysis() { | 155 void setupForAnalysis() { |
155 sources.clear(); | 156 sources.clear(); |
156 errorInfos.clear(); | 157 errorInfos.clear(); |
157 Uri libraryUri = librarySource.uri; | 158 Uri libraryUri = librarySource.uri; |
158 if (libraryUri.scheme == 'package' && libraryUri.pathSegments.length > 0) { | 159 if (libraryUri.scheme == 'package' && libraryUri.pathSegments.length > 0) { |
159 _selfPackageName = libraryUri.pathSegments[0]; | 160 _selfPackageName = libraryUri.pathSegments[0]; |
160 } | 161 } |
161 } | 162 } |
162 | 163 |
163 Future<ErrorSeverity> _analyze(int printMode) async { | 164 Future<ErrorSeverity> _analyze( |
| 165 int printMode, ErrorFormatter formatter) async { |
164 // Don't try to analyze parts. | 166 // Don't try to analyze parts. |
165 String path = librarySource.fullName; | 167 String path = librarySource.fullName; |
166 SourceKind librarySourceKind = analysisDriver != null | 168 SourceKind librarySourceKind = analysisDriver != null |
167 ? await analysisDriver.getSourceKind(path) | 169 ? await analysisDriver.getSourceKind(path) |
168 : context.computeKindOf(librarySource); | 170 : context.computeKindOf(librarySource); |
169 if (librarySourceKind == SourceKind.PART) { | 171 if (librarySourceKind == SourceKind.PART) { |
170 stderr.writeln("Only libraries can be analyzed."); | 172 stderr.writeln("Only libraries can be analyzed."); |
171 stderr.writeln("${path} is a part and can not be analyzed."); | 173 stderr.writeln("${path} is a part and can not be analyzed."); |
172 return ErrorSeverity.ERROR; | 174 return ErrorSeverity.ERROR; |
173 } | 175 } |
174 | 176 |
175 LibraryElement libraryElement = await _resolveLibrary(); | 177 LibraryElement libraryElement = await _resolveLibrary(); |
176 prepareSources(libraryElement); | 178 prepareSources(libraryElement); |
177 await prepareErrors(); | 179 await prepareErrors(); |
178 | 180 |
179 // Print errors and performance numbers. | 181 // Print errors and performance numbers. |
180 if (printMode == 1) { | 182 if (printMode == 1) { |
181 _printErrors(); | 183 formatter.formatErrors(errorInfos); |
182 } else if (printMode == 2) { | 184 } else if (printMode == 2) { |
183 _printColdPerf(); | 185 _printColdPerf(); |
184 } | 186 } |
185 | 187 |
186 // Compute max severity and set exitCode. | 188 // Compute max severity and set exitCode. |
187 ErrorSeverity status = maxErrorSeverity; | 189 ErrorSeverity status = maxErrorSeverity; |
188 if (status == ErrorSeverity.WARNING && options.warningsAreFatal) { | 190 if (status == ErrorSeverity.WARNING && options.warningsAreFatal) { |
189 status = ErrorSeverity.ERROR; | 191 status = ErrorSeverity.ERROR; |
190 } | 192 } |
191 return status; | 193 return status; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 if (tag != PerformanceTag.UNKNOWN) { | 235 if (tag != PerformanceTag.UNKNOWN) { |
234 int tagTime = tag.elapsedMs; | 236 int tagTime = tag.elapsedMs; |
235 outSink.writeln('${tag.label}-cold:$tagTime'); | 237 outSink.writeln('${tag.label}-cold:$tagTime'); |
236 otherTime -= tagTime; | 238 otherTime -= tagTime; |
237 } | 239 } |
238 } | 240 } |
239 outSink.writeln('other-cold:$otherTime'); | 241 outSink.writeln('other-cold:$otherTime'); |
240 outSink.writeln("total-cold:$totalTime"); | 242 outSink.writeln("total-cold:$totalTime"); |
241 } | 243 } |
242 | 244 |
243 void _printErrors() { | 245 ProcessedSeverity _defaultSeverityProcessor(AnalysisError error) => |
244 // The following is a hack. We currently print out to stderr to ensure that | 246 determineProcessedSeverity(error, options, analysisOptions); |
245 // when in batch mode we print to stderr, this is because the prints from | |
246 // batch are made to stderr. The reason that options.shouldBatch isn't used | |
247 // is because when the argument flags are constructed in BatchRunner and | |
248 // passed in from batch mode which removes the batch flag to prevent the | |
249 // "cannot have the batch flag and source file" error message. | |
250 StringSink sink = options.machineFormat ? errorSink : outSink; | |
251 | |
252 // Print errors. | |
253 ErrorFormatter formatter = | |
254 new ErrorFormatter(sink, options, stats, _processError); | |
255 formatter.formatErrors(errorInfos); | |
256 } | |
257 | |
258 ProcessedSeverity _processError(AnalysisError error) => | |
259 processError(error, options, analysisOptions); | |
260 | 247 |
261 Future<LibraryElement> _resolveLibrary() async { | 248 Future<LibraryElement> _resolveLibrary() async { |
262 PerformanceTag previous = _resolveLibraryTag.makeCurrent(); | 249 PerformanceTag previous = _resolveLibraryTag.makeCurrent(); |
263 try { | 250 try { |
264 if (analysisDriver != null) { | 251 if (analysisDriver != null) { |
265 String path = librarySource.fullName; | 252 String path = librarySource.fullName; |
266 analysisDriver.priorityFiles = [path]; | 253 analysisDriver.priorityFiles = [path]; |
267 UnitElementResult elementResult = | 254 UnitElementResult elementResult = |
268 await analysisDriver.getUnitElement(path); | 255 await analysisDriver.getUnitElement(path); |
269 return elementResult.element.library; | 256 return elementResult.element.library; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 } | 308 } |
322 | 309 |
323 @override | 310 @override |
324 void logInformation(String message, [CaughtException exception]) { | 311 void logInformation(String message, [CaughtException exception]) { |
325 outSink.writeln(message); | 312 outSink.writeln(message); |
326 if (exception != null) { | 313 if (exception != null) { |
327 outSink.writeln(exception); | 314 outSink.writeln(exception); |
328 } | 315 } |
329 } | 316 } |
330 } | 317 } |
OLD | NEW |