| Index: mojo/public/dart/third_party/source_span/lib/src/location.dart
|
| diff --git a/mojo/public/dart/third_party/source_span/lib/src/location.dart b/mojo/public/dart/third_party/source_span/lib/src/location.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..afb37c768c97e4018075c094cea1eae25ed1adaf
|
| --- /dev/null
|
| +++ b/mojo/public/dart/third_party/source_span/lib/src/location.dart
|
| @@ -0,0 +1,100 @@
|
| +// 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.
|
| +
|
| +library source_span.location;
|
| +
|
| +import 'span.dart';
|
| +
|
| +// TODO(nweiz): Use SourceLocationMixin once we decide to cut a release with
|
| +// breaking changes. See SourceLocationMixin for details.
|
| +
|
| +/// A class that describes a single location within a source file.
|
| +///
|
| +/// This class should not be extended. Instead, [SourceLocationBase] should be
|
| +/// extended instead.
|
| +class SourceLocation implements Comparable<SourceLocation> {
|
| + /// URL of the source containing this location.
|
| + ///
|
| + /// This may be null, indicating that the source URL is unknown or
|
| + /// unavailable.
|
| + final Uri sourceUrl;
|
| +
|
| + /// The 0-based offset of this location in the source.
|
| + final int offset;
|
| +
|
| + /// The 0-based line of this location in the source.
|
| + final int line;
|
| +
|
| + /// The 0-based column of this location in the source
|
| + final int column;
|
| +
|
| + /// Returns a representation of this location in the `source:line:column`
|
| + /// format used by text editors.
|
| + ///
|
| + /// This prints 1-based lines and columns.
|
| + String get toolString {
|
| + var source = sourceUrl == null ? 'unknown source' : sourceUrl;
|
| + return '$source:${line + 1}:${column + 1}';
|
| + }
|
| +
|
| + /// Creates a new location indicating [offset] within [sourceUrl].
|
| + ///
|
| + /// [line] and [column] default to assuming the source is a single line. This
|
| + /// means that [line] defaults to 0 and [column] defaults to [offset].
|
| + ///
|
| + /// [sourceUrl] may be either a [String], a [Uri], or `null`.
|
| + SourceLocation(int offset, {sourceUrl, int line, int column})
|
| + : sourceUrl = sourceUrl is String ? Uri.parse(sourceUrl) : sourceUrl,
|
| + offset = offset,
|
| + line = line == null ? 0 : line,
|
| + column = column == null ? offset : column {
|
| + if (offset < 0) {
|
| + throw new RangeError("Offset may not be negative, was $offset.");
|
| + } else if (line != null && line < 0) {
|
| + throw new RangeError("Line may not be negative, was $line.");
|
| + } else if (column != null && column < 0) {
|
| + throw new RangeError("Column may not be negative, was $column.");
|
| + }
|
| + }
|
| +
|
| + /// Returns the distance in characters between [this] and [other].
|
| + ///
|
| + /// This always returns a non-negative value.
|
| + int distance(SourceLocation other) {
|
| + if (sourceUrl != other.sourceUrl) {
|
| + throw new ArgumentError("Source URLs \"${sourceUrl}\" and "
|
| + "\"${other.sourceUrl}\" don't match.");
|
| + }
|
| + return (offset - other.offset).abs();
|
| + }
|
| +
|
| + /// Returns a span that covers only a single point: this location.
|
| + SourceSpan pointSpan() => new SourceSpan(this, this, "");
|
| +
|
| + /// Compares two locations.
|
| + ///
|
| + /// [other] must have the same source URL as [this].
|
| + int compareTo(SourceLocation other) {
|
| + if (sourceUrl != other.sourceUrl) {
|
| + throw new ArgumentError("Source URLs \"${sourceUrl}\" and "
|
| + "\"${other.sourceUrl}\" don't match.");
|
| + }
|
| + return offset - other.offset;
|
| + }
|
| +
|
| + bool operator ==(other) =>
|
| + other is SourceLocation && sourceUrl == other.sourceUrl &&
|
| + offset == other.offset;
|
| +
|
| + int get hashCode => sourceUrl.hashCode + offset;
|
| +
|
| + String toString() => '<$runtimeType: $offset $toolString>';
|
| +}
|
| +
|
| +/// A base class for source locations with [offset], [line], and [column] known
|
| +/// at construction time.
|
| +class SourceLocationBase extends SourceLocation {
|
| + SourceLocationBase(int offset, {sourceUrl, int line, int column})
|
| + : super(offset, sourceUrl: sourceUrl, line: line, column: column);
|
| +}
|
|
|