Index: mojo/public/dart/third_party/csslib/lib/src/messages.dart |
diff --git a/mojo/public/dart/third_party/csslib/lib/src/messages.dart b/mojo/public/dart/third_party/csslib/lib/src/messages.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..595bf6c58ac6a4c2ca296891daa38e13ca54df89 |
--- /dev/null |
+++ b/mojo/public/dart/third_party/csslib/lib/src/messages.dart |
@@ -0,0 +1,130 @@ |
+// 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 csslib.src.messages; |
+ |
+import 'package:logging/logging.dart' show Level; |
+import 'package:source_span/source_span.dart'; |
+ |
+import 'options.dart'; |
+ |
+// TODO(terry): Remove the global messages, use some object that tracks |
+// compilation state. |
+ |
+/** The global [Messages] for tracking info/warnings/messages. */ |
+Messages messages; |
+ |
+// Color constants used for generating messages. |
+final String GREEN_COLOR = '\u001b[32m'; |
+final String RED_COLOR = '\u001b[31m'; |
+final String MAGENTA_COLOR = '\u001b[35m'; |
+final String NO_COLOR = '\u001b[0m'; |
+ |
+/** 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; |
+})(); |
+ |
+/** Map between error levels and their friendly name. */ |
+final Map<Level, String> _ERROR_LABEL = (() { |
+ var labels = new Map<Level, String>(); |
+ labels[Level.SEVERE] = 'error'; |
+ labels[Level.WARNING] = 'warning'; |
+ labels[Level.INFO] = 'info'; |
+ return labels; |
+})(); |
+ |
+/** A single message from the compiler. */ |
+class Message { |
+ final Level level; |
+ final String message; |
+ final SourceSpan span; |
+ final bool useColors; |
+ |
+ Message(this.level, this.message, {SourceSpan span, bool useColors: false}) |
+ : this.span = span, |
+ this.useColors = useColors; |
+ |
+ String toString() { |
+ var output = new StringBuffer(); |
+ bool colors = useColors && _ERROR_COLORS.containsKey(level); |
+ var levelColor = colors ? _ERROR_COLORS[level] : null; |
+ if (colors) output.write(levelColor); |
+ output |
+ ..write(_ERROR_LABEL[level]) |
+ ..write(' '); |
+ if (colors) output.write(NO_COLOR); |
+ |
+ if (span == null) { |
+ output.write(message); |
+ } else { |
+ output.write('on '); |
+ output.write(span.message(message, color: levelColor)); |
+ } |
+ |
+ return output.toString(); |
+ } |
+} |
+ |
+typedef void PrintHandler(Message obj); |
+ |
+/** |
+ * This class tracks and prints information, warnings, and errors emitted by the |
+ * compiler. |
+ */ |
+class Messages { |
+ /** Called on every error. Set to blank function to supress printing. */ |
+ final PrintHandler printHandler; |
+ |
+ final PreprocessorOptions options; |
+ |
+ final List<Message> messages = <Message>[]; |
+ |
+ Messages({PreprocessorOptions options, this.printHandler: print}) |
+ : options = options != null ? options : new PreprocessorOptions(); |
+ |
+ /** Report a compile-time CSS error. */ |
+ void error(String message, SourceSpan span) { |
+ var msg = new Message(Level.SEVERE, message, |
+ span: span, useColors: options.useColors); |
+ |
+ messages.add(msg); |
+ |
+ printHandler(msg); |
+ } |
+ |
+ /** Report a compile-time CSS warning. */ |
+ void warning(String message, SourceSpan span) { |
+ if (options.warningsAsErrors) { |
+ error(message, span); |
+ } else { |
+ var msg = new Message(Level.WARNING, message, |
+ span: span, useColors: options.useColors); |
+ |
+ messages.add(msg); |
+ } |
+ } |
+ |
+ /** Report and informational message about what the compiler is doing. */ |
+ void info(String message, SourceSpan span) { |
+ var msg = new Message(Level.INFO, message, |
+ span: span, useColors: options.useColors); |
+ |
+ messages.add(msg); |
+ |
+ if (options.verbose) printHandler(msg); |
+ } |
+ |
+ /** Merge [newMessages] to this message lsit. */ |
+ void mergeMessages(Messages newMessages) { |
+ messages.addAll(newMessages.messages); |
+ newMessages.messages |
+ .where((message) => message.level == Level.SEVERE || options.verbose) |
+ .forEach(printHandler); |
+ } |
+} |