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/error/error.dart'; | 7 import 'package:analyzer/error/error.dart'; |
8 import 'package:analyzer/src/generated/engine.dart'; | 8 import 'package:analyzer/src/generated/engine.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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 } | 101 } |
102 } | 102 } |
103 } | 103 } |
104 | 104 |
105 /// Helper for formatting [AnalysisError]s. | 105 /// Helper for formatting [AnalysisError]s. |
106 /// The two format options are a user consumable format and a machine consumable | 106 /// The two format options are a user consumable format and a machine consumable |
107 /// format. | 107 /// format. |
108 class ErrorFormatter { | 108 class ErrorFormatter { |
109 static final int _pipeCodeUnit = '|'.codeUnitAt(0); | 109 static final int _pipeCodeUnit = '|'.codeUnitAt(0); |
110 static final int _slashCodeUnit = '\\'.codeUnitAt(0); | 110 static final int _slashCodeUnit = '\\'.codeUnitAt(0); |
| 111 static final int _newline = '\n'.codeUnitAt(0); |
| 112 static final int _return = '\r'.codeUnitAt(0); |
111 | 113 |
112 final StringSink out; | 114 final StringSink out; |
113 final CommandLineOptions options; | 115 final CommandLineOptions options; |
114 final AnalysisStats stats; | 116 final AnalysisStats stats; |
115 | 117 |
116 final _SeverityProcessor processSeverity; | 118 final _SeverityProcessor processSeverity; |
117 | 119 |
118 ErrorFormatter(this.out, this.options, this.stats, | 120 ErrorFormatter(this.out, this.options, this.stats, |
119 [this.processSeverity = _identity]); | 121 [this.processSeverity = _identity]); |
120 | 122 |
(...skipping 16 matching lines...) Expand all Loading... |
137 if (severity == ErrorSeverity.WARNING && options.warningsAreFatal) { | 139 if (severity == ErrorSeverity.WARNING && options.warningsAreFatal) { |
138 severity = ErrorSeverity.ERROR; | 140 severity = ErrorSeverity.ERROR; |
139 } | 141 } |
140 } | 142 } |
141 out.write(severity); | 143 out.write(severity); |
142 out.write('|'); | 144 out.write('|'); |
143 out.write(error.errorCode.type); | 145 out.write(error.errorCode.type); |
144 out.write('|'); | 146 out.write('|'); |
145 out.write(error.errorCode.name); | 147 out.write(error.errorCode.name); |
146 out.write('|'); | 148 out.write('|'); |
147 out.write(escapePipe(source.fullName)); | 149 out.write(escapeForMachineMode(source.fullName)); |
148 out.write('|'); | 150 out.write('|'); |
149 out.write(location.lineNumber); | 151 out.write(location.lineNumber); |
150 out.write('|'); | 152 out.write('|'); |
151 out.write(location.columnNumber); | 153 out.write(location.columnNumber); |
152 out.write('|'); | 154 out.write('|'); |
153 out.write(length); | 155 out.write(length); |
154 out.write('|'); | 156 out.write('|'); |
155 out.write(escapePipe(error.message)); | 157 out.write(escapeForMachineMode(error.message)); |
156 out.writeln(); | 158 out.writeln(); |
157 } else { | 159 } else { |
158 // Get display name. | 160 // Get display name. |
159 String errorType = severity.displayName; | 161 String errorType = severity.displayName; |
160 | 162 |
161 // Translate INFOs into LINTS and HINTS. | 163 // Translate INFOs into LINTS and HINTS. |
162 if (severity == ErrorSeverity.INFO) { | 164 if (severity == ErrorSeverity.INFO) { |
163 if (error.errorCode.type == ErrorType.HINT || | 165 if (error.errorCode.type == ErrorType.HINT || |
164 error.errorCode.type == ErrorType.LINT) { | 166 error.errorCode.type == ErrorType.LINT) { |
165 errorType = error.errorCode.type.displayName; | 167 errorType = error.errorCode.type.displayName; |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 } | 247 } |
246 } else if (error.errorCode.type == ErrorType.HINT) { | 248 } else if (error.errorCode.type == ErrorType.HINT) { |
247 stats.hintCount++; | 249 stats.hintCount++; |
248 } else if (error.errorCode.type == ErrorType.LINT) { | 250 } else if (error.errorCode.type == ErrorType.LINT) { |
249 stats.lintCount++; | 251 stats.lintCount++; |
250 } | 252 } |
251 formatError(errorToLine, error); | 253 formatError(errorToLine, error); |
252 } | 254 } |
253 } | 255 } |
254 | 256 |
255 static String escapePipe(String input) { | 257 static String escapeForMachineMode(String input) { |
256 StringBuffer result = new StringBuffer(); | 258 StringBuffer result = new StringBuffer(); |
257 for (int c in input.codeUnits) { | 259 for (int c in input.codeUnits) { |
258 if (c == _slashCodeUnit || c == _pipeCodeUnit) { | 260 if (c == _newline) { |
259 result.write('\\'); | 261 result.write(r'\n'); |
| 262 } else if (c == _return) { |
| 263 result.write(r'\r'); |
| 264 } else { |
| 265 if (c == _slashCodeUnit || c == _pipeCodeUnit) { |
| 266 result.write('\\'); |
| 267 } |
| 268 result.writeCharCode(c); |
260 } | 269 } |
261 result.writeCharCode(c); | |
262 } | 270 } |
263 return result.toString(); | 271 return result.toString(); |
264 } | 272 } |
265 } | 273 } |
266 | 274 |
267 /// A severity with awareness of whether it was overridden by a processor. | 275 /// A severity with awareness of whether it was overridden by a processor. |
268 class ProcessedSeverity { | 276 class ProcessedSeverity { |
269 ErrorSeverity severity; | 277 ErrorSeverity severity; |
270 bool overridden; | 278 bool overridden; |
271 ProcessedSeverity(this.severity, [this.overridden = false]); | 279 ProcessedSeverity(this.severity, [this.overridden = false]); |
272 } | 280 } |
273 | 281 |
274 /// Given an absolute path, return a relative path if the file is contained in | 282 /// Given an absolute path, return a relative path if the file is contained in |
275 /// the current directory; return the original path otherwise. | 283 /// the current directory; return the original path otherwise. |
276 String _relative(String file) { | 284 String _relative(String file) { |
277 return file.startsWith(path.current) ? path.relative(file) : file; | 285 return file.startsWith(path.current) ? path.relative(file) : file; |
278 } | 286 } |
OLD | NEW |