Index: runtime/bin/vmservice/client/lib/src/service/object.dart |
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart |
index 5e008d16d4e34474c361fd98c440a38b39849955..0341965852e609642a3ae3c9e7986e591fbc63a7 100644 |
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart |
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart |
@@ -819,6 +819,14 @@ class Script extends ServiceObject { |
Script._empty(ServiceObjectOwner owner) : super._empty(owner); |
+ /// This function maps a token position to a line number. |
+ int tokenToLine(int token) => _tokenToLine[token]; |
+ Map _tokenToLine; |
+ |
+ /// This function maps a token position to a column number. |
+ int tokenToCol(int token) => _tokenToCol[token]; |
+ Map _tokenToCol; |
+ |
void _update(ObservableMap map, bool mapIsRef) { |
kind = map['kind']; |
_url = map['name']; |
@@ -826,6 +834,26 @@ class Script extends ServiceObject { |
name = _shortUrl; |
vmName = _url; |
_processSource(map['source']); |
+ _parseTokenPosTable(map['tokenPosTable']); |
+ } |
+ |
+ void _parseTokenPosTable(List<List<int>> table) { |
+ if (table == null) { |
+ return; |
+ } |
+ _tokenToLine = {}; |
+ _tokenToCol = {}; |
+ for (var line in table) { |
+ // Each entry begins with a line number... |
+ var lineNumber = line[0]; |
+ for (var pos = 1; pos < line.length; pos += 2) { |
+ // ...and is followed by (token offset, col number) pairs. |
+ var tokenOffset = line[pos]; |
+ var colNumber = line[pos+1]; |
+ _tokenToLine[tokenOffset] = lineNumber; |
+ _tokenToCol[tokenOffset] = colNumber; |
+ } |
+ } |
} |
void _processHits(List scriptHits) { |