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.error_formatter; | 5 library analyzer_cli.src.error_formatter; |
6 | 6 |
7 import 'package:analyzer/src/generated/engine.dart'; | 7 import 'package:analyzer/src/generated/engine.dart'; |
8 import 'package:analyzer/src/generated/error.dart'; | 8 import 'package:analyzer/src/generated/error.dart'; |
9 import 'package:analyzer/src/generated/source.dart'; | 9 import 'package:analyzer/src/generated/source.dart'; |
10 import 'package:analyzer_cli/src/options.dart'; | 10 import 'package:analyzer_cli/src/options.dart'; |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 } else { | 98 } else { |
99 out.writeln("No issues found"); | 99 out.writeln("No issues found"); |
100 } | 100 } |
101 } | 101 } |
102 } | 102 } |
103 | 103 |
104 /// Helper for formatting [AnalysisError]s. | 104 /// Helper for formatting [AnalysisError]s. |
105 /// The two format options are a user consumable format and a machine consumable | 105 /// The two format options are a user consumable format and a machine consumable |
106 /// format. | 106 /// format. |
107 class ErrorFormatter { | 107 class ErrorFormatter { |
| 108 static final int _pipeCodeUnit = '|'.codeUnitAt(0); |
| 109 static final int _slashCodeUnit = '\\'.codeUnitAt(0); |
| 110 |
108 final StringSink out; | 111 final StringSink out; |
109 final CommandLineOptions options; | 112 final CommandLineOptions options; |
110 final AnalysisStats stats; | 113 final AnalysisStats stats; |
| 114 |
111 final _SeverityProcessor processSeverity; | 115 final _SeverityProcessor processSeverity; |
112 | 116 |
113 ErrorFormatter(this.out, this.options, this.stats, | 117 ErrorFormatter(this.out, this.options, this.stats, |
114 [this.processSeverity = _identity]); | 118 [this.processSeverity = _identity]); |
115 | 119 |
116 /// Compute the severity for this [error] or `null` if this error should be | 120 /// Compute the severity for this [error] or `null` if this error should be |
117 /// filtered. | 121 /// filtered. |
118 ErrorSeverity computeSeverity(AnalysisError error) => | 122 ErrorSeverity computeSeverity(AnalysisError error) => |
119 processSeverity(error)?.severity; | 123 processSeverity(error)?.severity; |
120 | 124 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 } | 164 } |
161 } | 165 } |
162 | 166 |
163 // [warning] 'foo' is not a... (/Users/.../tmp/foo.dart, line 1, col 2) | 167 // [warning] 'foo' is not a... (/Users/.../tmp/foo.dart, line 1, col 2) |
164 out.write('[$errorType] ${error.message} '); | 168 out.write('[$errorType] ${error.message} '); |
165 out.write('(${source.fullName}'); | 169 out.write('(${source.fullName}'); |
166 out.write(', line ${location.lineNumber}, col ${location.columnNumber})'); | 170 out.write(', line ${location.lineNumber}, col ${location.columnNumber})'); |
167 } | 171 } |
168 out.writeln(); | 172 out.writeln(); |
169 } | 173 } |
170 | |
171 void formatErrors(List<AnalysisErrorInfo> errorInfos) { | 174 void formatErrors(List<AnalysisErrorInfo> errorInfos) { |
172 stats.unfilteredCount += errorInfos.length; | 175 stats.unfilteredCount += errorInfos.length; |
173 | 176 |
174 var errors = new List<AnalysisError>(); | 177 var errors = new List<AnalysisError>(); |
175 var errorToLine = new Map<AnalysisError, LineInfo>(); | 178 var errorToLine = new Map<AnalysisError, LineInfo>(); |
176 for (AnalysisErrorInfo errorInfo in errorInfos) { | 179 for (AnalysisErrorInfo errorInfo in errorInfos) { |
177 for (AnalysisError error in errorInfo.errors) { | 180 for (AnalysisError error in errorInfo.errors) { |
178 if (computeSeverity(error) != null) { | 181 if (computeSeverity(error) != null) { |
179 errors.add(error); | 182 errors.add(error); |
180 errorToLine[error] = errorInfo.lineInfo; | 183 errorToLine[error] = errorInfo.lineInfo; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 } else if (error.errorCode.type == ErrorType.HINT) { | 219 } else if (error.errorCode.type == ErrorType.HINT) { |
217 stats.hintCount++; | 220 stats.hintCount++; |
218 } else if (error.errorCode.type == ErrorType.LINT) { | 221 } else if (error.errorCode.type == ErrorType.LINT) { |
219 stats.lintCount++; | 222 stats.lintCount++; |
220 } | 223 } |
221 formatError(errorToLine, error); | 224 formatError(errorToLine, error); |
222 } | 225 } |
223 } | 226 } |
224 | 227 |
225 static String escapePipe(String input) { | 228 static String escapePipe(String input) { |
226 var result = new StringBuffer(); | 229 StringBuffer result = new StringBuffer(); |
227 for (var c in input.codeUnits) { | 230 for (int c in input.codeUnits) { |
228 if (c == '\\' || c == '|') { | 231 if (c == _slashCodeUnit || c == _pipeCodeUnit) { |
229 result.write('\\'); | 232 result.write('\\'); |
230 } | 233 } |
231 result.writeCharCode(c); | 234 result.writeCharCode(c); |
232 } | 235 } |
233 return result.toString(); | 236 return result.toString(); |
234 } | 237 } |
235 } | 238 } |
236 | 239 |
237 /// A severity with awareness of whether it was overridden by a processor. | 240 /// A severity with awareness of whether it was overridden by a processor. |
238 class ProcessedSeverity { | 241 class ProcessedSeverity { |
239 ErrorSeverity severity; | 242 ErrorSeverity severity; |
240 bool overridden; | 243 bool overridden; |
241 ProcessedSeverity(this.severity, [this.overridden = false]); | 244 ProcessedSeverity(this.severity, [this.overridden = false]); |
242 } | 245 } |
OLD | NEW |