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

part of dart.core;

/// An interface implemented by all stack trace objects.
///
/// A [StackTrace] is intended to convey information to the user about the call
/// sequence that triggered an exception.
///
/// These objects are created by the runtime, it is not possible to create
/// them programmatically.
abstract class StackTrace {
  /// A stack trace object with no information.
  ///
  /// This stack trace is used as the default in situations where
  /// a stack trace is required, but the user has not supplied one.
  @Since("2.8")
  static const empty = const _StringStackTrace("");

  StackTrace(); // In case existing classes extend StackTrace.

  /// Create a `StackTrace` object from [stackTraceString].
  ///
  /// The created stack trace will have a `toString` method returning
  /// `stackTraceString`.
  ///
  /// The `stackTraceString` can be a string returned by some other
  /// stack trace, or it can be any string at all.
  /// If the string doesn't look like a stack trace, code that interprets
  /// stack traces is likely to fail, so fake stack traces should be used
  /// with care.
  factory StackTrace.fromString(String stackTraceString) = _StringStackTrace;

  /// Returns a representation of the current stack trace.
  ///
  /// This is similar to what can be achieved by doing:
  /// ```dart
  /// try { throw 0; } catch (_, stack) { return stack; }
  /// ```
  /// The getter achieves this without throwing if possible.
  external static StackTrace get current;

  /// Returns a [String] representation of the stack trace.
  ///
  /// The string represents the full stack trace starting from
  /// the point where a throw occurred to the top of the current call sequence.
  ///
  /// The exact format of the string representation is not final.
  String toString();
}

class _StringStackTrace implements StackTrace {
  final String _stackTrace;
  const _StringStackTrace(this._stackTrace);
  String toString() => _stackTrace;
}
