| Index: pkg/polymer/lib/src/messages.dart
|
| diff --git a/pkg/polymer/lib/src/messages.dart b/pkg/polymer/lib/src/messages.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5dc62475fe0279207e9abe9ce0e4af461417cf77
|
| --- /dev/null
|
| +++ b/pkg/polymer/lib/src/messages.dart
|
| @@ -0,0 +1,149 @@
|
| +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +library messages;
|
| +
|
| +import 'dart:json' as json;
|
| +
|
| +import 'package:barback/barback.dart' show TransformLogger;
|
| +import 'package:source_maps/span.dart' show Span;
|
| +import 'package:logging/logging.dart' show Level;
|
| +
|
| +import 'compiler_options.dart';
|
| +import 'utils.dart';
|
| +
|
| +/** Map between error levels and their display color. */
|
| +final Map<Level, String> _ERROR_COLORS = (() {
|
| + var colorsMap = new Map<Level, String>();
|
| + colorsMap[Level.SEVERE] = RED_COLOR;
|
| + colorsMap[Level.WARNING] = MAGENTA_COLOR;
|
| + colorsMap[Level.INFO] = GREEN_COLOR;
|
| + return colorsMap;
|
| +})();
|
| +
|
| +/** A single message from the compiler. */
|
| +class Message {
|
| + final Level level;
|
| + final String message;
|
| + final Span span;
|
| + final bool useColors;
|
| +
|
| + Message(this.level, this.message, {this.span, this.useColors: false});
|
| +
|
| + String get kind => level == Level.SEVERE ? 'error' :
|
| + (level == Level.WARNING ? 'warning' : 'info');
|
| +
|
| + String toString() {
|
| + var output = new StringBuffer();
|
| + bool colors = useColors && _ERROR_COLORS.containsKey(level);
|
| + var levelColor = _ERROR_COLORS[level];
|
| + if (colors) output.write(levelColor);
|
| + output..write(kind)..write(' ');
|
| + if (colors) output.write(NO_COLOR);
|
| +
|
| + if (span == null) {
|
| + output.write(message);
|
| + } else {
|
| + output.write(span.getLocationMessage(message, useColors: colors,
|
| + color: levelColor));
|
| + }
|
| +
|
| + return output.toString();
|
| + }
|
| +
|
| + String toJson() {
|
| + if (span == null) return toString();
|
| + return json.stringify([{
|
| + 'method': kind,
|
| + 'params': {
|
| + 'file': span.sourceUrl,
|
| + 'message': message,
|
| + 'line': span.start.line + 1,
|
| + 'charStart': span.start.offset,
|
| + 'charEnd': span.end.offset,
|
| + }
|
| + }]);
|
| + }
|
| +}
|
| +
|
| +/**
|
| + * This class tracks and prints information, warnings, and errors emitted by the
|
| + * compiler.
|
| + */
|
| +class Messages implements TransformLogger {
|
| + final CompilerOptions options;
|
| + final bool shouldPrint;
|
| +
|
| + final List<Message> messages = <Message>[];
|
| +
|
| + Messages({CompilerOptions options, this.shouldPrint: true})
|
| + : options = options != null ? options : new CompilerOptions();
|
| +
|
| + /**
|
| + * Creates a new instance of [Messages] which doesn't write messages to
|
| + * the console.
|
| + */
|
| + Messages.silent(): this(shouldPrint: false);
|
| +
|
| + /**
|
| + * True if we have an error that prevents correct codegen.
|
| + * For example, if we failed to read an input file.
|
| + */
|
| + bool get hasErrors => messages.any((m) => m.level == Level.SEVERE);
|
| +
|
| + // Convenience methods for testing
|
| + int get length => messages.length;
|
| +
|
| + Message operator[](int index) => messages[index];
|
| +
|
| + void clear() {
|
| + messages.clear();
|
| + }
|
| +
|
| + /** [message] is considered a static compile-time error by the Dart lang. */
|
| + void error(String message, [Span span]) {
|
| + var msg = new Message(Level.SEVERE, message, span: span,
|
| + useColors: options.useColors);
|
| +
|
| + messages.add(msg);
|
| + printMessage(msg);
|
| + }
|
| +
|
| + /** [message] is considered a type warning by the Dart lang. */
|
| + void warning(String message, [Span span]) {
|
| + if (options.warningsAsErrors) {
|
| + error(message, span);
|
| + } else {
|
| + var msg = new Message(Level.WARNING, message,
|
| + span: span, useColors: options.useColors);
|
| +
|
| + messages.add(msg);
|
| + printMessage(msg);
|
| + }
|
| + }
|
| +
|
| + /// the list of error messages. Empty list, if there are no error messages.
|
| + List<Message> get errors =>
|
| + messages.where((m) => m.level == Level.SEVERE).toList();
|
| +
|
| + /// the list of warning messages. Empty list if there are no warning messages.
|
| + List<Message> get warnings =>
|
| + messages.where((m) => m.level == Level.WARNING).toList();
|
| +
|
| + /**
|
| + * [message] at [span] will tell the user about what the compiler
|
| + * is doing.
|
| + */
|
| + void info(String message, [Span span]) {
|
| + var msg = new Message(Level.INFO, message, span: span,
|
| + useColors: options.useColors);
|
| +
|
| + messages.add(msg);
|
| + if (options.verbose) printMessage(msg);
|
| + }
|
| +
|
| + void printMessage(msg) {
|
| + if (shouldPrint) print(options.jsonFormat ? msg.toJson() : msg);
|
| + }
|
| +}
|
|
|