Index: pkg/source_maps/lib/span.dart |
diff --git a/pkg/source_maps/lib/span.dart b/pkg/source_maps/lib/span.dart |
index e7bf5bfa4f38733200b8dceb6b84ca69e1a8f688..7ca0ca97c4cc13377205e05cd19c8f96d90e4fb6 100644 |
--- a/pkg/source_maps/lib/span.dart |
+++ b/pkg/source_maps/lib/span.dart |
@@ -219,11 +219,20 @@ class SourceFile { |
int getLine(int offset) => binarySearch(_lineStarts, (o) => o > offset) - 1; |
/// Gets the 0-based column corresponding to an offset. |
- int getColumn(int line, int offset) => offset - _lineStarts[line]; |
+ int getColumn(int line, int offset) { |
+ if (line < 0 || line >= _lineStarts.length) return 0; |
+ return offset - _lineStarts[line]; |
+ } |
/// Get the offset for a given line and column |
- int getOffset(int line, int column) => |
- _lineStarts[max(min(line, _lineStarts.length - 1), 0)] + column; |
+ int getOffset(int line, int column) { |
+ if (line < 0) return getOffset(0, 0); |
+ if (line < _lineStarts.length) { |
+ return _lineStarts[line] + column; |
+ } else { |
+ return _decodedChars.length; |
+ } |
+ } |
/// Gets the text at the given offsets. |
String getText(int start, [int end]) => |
@@ -251,7 +260,6 @@ class SourceFile { |
// +1 for 0-indexing, +1 again to avoid the last line |
var textLine = getText(getOffset(line, 0), getOffset(line + 1, 0)); |
- |
column = min(column, textLine.length - 1); |
int toColumn = min(column + end - start, textLine.length); |
if (useColors) { |
@@ -265,6 +273,7 @@ class SourceFile { |
buf.write(textLine.substring(toColumn)); |
} else { |
buf.write(textLine); |
+ if (textLine != '' && !textLine.endsWith('\n')) buf.write('\n'); |
} |
int i = 0; |
@@ -290,13 +299,13 @@ class SourceFileSegment extends SourceFile { |
final int _baseOffset; |
final int _baseLine; |
final int _baseColumn; |
+ final int _maxOffset; |
- // TODO(sigmund): consider providing an end-offset to correctly truncate |
- // values passed the end of the segment. |
SourceFileSegment(String url, String textSegment, Location startOffset) |
: _baseOffset = startOffset.offset, |
_baseLine = startOffset.line, |
_baseColumn = startOffset.column, |
+ _maxOffset = startOffset.offset + textSegment.length, |
super.text(url, textSegment); |
/// Craete a span, where [start] is relative to this segment's base offset. |
@@ -313,9 +322,13 @@ class SourceFileSegment extends SourceFile { |
/// Return the line on the underlying file associated with the [offset] of the |
/// underlying file. This method operates on the real offsets from the |
- /// original file, so that error messages can be reported accurately. |
- int getLine(int offset) => |
- super.getLine(max(offset - _baseOffset, 0)) + _baseLine; |
+ /// original file, so that error messages can be reported accurately. When the |
+ /// requested offset is past the length of the segment, this returns the line |
+ /// number after the end of the segment (total lines + 1). |
+ int getLine(int offset) { |
+ var res = super.getLine(max(offset - _baseOffset, 0)) + _baseLine; |
+ return (offset > _maxOffset) ? res + 1 : res; |
+ } |
/// Return the column on the underlying file associated with [line] and |
/// [offset], where [line] is absolute from the beginning of the underlying |
@@ -330,13 +343,12 @@ class SourceFileSegment extends SourceFile { |
/// on the real offsets from the original file, so that error messages can be |
/// reported accurately. |
int getOffset(int line, int column) => |
- super.getOffset(line - _baseLine, |
- line == _baseLine ? column - _baseColumn : column) + _baseOffset; |
+ super.getOffset(line - _baseLine, |
+ line == _baseLine ? column - _baseColumn : column) + _baseOffset; |
/// Retrieve the text associated with the specified range. This method |
/// operates on the real offsets from the original file, so that error |
/// messages can be reported accurately. |
String getText(int start, [int end]) => |
- super.getText(start - _baseOffset, |
- end == null ? null : end - _baseOffset); |
+ super.getText(start - _baseOffset, end == null ? null : end - _baseOffset); |
} |