| Index: lib/src/file.dart
|
| diff --git a/lib/src/file.dart b/lib/src/file.dart
|
| index ed5f6a8371226ed65065789a6ec8ee043701426f..daac9a84969ba594e872befb802066c0605f152a 100644
|
| --- a/lib/src/file.dart
|
| +++ b/lib/src/file.dart
|
| @@ -48,8 +48,7 @@ class SourceFile {
|
| /// Creates a new source file from [text].
|
| ///
|
| /// [url] may be either a [String], a [Uri], or `null`.
|
| - SourceFile(String text, {url})
|
| - : this.decoded(text.runes, url: url);
|
| + SourceFile(String text, {url}) : this.decoded(text.runes, url: url);
|
|
|
| /// Creates a new source file from a list of decoded characters.
|
| ///
|
| @@ -164,8 +163,7 @@ class FileLocation extends SourceLocation {
|
| int get line => file.getLine(offset);
|
| int get column => file.getColumn(offset);
|
|
|
| - FileLocation._(this.file, int offset)
|
| - : super(offset) {
|
| + FileLocation._(this.file, int offset) : super(offset) {
|
| if (offset > file.length) {
|
| throw new RangeError("Offset $offset must not be greater than the number "
|
| "of characters in the file, ${file.length}.");
|
| @@ -183,7 +181,7 @@ class FileLocation extends SourceLocation {
|
| /// [FileSpan.union] will return a [FileSpan] if possible.
|
| ///
|
| /// A [FileSpan] can be created using [SourceFile.span].
|
| -class FileSpan extends SourceSpanMixin {
|
| +class FileSpan extends SourceSpanMixin implements SourceSpanWithContext {
|
| /// The [file] that [this] belongs to.
|
| final SourceFile file;
|
|
|
| @@ -205,6 +203,12 @@ class FileSpan extends SourceSpanMixin {
|
| FileLocation get end => new FileLocation._(file, _end);
|
| String get text => file.getText(_start, _end);
|
|
|
| + String get context {
|
| + var line = start.line;
|
| + return file.getText(file.getOffset(line),
|
| + line == file.lines - 1 ? null : file.getOffset(line + 1));
|
| + }
|
| +
|
| FileSpan._(this.file, this._start, this._end) {
|
| if (_end < _start) {
|
| throw new ArgumentError('End $_end must come after start $_start.');
|
| @@ -240,12 +244,13 @@ class FileSpan extends SourceSpanMixin {
|
|
|
| bool operator ==(other) {
|
| if (other is! FileSpan) return super == other;
|
| - return _start == other._start && _end == other._end &&
|
| + return _start == other._start &&
|
| + _end == other._end &&
|
| sourceUrl == other.sourceUrl;
|
| }
|
|
|
| - int get hashCode => _start.hashCode + 5 * _end.hashCode +
|
| - 7 * sourceUrl.hashCode;
|
| + int get hashCode =>
|
| + _start.hashCode + 5 * _end.hashCode + 7 * sourceUrl.hashCode;
|
|
|
| /// Returns a new span that covers both [this] and [other].
|
| ///
|
| @@ -261,41 +266,4 @@ class FileSpan extends SourceSpanMixin {
|
| var end = math.max(this._end, other._end);
|
| return new FileSpan._(file, start, end);
|
| }
|
| -
|
| - String message(String message, {color}) {
|
| - if (color == true) color = colors.RED;
|
| - if (color == false) color = null;
|
| -
|
| - var line = start.line;
|
| - var column = start.column;
|
| -
|
| - var buffer = new StringBuffer();
|
| - buffer.write('line ${start.line + 1}, column ${start.column + 1}');
|
| - if (sourceUrl != null) buffer.write(' of ${p.prettyUri(sourceUrl)}');
|
| - buffer.write(': $message\n');
|
| -
|
| - var textLine = file.getText(file.getOffset(line),
|
| - line == file.lines - 1 ? null : file.getOffset(line + 1));
|
| -
|
| - column = math.min(column, textLine.length - 1);
|
| - var toColumn =
|
| - math.min(column + end.offset - start.offset, textLine.length);
|
| -
|
| - if (color != null) {
|
| - buffer.write(textLine.substring(0, column));
|
| - buffer.write(color);
|
| - buffer.write(textLine.substring(column, toColumn));
|
| - buffer.write(colors.NONE);
|
| - buffer.write(textLine.substring(toColumn));
|
| - } else {
|
| - buffer.write(textLine);
|
| - }
|
| - if (!textLine.endsWith('\n')) buffer.write('\n');
|
| -
|
| - buffer.write(' ' * column);
|
| - if (color != null) buffer.write(color);
|
| - buffer.write('^' * math.max(toColumn - column, 1));
|
| - if (color != null) buffer.write(colors.NONE);
|
| - return buffer.toString();
|
| - }
|
| }
|
|
|