| Index: pkg/compiler/lib/src/diagnostics/spannable.dart
|
| diff --git a/pkg/compiler/lib/src/diagnostics/spannable.dart b/pkg/compiler/lib/src/diagnostics/spannable.dart
|
| index d26a5c372b12d9b0b507f0d0758034f31a4d7a02..ea9ae1fac7fde5a06118674e2b3de0464bee757e 100644
|
| --- a/pkg/compiler/lib/src/diagnostics/spannable.dart
|
| +++ b/pkg/compiler/lib/src/diagnostics/spannable.dart
|
| @@ -2,66 +2,7 @@
|
| // 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 dart2js.util;
|
| -
|
| -import 'util_implementation.dart';
|
| -import 'characters.dart';
|
| -
|
| -export 'setlet.dart';
|
| -export 'maplet.dart';
|
| -export 'emptyset.dart';
|
| -
|
| -part 'indentation.dart';
|
| -part 'link.dart';
|
| -
|
| -/// Helper functions for creating hash codes.
|
| -class Hashing {
|
| - /// If an integer is masked by this constant, the result is guaranteed to be
|
| - /// in Smi range.
|
| - static const int SMI_MASK = 0x3fffffff;
|
| -
|
| - /// Mix the bits of [value] and merge them with [existing].
|
| - static int mixHashCodeBits(int existing, int value) {
|
| - // Spread the bits of value. Try to stay in the 30-bit range to
|
| - // avoid overflowing into a more expensive integer representation.
|
| - int h = value & 0x1fffffff;
|
| - h += ((h & 0x3fff) << 15) ^ 0x1fffcd7d;
|
| - h ^= (h >> 10);
|
| - h += ((h & 0x3ffffff) << 3);
|
| - h ^= (h >> 6);
|
| - h += ((h & 0x7ffffff) << 2) + ((h & 0x7fff) << 14);
|
| - h ^= (h >> 16);
|
| - // Combine the two hash values.
|
| - int high = existing >> 15;
|
| - int low = existing & 0x7fff;
|
| - return ((high * 13) ^ (low * 997) ^ h) & SMI_MASK;
|
| - }
|
| -
|
| - /// Mix the bits of `object.hashCode` with [existing].
|
| - static int objectHash(Object object, [int existing = 0]) {
|
| - return mixHashCodeBits(existing, object.hashCode);
|
| - }
|
| -
|
| - /// Mix the bits of the element hash codes of [list] with [existing].
|
| - static int listHash(List list, [int existing = 0]) {
|
| - int h = existing;
|
| - int length = list.length;
|
| - for (int i = 0; i < length; i++) {
|
| - h = mixHashCodeBits(h, list[i].hashCode);
|
| - }
|
| - return h;
|
| - }
|
| -
|
| - /// Mix the bits of the key/value hash codes from [map] with [existing].
|
| - static int mapHash(Map map, [int existing = 0]) {
|
| - int h = existing;
|
| - for (var key in map.keys) {
|
| - h = mixHashCodeBits(h, key.hashCode);
|
| - h = mixHashCodeBits(h, map[key].hashCode);
|
| - }
|
| - return h;
|
| - }
|
| -}
|
| +library dart2js.diagnostics.spannable;
|
|
|
| /**
|
| * Tagging interface for classes from which source spans can be generated.
|
| @@ -98,165 +39,3 @@ class SpannableAssertionFailure {
|
| String toString() => 'Assertion failure'
|
| '${message != null ? ': $message' : ''}';
|
| }
|
| -
|
| -bool equalElements(List a, List b) {
|
| - if (a.length != b.length) return false;
|
| - for (int index = 0; index < a.length; index++) {
|
| - if (a[index] != b[index]) {
|
| - return false;
|
| - }
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -/**
|
| - * File name prefix used to shorten the file name in stack traces printed by
|
| - * [trace].
|
| - */
|
| -String stackTraceFilePrefix = null;
|
| -
|
| -/// Writes the characters of [string] on [buffer]. The characters
|
| -/// are escaped as suitable for JavaScript and JSON. [buffer] is
|
| -/// anything which supports [:write:] and [:writeCharCode:], for example,
|
| -/// [StringBuffer]. Note that JS supports \xnn and \unnnn whereas JSON only
|
| -/// supports the \unnnn notation. Therefore we use the \unnnn notation.
|
| -void writeJsonEscapedCharsOn(String string, buffer) {
|
| - void addCodeUnitEscaped(var buffer, int code) {
|
| - assert(code < 0x10000);
|
| - buffer.write(r'\u');
|
| - if (code < 0x1000) {
|
| - buffer.write('0');
|
| - if (code < 0x100) {
|
| - buffer.write('0');
|
| - if (code < 0x10) {
|
| - buffer.write('0');
|
| - }
|
| - }
|
| - }
|
| - buffer.write(code.toRadixString(16));
|
| - }
|
| -
|
| - void writeEscapedOn(String string, var buffer) {
|
| - for (int i = 0; i < string.length; i++) {
|
| - int code = string.codeUnitAt(i);
|
| - if (code == $DQ) {
|
| - buffer.write(r'\"');
|
| - } else if (code == $TAB) {
|
| - buffer.write(r'\t');
|
| - } else if (code == $LF) {
|
| - buffer.write(r'\n');
|
| - } else if (code == $CR) {
|
| - buffer.write(r'\r');
|
| - } else if (code == $DEL) {
|
| - addCodeUnitEscaped(buffer, $DEL);
|
| - } else if (code == $LS) {
|
| - // This Unicode line terminator and $PS are invalid in JS string
|
| - // literals.
|
| - addCodeUnitEscaped(buffer, $LS); // 0x2028.
|
| - } else if (code == $PS) {
|
| - addCodeUnitEscaped(buffer, $PS); // 0x2029.
|
| - } else if (code == $BACKSLASH) {
|
| - buffer.write(r'\\');
|
| - } else {
|
| - if (code < 0x20) {
|
| - addCodeUnitEscaped(buffer, code);
|
| - // We emit DEL (ASCII 0x7f) as an escape because it would be confusing
|
| - // to have it unescaped in a string literal. We also escape
|
| - // everything above 0x7f because that means we don't have to worry
|
| - // about whether the web server serves it up as Latin1 or UTF-8.
|
| - } else if (code < 0x7f) {
|
| - buffer.writeCharCode(code);
|
| - } else {
|
| - // This will output surrogate pairs in the form \udxxx\udyyy, rather
|
| - // than the more logical \u{zzzzzz}. This should work in JavaScript
|
| - // (especially old UCS-2 based implementations) and is the only
|
| - // format that is allowed in JSON.
|
| - addCodeUnitEscaped(buffer, code);
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| - for (int i = 0; i < string.length; i++) {
|
| - int code = string.codeUnitAt(i);
|
| - if (code < 0x20 || code == $DEL || code == $DQ || code == $LS ||
|
| - code == $PS || code == $BACKSLASH || code >= 0x80) {
|
| - writeEscapedOn(string, buffer);
|
| - return;
|
| - }
|
| - }
|
| - buffer.write(string);
|
| -}
|
| -
|
| -int computeHashCode(part1, [part2, part3, part4, part5]) {
|
| - return (part1.hashCode
|
| - ^ part2.hashCode
|
| - ^ part3.hashCode
|
| - ^ part4.hashCode
|
| - ^ part5.hashCode) & 0x3fffffff;
|
| -}
|
| -
|
| -String modifiersToString({bool isStatic: false,
|
| - bool isAbstract: false,
|
| - bool isFinal: false,
|
| - bool isVar: false,
|
| - bool isConst: false,
|
| - bool isFactory: false,
|
| - bool isExternal: false}) {
|
| - LinkBuilder<String> builder = new LinkBuilder<String>();
|
| - if (isStatic) builder.addLast('static');
|
| - if (isAbstract) builder.addLast('abstract');
|
| - if (isFinal) builder.addLast('final');
|
| - if (isVar) builder.addLast('var');
|
| - if (isConst) builder.addLast('const');
|
| - if (isFactory) builder.addLast('factory');
|
| - if (isExternal) builder.addLast('external');
|
| - StringBuffer buffer = new StringBuffer();
|
| - builder.toLink().printOn(buffer, ', ');
|
| - return buffer.toString();
|
| -}
|
| -
|
| -class Pair<A, B> {
|
| - final A a;
|
| - final B b;
|
| -
|
| - Pair(this.a, this.b);
|
| -
|
| - int get hashCode => 13 * a.hashCode + 17 * b.hashCode;
|
| -
|
| - bool operator ==(var other) {
|
| - if (identical(this, other)) return true;
|
| - if (other is! Pair) return false;
|
| - return a == other.a && b == other.b;
|
| - }
|
| -
|
| - String toString() => '($a,$b)';
|
| -}
|
| -
|
| -
|
| -int longestCommonPrefixLength(List a, List b) {
|
| - int index = 0;
|
| - for ( ; index < a.length && index < b.length; index++) {
|
| - if (a[index] != b[index]) {
|
| - break;
|
| - }
|
| - }
|
| - return index;
|
| -}
|
| -
|
| -/// Returns [suggestedName] if it is not in [usedNames]. Otherwise concatenates
|
| -/// the smallest number that makes it not appear in [usedNames].
|
| -///
|
| -/// Adds the result to [usedNames].
|
| -String makeUnique(String suggestedName, Set<String> usedNames) {
|
| - String result = suggestedName;
|
| - if (usedNames.contains(suggestedName)) {
|
| - int counter = 0;
|
| - while (usedNames.contains(result)) {
|
| - counter++;
|
| - result = "$suggestedName$counter";
|
| - }
|
| - }
|
| - usedNames.add(result);
|
| - return result;
|
| -}
|
|
|