| Index: lib/src/report.dart
|
| diff --git a/lib/src/report.dart b/lib/src/report.dart
|
| index 6c74fe1ee2c435217d4c3273bac07f1a8ecb2238..3f164c0f263187c02b9f866f44055441f62467fd 100644
|
| --- a/lib/src/report.dart
|
| +++ b/lib/src/report.dart
|
| @@ -6,6 +6,7 @@
|
| library dev_compiler.src.report;
|
|
|
| import 'dart:math' show max;
|
| +import 'dart:io';
|
|
|
| import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
|
| import 'package:analyzer/src/generated/error.dart';
|
| @@ -20,13 +21,18 @@ final _checkerLogger = new Logger('dev_compiler.checker');
|
|
|
| /// Collects errors, and then sorts them and sends them
|
| class ErrorCollector implements AnalysisErrorListener {
|
| + final AnalysisContext context;
|
| final AnalysisErrorListener listener;
|
| final List<AnalysisError> _errors = [];
|
| + final bool saveMessages;
|
| + final Level logLevel;
|
|
|
| - ErrorCollector(this.listener);
|
| + ErrorCollector(this.context, AnalysisErrorListener listener, this.logLevel,
|
| + {this.saveMessages: false})
|
| + : listener = listener ?? AnalysisErrorListener.NULL_LISTENER;
|
|
|
| /// Flushes errors to the log. Until this is called, errors are buffered.
|
| - void flush() {
|
| + void flush(String messagePath) {
|
| // TODO(jmesserly): this code was taken from analyzer_cli.
|
| // sort errors
|
| _errors.sort((AnalysisError error1, AnalysisError error2) {
|
| @@ -49,7 +55,27 @@ class ErrorCollector implements AnalysisErrorListener {
|
| return error1.message.compareTo(error2.message);
|
| });
|
|
|
| - _errors.forEach(listener.onError);
|
| + if (saveMessages && messagePath != null) {
|
| + var text = new StringBuffer();
|
| + for (var e in _errors) {
|
| + // TODO(jmesserly): don't use log level for this.
|
| + var level = _severityToLevel[_strongModeErrorSeverity(e)];
|
| + if (level >= logLevel) {
|
| + text
|
| + ..write(level.name.toLowerCase())
|
| + ..write(': ')
|
| + ..writeln(_messageToString(context, e));
|
| + }
|
| + }
|
| + var messageFile = new File(messagePath);
|
| + if (text.isNotEmpty) {
|
| + messageFile.writeAsStringSync(text.toString());
|
| + } else if (messageFile.existsSync()) {
|
| + messageFile.deleteSync();
|
| + }
|
| + } else {
|
| + _errors.forEach(listener.onError);
|
| + }
|
| _errors.clear();
|
| }
|
|
|
| @@ -72,28 +98,29 @@ ErrorSeverity _strongModeErrorSeverity(AnalysisError error) {
|
| /// Simple reporter that logs checker messages as they are seen.
|
| class LogReporter implements AnalysisErrorListener {
|
| final AnalysisContext _context;
|
| - final bool useColors;
|
| - final List<AnalysisError> _errors = [];
|
|
|
| - LogReporter(this._context, {this.useColors: false});
|
| + LogReporter(this._context);
|
|
|
| void onError(AnalysisError error) {
|
| var level = _severityToLevel[_strongModeErrorSeverity(error)];
|
| + // TODO(jmesserly): just print these instead of sending through logger?
|
| + _checkerLogger.log(level, _messageToString(_context, error));
|
| + }
|
| +}
|
|
|
| - // TODO(jmesserly): figure out what to do with the error's name.
|
| - var lineInfo = _context.computeLineInfo(error.source);
|
| - var location = lineInfo.getLocation(error.offset);
|
| +String _messageToString(AnalysisContext context, AnalysisError error) {
|
| + // TODO(jmesserly): figure out what to do with the error's name.
|
| + var lineInfo = context.computeLineInfo(error.source);
|
| + var location = lineInfo.getLocation(error.offset);
|
|
|
| - // [warning] 'foo' is not a... (/Users/.../tmp/foo.dart, line 1, col 2)
|
| - var text = new StringBuffer()
|
| - ..write('[${errorCodeName(error.errorCode)}] ')
|
| - ..write(error.message)
|
| - ..write(' (${path.prettyUri(error.source.uri)}')
|
| - ..write(', line ${location.lineNumber}, col ${location.columnNumber})');
|
| + // [warning] 'foo' is not a... (/Users/.../tmp/foo.dart, line 1, col 2)
|
| + var text = new StringBuffer()
|
| + ..write('[${errorCodeName(error.errorCode)}] ')
|
| + ..write(error.message)
|
| + ..write(' (${path.prettyUri(error.source.uri)}')
|
| + ..write(', line ${location.lineNumber}, col ${location.columnNumber})');
|
|
|
| - // TODO(jmesserly): just print these instead of sending through logger?
|
| - _checkerLogger.log(level, text);
|
| - }
|
| + return text.toString();
|
| }
|
|
|
| // TODO(jmesserly): remove log levels, instead just use severity.
|
|
|