// 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.

import 'package:path/path.dart' as path;

import 'trace.dart';
import 'unparsed_frame.dart';

// #1      Foo._bar (file:///home/nweiz/code/stuff.dart:42:21)
// #1      Foo._bar (file:///home/nweiz/code/stuff.dart:42)
// #1      Foo._bar (file:///home/nweiz/code/stuff.dart)
final _vmFrame = new RegExp(r'^#\d+\s+(\S.*) \((.+?)((?::\d+){0,2})\)$');

//     at Object.stringify (native)
//     at VW.call$0 (http://pub.dartlang.org/stuff.dart.js:560:28)
//     at VW.call$0 (eval as fn
//         (http://pub.dartlang.org/stuff.dart.js:560:28), efn:3:28)
//     at http://pub.dartlang.org/stuff.dart.js:560:28
final _v8Frame = new RegExp(
    r'^\s*at (?:(\S.*?)(?: \[as [^\]]+\])? \((.*)\)|(.*))$');

// http://pub.dartlang.org/stuff.dart.js:560:28
final _v8UrlLocation = new RegExp(r'^(.*):(\d+):(\d+)|native$');

// eval as function (http://pub.dartlang.org/stuff.dart.js:560:28), efn:3:28
// eval as function (http://pub.dartlang.org/stuff.dart.js:560:28)
// eval as function (eval as otherFunction
//     (http://pub.dartlang.org/stuff.dart.js:560:28))
final _v8EvalLocation = new RegExp(
    r'^eval at (?:\S.*?) \((.*)\)(?:, .*?:\d+:\d+)?$');

// .VW.call$0@http://pub.dartlang.org/stuff.dart.js:560
// .VW.call$0("arg")@http://pub.dartlang.org/stuff.dart.js:560
// .VW.call$0/name<@http://pub.dartlang.org/stuff.dart.js:560
// .VW.call$0@http://pub.dartlang.org/stuff.dart.js:560:36
// http://pub.dartlang.org/stuff.dart.js:560
final _firefoxSafariFrame = new RegExp(
    r'^'
    r'(?:' // Member description. Not present in some Safari frames.
      r'([^@(/]*)' // The actual name of the member.
      r'(?:\(.*\))?' // Arguments to the member, sometimes captured by Firefox.
      r'((?:/[^/]*)*)' // Extra characters indicating a nested closure.
      r'(?:\(.*\))?' // Arguments to the closure.
      r'@'
    r')?'
    r'(.*?)' // The frame's URL.
    r':'
    r'(\d*)' // The line number. Empty in Safari if it's unknown.
    r'(?::(\d*))?' // The column number. Not present in older browsers and
                   // empty in Safari if it's unknown.
    r'$');

// foo/bar.dart 10:11 Foo._bar
// http://dartlang.org/foo/bar.dart Foo._bar
final _friendlyFrame = new RegExp(
    r'^(\S+)(?: (\d+)(?::(\d+))?)?\s+([^\d]\S*)$');

/// A regular expression that matches asynchronous member names generated by the
/// VM.
final _asyncBody = new RegExp(r'<(<anonymous closure>|[^>]+)_async_body>');

final _initialDot = new RegExp(r"^\.");

/// A single stack frame. Each frame points to a precise location in Dart code.
class Frame {
  /// The URI of the file in which the code is located.
  ///
  /// This URI will usually have the scheme `dart`, `file`, `http`, or `https`.
  final Uri uri;

  /// The line number on which the code location is located.
  ///
  /// This can be null, indicating that the line number is unknown or
  /// unimportant.
  final int line;

  /// The column number of the code location.
  ///
  /// This can be null, indicating that the column number is unknown or
  /// unimportant.
  final int column;

  /// The name of the member in which the code location occurs.
  ///
  /// Anonymous closures are represented as `<fn>` in this member string.
  final String member;

  /// Whether this stack frame comes from the Dart core libraries.
  bool get isCore => uri.scheme == 'dart';

  /// Returns a human-friendly description of the library that this stack frame
  /// comes from.
  ///
  /// This will usually be the string form of [uri], but a relative URI will be
  /// used if possible. Data URIs will be truncated.
  String get library {
    if (uri.scheme == 'data') return "data:...";
    return path.prettyUri(uri);
  }

  /// Returns the name of the package this stack frame comes from, or `null` if
  /// this stack frame doesn't come from a `package:` URL.
  String get package {
    if (uri.scheme != 'package') return null;
    return uri.path.split('/').first;
  }

  /// A human-friendly description of the code location.
  String get location {
    if (line == null) return library;
    if (column == null) return '$library $line';
    return '$library $line:$column';
  }

  /// Returns a single frame of the current stack.
  ///
  /// By default, this will return the frame above the current method. If
  /// [level] is `0`, it will return the current method's frame; if [level] is
  /// higher than `1`, it will return higher frames.
  factory Frame.caller([int level=1]) {
    if (level < 0) {
      throw new ArgumentError("Argument [level] must be greater than or equal "
          "to 0.");
    }

    return new Trace.current(level + 1).frames.first;
  }

  /// Parses a string representation of a Dart VM stack frame.
  factory Frame.parseVM(String frame) => _catchFormatException(frame, () {
    // The VM sometimes folds multiple stack frames together and replaces them
    // with "...".
    if (frame == '...') {
      return new Frame(new Uri(), null, null, '...');
    }

    var match = _vmFrame.firstMatch(frame);
    if (match == null) return new UnparsedFrame(frame);

    // Get the pieces out of the regexp match. Function, URI and line should
    // always be found. The column is optional.
    var member = match[1]
        .replaceAll(_asyncBody, "<async>")
        .replaceAll("<anonymous closure>", "<fn>");
    var uri = Uri.parse(match[2]);

    var lineAndColumn = match[3].split(':');
    var line = lineAndColumn.length > 1 ? int.parse(lineAndColumn[1]) : null;
    var column = lineAndColumn.length > 2 ? int.parse(lineAndColumn[2]) : null;
    return new Frame(uri, line, column, member);
  });

  /// Parses a string representation of a Chrome/V8 stack frame.
  factory Frame.parseV8(String frame) => _catchFormatException(frame, () {
    var match = _v8Frame.firstMatch(frame);
    if (match == null) return new UnparsedFrame(frame);

    // v8 location strings can be arbitrarily-nested, since it adds a layer of
    // nesting for each eval performed on that line.
    parseLocation(location, member) {
      var evalMatch = _v8EvalLocation.firstMatch(location);
      while (evalMatch != null) {
        location = evalMatch[1];
        evalMatch = _v8EvalLocation.firstMatch(location);
      }

      if (location == 'native') {
        return new Frame(Uri.parse('native'), null, null, member);
      }

      var urlMatch = _v8UrlLocation.firstMatch(location);
      if (urlMatch == null) return new UnparsedFrame(frame);

      return new Frame(
          _uriOrPathToUri(urlMatch[1]),
          int.parse(urlMatch[2]),
          int.parse(urlMatch[3]),
          member);
    }

    // V8 stack frames can be in two forms.
    if (match[2] != null) {
      // The first form looks like " at FUNCTION (LOCATION)". V8 proper lists
      // anonymous functions within eval as "<anonymous>", while IE10 lists them
      // as "Anonymous function".
      return parseLocation(match[2],
          match[1].replaceAll("<anonymous>", "<fn>")
                  .replaceAll("Anonymous function", "<fn>"));
    } else {
      // The second form looks like " at LOCATION", and is used for anonymous
      // functions.
      return parseLocation(match[3], "<fn>");
    }
  });

  /// Parses a string representation of a JavaScriptCore stack trace.
  factory Frame.parseJSCore(String frame) => new Frame.parseV8(frame);

  /// Parses a string representation of an IE stack frame.
  ///
  /// IE10+ frames look just like V8 frames. Prior to IE10, stack traces can't
  /// be retrieved.
  factory Frame.parseIE(String frame) => new Frame.parseV8(frame);

  /// Parses a string representation of a Firefox stack frame.
  factory Frame.parseFirefox(String frame) => _catchFormatException(frame, () {
    var match = _firefoxSafariFrame.firstMatch(frame);
    if (match == null) return new UnparsedFrame(frame);

    // Normally this is a URI, but in a jsshell trace it can be a path.
    var uri = _uriOrPathToUri(match[3]);

    var member;
    if (match[1] != null) {
      member = match[1];
      member +=
          new List.filled('/'.allMatches(match[2]).length, ".<fn>").join();
      if (member == '') member = '<fn>';

      // Some Firefox members have initial dots. We remove them for consistency
      // with other platforms.
      member = member.replaceFirst(_initialDot, '');
    } else {
      member = '<fn>';
    }

    var line = match[4] == '' ? null : int.parse(match[4]);
    var column = match[5] == null || match[5] == '' ?
        null : int.parse(match[5]);
    return new Frame(uri, line, column, member);
  });

  /// Parses a string representation of a Safari 6.0 stack frame.
  @Deprecated("Use Frame.parseSafari instead.")
  factory Frame.parseSafari6_0(String frame) => new Frame.parseFirefox(frame);

  /// Parses a string representation of a Safari 6.1+ stack frame.
  @Deprecated("Use Frame.parseSafari instead.")
  factory Frame.parseSafari6_1(String frame) => new Frame.parseFirefox(frame);

  /// Parses a string representation of a Safari stack frame.
  factory Frame.parseSafari(String frame) => new Frame.parseFirefox(frame);

  /// Parses this package's string representation of a stack frame.
  factory Frame.parseFriendly(String frame) => _catchFormatException(frame, () {
    var match = _friendlyFrame.firstMatch(frame);
    if (match == null) {
      throw new FormatException(
          "Couldn't parse package:stack_trace stack trace line '$frame'.");
    }

    var uri = Uri.parse(match[1]);
    // If there's no scheme, this is a relative URI. We should interpret it as
    // relative to the current working directory.
    if (uri.scheme == '') {
      uri = path.toUri(path.absolute(path.fromUri(uri)));
    }

    var line = match[2] == null ? null : int.parse(match[2]);
    var column = match[3] == null ? null : int.parse(match[3]);
    return new Frame(uri, line, column, match[4]);
  });

  /// A regular expression matching an absolute URI.
  static final _uriRegExp = new RegExp(r'^[a-zA-Z][-+.a-zA-Z\d]*://');

  /// A regular expression matching a Windows path.
  static final _windowsRegExp = new RegExp(r'^([a-zA-Z]:[\\/]|\\\\)');

  /// Converts [uriOrPath], which can be a URI, a Windows path, or a Posix path,
  /// to a URI (absolute if possible).
  static Uri _uriOrPathToUri(String uriOrPath) {
    if (uriOrPath.contains(_uriRegExp)) {
      return Uri.parse(uriOrPath);
    } else if (uriOrPath.contains(_windowsRegExp)) {
      return new Uri.file(uriOrPath, windows: true);
    } else if (uriOrPath.startsWith('/')) {
      return new Uri.file(uriOrPath, windows: false);
    }

    // As far as I've seen, Firefox and V8 both always report absolute paths in
    // their stack frames. However, if we do get a relative path, we should
    // handle it gracefully.
    if (uriOrPath.contains('\\')) return path.windows.toUri(uriOrPath);
    return Uri.parse(uriOrPath);
  }

  /// Runs [body] and returns its result.
  ///
  /// If [body] throws a [FormatException], returns an [UnparsedFrame] with
  /// [text] instead.
  static Frame _catchFormatException(String text, Frame body()) {
    try {
      return body();
    } on FormatException catch (_) {
      return new UnparsedFrame(text);
    }
  }

  Frame(this.uri, this.line, this.column, this.member);

  String toString() => '$location in $member';
}
