| // Copyright (c) 2013, 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 matcher.utils; |
| |
| /** |
| * Returns the name of the type of [x], or "Unknown" if the type name can't be |
| * determined. |
| */ |
| String typeName(x) { |
| // dart2js blows up on some objects (e.g. window.navigator). |
| // So we play safe here. |
| try { |
| if (x == null) return "null"; |
| var type = x.runtimeType.toString(); |
| // TODO(nweiz): if the object's type is private, find a public superclass to |
| // display once there's a portable API to do that. |
| return type.startsWith("_") ? "?" : type; |
| } catch (e) { |
| return "?"; |
| } |
| } |
| |
| /** |
| * Returns [source] with any control characters replaced by their escape |
| * sequences. |
| * |
| * This doesn't add quotes to the string, but it does escape single quote |
| * characters so that single quotes can be applied externally. |
| */ |
| String escapeString(String source) => |
| source.split("").map(_escapeChar).join(""); |
| |
| /** Return the escaped form of a character [ch]. */ |
| String _escapeChar(String ch) { |
| if (ch == "'") |
| return "\\'"; |
| else if (ch == '\n') |
| return '\\n'; |
| else if (ch == '\r') |
| return '\\r'; |
| else if (ch == '\t') |
| return '\\t'; |
| else |
| return ch; |
| } |
| |
| /** Indent each line in [str] by two spaces. */ |
| String indent(String str) => |
| str.replaceAll(new RegExp("^", multiLine: true), " "); |
| |
| /** A pair of values. */ |
| class Pair<E, F> { |
| E first; |
| F last; |
| |
| Pair(this.first, this.last); |
| |
| String toString() => '($first, $last)'; |
| |
| bool operator ==(other) { |
| if (other is! Pair) return false; |
| return other.first == first && other.last == last; |
| } |
| |
| int get hashCode => first.hashCode ^ last.hashCode; |
| } |
| |