| Index: lib/src/report.dart
|
| diff --git a/lib/src/report.dart b/lib/src/report.dart
|
| index a694c40428b5b251277a475bd756e0f40ec43891..0e85a4a6e4104ed8dd3fd59c9b8d6dbdd1e4b7c9 100644
|
| --- a/lib/src/report.dart
|
| +++ b/lib/src/report.dart
|
| @@ -7,123 +7,73 @@ library dev_compiler.src.report;
|
|
|
| import 'dart:math' show max;
|
|
|
| -import 'package:analyzer/src/generated/ast.dart' show AstNode, CompilationUnit;
|
| import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
|
| -import 'package:analyzer/src/generated/source.dart' show Source;
|
| +import 'package:analyzer/src/generated/error.dart';
|
| import 'package:logging/logging.dart';
|
| import 'package:path/path.dart' as path;
|
| import 'package:source_span/source_span.dart';
|
|
|
| -import 'info.dart';
|
| import 'utils.dart';
|
| import 'summary.dart';
|
|
|
| -/// A message (error or warning) produced by the dev_compiler and it's location
|
| -/// information.
|
| -///
|
| -/// Currently the location information includes only the offsets within a file
|
| -/// where the error occurs. This is used in the context of a [CheckerReporter],
|
| -/// where the current file is being tracked.
|
| -class Message {
|
| - // Message description.
|
| - final String message;
|
| -
|
| - /// Log level. This is a placeholder for severity.
|
| - final Level level;
|
| -
|
| - /// Offset where the error message begins in the tracked source file.
|
| - final int begin;
|
| -
|
| - /// Offset where the error message ends in the tracked source file.
|
| - final int end;
|
| -
|
| - const Message(this.message, this.level, this.begin, this.end);
|
| -}
|
| +final _checkerLogger = new Logger('dev_compiler.checker');
|
|
|
| -// Interface used to report error messages from the checker.
|
| -abstract class CheckerReporter {
|
| - void log(Message message);
|
| +SourceSpanWithContext _toSpan(AnalysisContext context, AnalysisError error) {
|
| + var source = error.source;
|
| + var lineInfo = context.computeLineInfo(source);
|
| + var content = context.getContents(source).data;
|
| + var start = error.offset;
|
| + var end = start + error.length;
|
| + return createSpanHelper(lineInfo, start, end, source, content);
|
| }
|
| -
|
| -// Interface used to report error messages from the compiler.
|
| -abstract class CompilerReporter extends CheckerReporter {
|
| +/// Simple reporter that logs checker messages as they are seen.
|
| +class LogReporter implements AnalysisErrorListener {
|
| final AnalysisContext _context;
|
| - CompilationUnit _unit;
|
| - Source _unitSource;
|
| -
|
| - CompilerReporter(this._context);
|
| -
|
| - /// Called when starting to process a library.
|
| - void enterLibrary(Uri uri);
|
| - void leaveLibrary();
|
| -
|
| - /// Called when starting to process an HTML source file.
|
| - void enterHtml(Uri uri);
|
| - void leaveHtml();
|
| -
|
| - /// Called when starting to process a source. All subsequent log entries must
|
| - /// belong to this source until the next call to enterSource.
|
| - void enterCompilationUnit(CompilationUnit unit, [Source source]) {
|
| - _unit = unit;
|
| - _unitSource = source;
|
| - }
|
| - void leaveCompilationUnit() {
|
| - _unit = null;
|
| - _unitSource = null;
|
| - }
|
| -
|
| - // Called in server-mode.
|
| - void clearLibrary(Uri uri);
|
| - void clearHtml(Uri uri);
|
| - void clearAll();
|
| + final bool useColors;
|
|
|
| - SourceSpanWithContext _createSpan(int start, int end) =>
|
| - createSpan(_context, _unit, start, end, _unitSource);
|
| -}
|
| + LogReporter(this._context, {this.useColors: false});
|
|
|
| -final _checkerLogger = new Logger('dev_compiler.checker');
|
| + void onError(AnalysisError error) {
|
| + var level = _severityToLevel[error.errorCode.errorSeverity];
|
|
|
| -/// Simple reporter that logs checker messages as they are seen.
|
| -class LogReporter extends CompilerReporter {
|
| - final bool useColors;
|
| - Source _current;
|
| -
|
| - LogReporter(AnalysisContext context, {this.useColors: false})
|
| - : super(context);
|
| + // Upgrade analyzer warnings to errors.
|
| + // TODO(jmesserly: reconcile this...
|
| + if (!error.errorCode.name.startsWith('dev_compiler.') &&
|
| + level == Level.WARNING) {
|
| + level = Level.SEVERE;
|
| + }
|
|
|
| - void enterLibrary(Uri uri) {}
|
| - void leaveLibrary() {}
|
| + var color = useColors ? colorOf(level.name) : null;
|
|
|
| - void enterHtml(Uri uri) {}
|
| - void leaveHtml() {}
|
| + // TODO(jmesserly): figure out what to do with the error's name.
|
| + var text = '[${errorCodeName(error.errorCode)}] ' + error.message;
|
| + text = _toSpan(_context, error).message(text, color: color);
|
|
|
| - void log(Message message) {
|
| - if (message is StaticInfo) {
|
| - assert(message.node.root == _unit);
|
| - }
|
| - // TODO(sigmund): convert to use span information from AST (issue #73)
|
| - final span = _createSpan(message.begin, message.end);
|
| - final level = message.level;
|
| - final color = useColors ? colorOf(level.name) : null;
|
| - final text = '[${message.runtimeType}] ${message.message}';
|
| - _checkerLogger.log(level, span.message(text, color: color));
|
| + // TODO(jmesserly): just print these instead of sending through logger?
|
| + _checkerLogger.log(level, text);
|
| }
|
| -
|
| - void clearLibrary(Uri uri) {}
|
| - void clearHtml(Uri uri) {}
|
| - void clearAll() {}
|
| }
|
|
|
| +// TODO(jmesserly): remove log levels, instead just use severity.
|
| +const _severityToLevel = const {
|
| + ErrorSeverity.ERROR: Level.SEVERE,
|
| + ErrorSeverity.WARNING: Level.WARNING,
|
| + ErrorSeverity.INFO: Level.INFO
|
| +};
|
| +
|
| /// A reporter that gathers all the information in a [GlobalSummary].
|
| -class SummaryReporter extends CompilerReporter {
|
| +class SummaryReporter implements AnalysisErrorListener {
|
| GlobalSummary result = new GlobalSummary();
|
| - IndividualSummary _current;
|
| final Level _level;
|
| + final AnalysisContext _context;
|
| +
|
| + SummaryReporter(this._context, [this._level = Level.ALL]);
|
|
|
| - SummaryReporter(AnalysisContext context, [this._level = Level.ALL])
|
| - : super(context);
|
| + IndividualSummary _getIndividualSummary(Uri uri) {
|
| + if (uri.path.endsWith('.html')) {
|
| + return result.loose.putIfAbsent('$uri', () => new HtmlSummary('$uri'));
|
| + }
|
|
|
| - void enterLibrary(Uri uri) {
|
| var container;
|
| if (uri.scheme == 'package') {
|
| var pname = path.split(uri.path)[0];
|
| @@ -134,53 +84,31 @@ class SummaryReporter extends CompilerReporter {
|
| } else {
|
| container = result.loose;
|
| }
|
| - _current = container.putIfAbsent('$uri', () => new LibrarySummary('$uri'));
|
| - }
|
| -
|
| - void leaveLibrary() {
|
| - _current = null;
|
| + return container.putIfAbsent('$uri', () => new LibrarySummary('$uri'));
|
| }
|
|
|
| - void enterHtml(Uri uri) {
|
| - _current = result.loose.putIfAbsent('$uri', () => new HtmlSummary('$uri'));
|
| - }
|
| -
|
| - void leaveHtml() {
|
| - _current = null;
|
| - }
|
| + void onError(AnalysisError error) {
|
| + // Only summarize messages per configured logging level
|
| + var code = error.errorCode;
|
| + if (_severityToLevel[code.errorSeverity] < _level) return;
|
|
|
| - @override
|
| - void enterCompilationUnit(CompilationUnit unit, [Source source]) {
|
| - super.enterCompilationUnit(unit, source);
|
| - if (_current is LibrarySummary) {
|
| - int lines = _unit.lineInfo.getLocation(_unit.endToken.end).lineNumber;
|
| - (_current as LibrarySummary).lines += lines;
|
| + var span = _toSpan(_context, error);
|
| + var summary = _getIndividualSummary(error.source.uri);
|
| + if (summary is LibrarySummary) {
|
| + summary.countSourceLines(_context, error.source);
|
| }
|
| - }
|
| -
|
| - void log(Message message) {
|
| - // Only summarize messages per configured logging level
|
| - if (message.level < _level) return;
|
| - final span = _createSpan(message.begin, message.end);
|
| - _current.messages.add(new MessageSummary('${message.runtimeType}',
|
| - message.level.name.toLowerCase(), span, message.message));
|
| + summary.messages.add(new MessageSummary(
|
| + errorCodeName(code), code.errorSeverity.displayName, span, error.message));
|
| }
|
|
|
| void clearLibrary(Uri uri) {
|
| - enterLibrary(uri);
|
| - _current.messages.clear();
|
| - (_current as LibrarySummary).lines = 0;
|
| - leaveLibrary();
|
| + (_getIndividualSummary(uri) as LibrarySummary).clear();
|
| }
|
|
|
| void clearHtml(Uri uri) {
|
| HtmlSummary htmlSummary = result.loose['$uri'];
|
| if (htmlSummary != null) htmlSummary.messages.clear();
|
| }
|
| -
|
| - clearAll() {
|
| - result = new GlobalSummary();
|
| - }
|
| }
|
|
|
| /// Produces a string representation of the summary.
|
|
|