Index: sdk/lib/_internal/compiler/implementation/helpers/trace.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/helpers/trace.dart b/sdk/lib/_internal/compiler/implementation/helpers/trace.dart |
deleted file mode 100644 |
index a6bdcf67c2b307ef405b834893223cec8822ca6f..0000000000000000000000000000000000000000 |
--- a/sdk/lib/_internal/compiler/implementation/helpers/trace.dart |
+++ /dev/null |
@@ -1,333 +0,0 @@ |
-// Copyright (c) 2014, 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. |
- |
-part of dart2js.helpers; |
- |
-/// Function signature for [trace]. |
-typedef void Trace(String message, |
- {bool condition(String stackTrace), |
- int limit, |
- bool throwOnPrint}); |
- |
-/** |
- * Helper method for printing stack traces for debugging. |
- * |
- * [message] is printed as the header of the stack trace. |
- * |
- * If [condition] is provided, the stack trace is only printed if [condition] |
- * returns [:true:] on the stack trace text. This can be used to filter the |
- * printed stack traces based on their content. For instance only print stack |
- * traces that contain specific paths. |
- * |
- * If [limit] is provided, the stack trace is limited to [limit] entries. |
- * |
- * If [throwOnPrint] is `true`, [message] will be thrown after the stack trace |
- * has been printed. Together with [condition] this can be used to discover |
- * unknown call-sites in tests by filtering known call-sites and throwning |
- * otherwise. |
- */ |
-Trace get trace { |
- enableDebugMode(); |
- return _trace; |
-} |
- |
-void _trace(String message, {bool condition(String stackTrace), int limit, |
- bool throwOnPrint: false}) { |
- try { |
- throw ''; |
- } catch (e, s) { |
- String stackTrace; |
- try { |
- stackTrace = prettifyStackTrace( |
- s, rangeStart: 1, rangeEnd: limit, filePrefix: stackTraceFilePrefix); |
- } catch (e) { |
- print(e); |
- stackTrace = '$s'; |
- } |
- if (condition != null) { |
- if (!condition(stackTrace)) return; |
- } |
- print('$message\n$stackTrace'); |
- if (throwOnPrint) throw message; |
- } |
-} |
- |
-/// Function signature of [traceAndReport]. |
-typedef void TraceAndReport(Compiler compiler, Spannable node, String message, |
- {bool condition(String stackTrace), int limit, |
- bool throwOnPrint}); |
- |
-/// Calls [reportHere] and [trace] with the same message. |
-TraceAndReport get traceAndReport { |
- enableDebugMode(); |
- return _traceAndReport; |
-} |
- |
-/// Calls [reportHere] and [trace] with the same message. |
-TraceAndReport get reportAndTrace => traceAndReport; |
- |
-/// Implementation of [traceAndReport]. |
-void _traceAndReport(Compiler compiler, Spannable node, String message, |
- {bool condition(String stackTrace), int limit, |
- bool throwOnPrint: false}) { |
- |
- trace(message, limit: limit, throwOnPrint: throwOnPrint, |
- condition: (String stackTrace) { |
- bool result = condition != null ? condition(stackTrace) : true; |
- if (result) { |
- reportHere(compiler, node, message); |
- } |
- return result; |
- }); |
-} |
- |
-/// Returns the [StackTraceLines] for the current call stack. |
-/// |
-/// Use [offset] to discard the first [offset] calls of the call stack. Defaults |
-/// to `1`, that is, discard the call to [stackTrace] itself. Use [limit] to |
-/// limit the length of the stack trace lines. |
-StackTraceLines stackTrace({int offset: 1, |
- int limit: null}) { |
- int rangeStart = offset; |
- int rangeEnd = limit == null ? null : rangeStart + limit; |
- try { |
- throw ''; |
- } catch (_, stackTrace) { |
- return new StackTraceLines.fromTrace(stackTrace, |
- rangeStart: offset, rangeEnd: rangeEnd, |
- filePrefix: stackTraceFilePrefix); |
- } |
- return null; |
-} |
- |
-/// A stack trace as a sequence of [StackTraceLine]s. |
-class StackTraceLines { |
- final List<StackTraceLine> lines; |
- final int maxFileLength; |
- final int maxLineNoLength; |
- final int maxColumnNoLength; |
- |
- factory StackTraceLines.fromTrace(StackTrace s, |
- {int rangeStart, |
- int rangeEnd, |
- String filePrefix, |
- String lambda: r'?'}) { |
- final RegExp indexPattern = new RegExp(r'#\d+\s*'); |
- int index = -1; |
- int maxFileLength = 0; |
- int maxLineNoLength = 0; |
- int maxColumnNoLength = 0; |
- |
- String stackTrace = '$s'; |
- List<StackTraceLine> lines = <StackTraceLine>[]; |
- // Parse each line in the stack trace. The supported line formats from the |
- // Dart VM are: |
- // #n <method-name> (<uri>:<line-no>:<column-no>) |
- // #n <method-name> (<uri>:<line-no>) |
- // in which '<anonymous closure>' is the name used for an (unnamed) function |
- // expression. |
- for (String line in stackTrace.split('\n')) { |
- try { |
- index++; |
- if (rangeStart != null && index < rangeStart) continue; |
- if (rangeEnd != null && index > rangeEnd) break; |
- if (line.isEmpty) continue; |
- |
- // Strip index. |
- line = line.replaceFirst(indexPattern, ''); |
- |
- int leftParenPos = line.indexOf('('); |
- int rightParenPos = line.indexOf(')', leftParenPos); |
- int lastColon = line.lastIndexOf(':', rightParenPos); |
- int nextToLastColon = line.lastIndexOf(':', lastColon-1); |
- |
- String lineNo; |
- String columnNo; |
- if (nextToLastColon != -1) { |
- lineNo = line.substring(nextToLastColon+1, lastColon); |
- columnNo = line.substring(lastColon+1, rightParenPos); |
- try { |
- int.parse(lineNo); |
- } on FormatException catch (e) { |
- lineNo = columnNo; |
- columnNo = ''; |
- nextToLastColon = lastColon; |
- } |
- } else { |
- lineNo = line.substring(lastColon+1, rightParenPos); |
- columnNo = ''; |
- nextToLastColon = lastColon; |
- } |
- |
- if (lineNo.length > maxLineNoLength) { |
- maxLineNoLength = lineNo.length; |
- } |
- if (columnNo.length > maxColumnNoLength) { |
- maxColumnNoLength = columnNo.length; |
- } |
- |
- String file = line.substring(leftParenPos+1, nextToLastColon); |
- if (filePrefix != null && file.startsWith(filePrefix)) { |
- file = file.substring(filePrefix.length); |
- } |
- if (file.length > maxFileLength) { |
- maxFileLength = file.length; |
- } |
- String method = line.substring(0, leftParenPos-1); |
- if (lambda != null) { |
- method = method.replaceAll('<anonymous closure>', lambda); |
- } |
- lines.add(new StackTraceLine(index, file, lineNo, columnNo, method)); |
- } catch (e) { |
- throw 'Error prettifying "$line": $e'; |
- } |
- } |
- return new StackTraceLines.fromLines( |
- lines, maxFileLength, maxLineNoLength, maxColumnNoLength); |
- } |
- |
- StackTraceLines.fromLines(this.lines, |
- this.maxFileLength, |
- this.maxLineNoLength, |
- this.maxColumnNoLength); |
- |
- StackTraceLines subtrace(int offset) { |
- return new StackTraceLines.fromLines( |
- lines.sublist(offset), |
- maxFileLength, |
- maxLineNoLength, |
- maxColumnNoLength); |
- } |
- |
- String prettify({bool showColumnNo: false, |
- bool showDots: true}) { |
- StringBuffer sb = new StringBuffer(); |
- bool dots = true; |
- for (StackTraceLine line in lines) { |
- sb.write(' '); |
- line.printOn(sb, |
- fileLength: maxFileLength, |
- padding: showDots && dots ? ' .' : ' ', |
- lineNoLength: maxLineNoLength, |
- showColumnNo: showColumnNo, |
- columnNoLength: maxColumnNoLength); |
- |
- dots = !dots; |
- } |
- return sb.toString(); |
- } |
- |
- String toString() { |
- return prettify(); |
- } |
-} |
- |
-/// A parsed line from a stack trace. |
-class StackTraceLine { |
- final int index; |
- final String file; |
- final String lineNo; |
- final String columnNo; |
- final String method; |
- |
- StackTraceLine(this.index, this.file, this.lineNo, |
- this.columnNo, this.method); |
- |
- void printOn(StringBuffer sb, |
- {String padding: ' ', |
- int fileLength, |
- int lineNoLength, |
- int columnNoLength, |
- bool showColumnNo: false}) { |
- String fileText = '${file} '; |
- if (fileLength != null) { |
- fileText = pad(fileText, fileLength, dots: padding); |
- } |
- String lineNoText = lineNo; |
- if (lineNoLength != null) { |
- lineNoText = pad(lineNoText, lineNoLength, padLeft: true); |
- } |
- String columnNoText = showColumnNo ? '': columnNo; |
- if (columnNoLength != null) { |
- columnNoText = ':${pad(columnNoText, columnNoLength)}'; |
- } |
- sb.write('$fileText $lineNoText$columnNoText $method\n'); |
- } |
- |
- int get hashCode { |
- return 13 * index + |
- 17 * file.hashCode + |
- 19 * lineNo.hashCode + |
- 23 * columnNo.hashCode + |
- 29 * method.hashCode; |
- } |
- |
- bool operator ==(other) { |
- if (identical(this, other)) return true; |
- if (other is! StackTraceLine) return false; |
- return index == other.index && |
- file == other.file && |
- lineNo == other.lineNo && |
- columnNo == other.columnNo && |
- method == other.method; |
- } |
- |
- String toString() => "$method @ $file [$lineNo:$columnNo]"; |
-} |
- |
-// TODO(johnniwinther): Use this format for --throw-on-error. |
-/** |
- * Converts the normal VM stack trace into a more compact and readable format. |
- * |
- * The output format is [: <file> . . . <lineNo>:<columnNo> <method> :] where |
- * [: <file> :] is file name, [: <lineNo> :] is the line number, |
- * [: <columnNo> :] is the column number, and [: <method> :] is the method name. |
- * |
- * If [rangeStart] and/or [rangeEnd] are provided, only the lines within the |
- * range are included. |
- * If [showColumnNo] is [:false:], the [: :<columnNo> :] part is omitted. |
- * If [showDots] is [:true:], the space between [: <file> :] and [: <lineNo> :] |
- * is padded with dots on every other line. |
- * If [filePrefix] is provided, then for every file name thats starts with |
- * [filePrefix] only the remainder is printed. |
- * If [lambda] is non-null, anonymous closures are printed as [lambda]. |
- */ |
-String prettifyStackTrace(StackTrace stackTrace, |
- {int rangeStart, |
- int rangeEnd, |
- bool showColumnNo: false, |
- bool showDots: true, |
- String filePrefix, |
- String lambda: r'?'}) { |
- return new StackTraceLines.fromTrace(stackTrace, |
- rangeStart: rangeStart, rangeEnd: rangeEnd, |
- filePrefix: filePrefix, lambda: lambda) |
- .prettify(showColumnNo: showColumnNo, showDots: showDots); |
-} |
- |
-/** |
- * Pads (or truncates) [text] to the [intendedLength]. |
- * |
- * If [padLeft] is [:true:] the text is padding inserted to the left of [text]. |
- * A repetition of the [dots] text is used for padding. |
- */ |
-String pad(String text, int intendedLength, |
- {bool padLeft: false, String dots: ' '}) { |
- if (text.length == intendedLength) return text; |
- if (text.length > intendedLength) return text.substring(0, intendedLength); |
- if (dots == null || dots.isEmpty) dots = ' '; |
- int dotsLength = dots.length; |
- StringBuffer sb = new StringBuffer(); |
- if (!padLeft) { |
- sb.write(text); |
- } |
- for (int index = text.length ; index < intendedLength ; index ++) { |
- int dotsIndex = index % dotsLength; |
- sb.write(dots.substring(dotsIndex, dotsIndex + 1)); |
- } |
- if (padLeft) { |
- sb.write(text); |
- } |
- return sb.toString(); |
-} |