92 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var adoptBuffer = require('./adopt-buffer');
 | |
| var isBOM = require('../tokenizer').isBOM;
 | |
| 
 | |
| var N = 10;
 | |
| var F = 12;
 | |
| var R = 13;
 | |
| 
 | |
| function computeLinesAndColumns(host, source) {
 | |
|     var sourceLength = source.length;
 | |
|     var lines = adoptBuffer(host.lines, sourceLength); // +1
 | |
|     var line = host.startLine;
 | |
|     var columns = adoptBuffer(host.columns, sourceLength);
 | |
|     var column = host.startColumn;
 | |
|     var startOffset = source.length > 0 ? isBOM(source.charCodeAt(0)) : 0;
 | |
| 
 | |
|     for (var i = startOffset; i < sourceLength; i++) { // -1
 | |
|         var code = source.charCodeAt(i);
 | |
| 
 | |
|         lines[i] = line;
 | |
|         columns[i] = column++;
 | |
| 
 | |
|         if (code === N || code === R || code === F) {
 | |
|             if (code === R && i + 1 < sourceLength && source.charCodeAt(i + 1) === N) {
 | |
|                 i++;
 | |
|                 lines[i] = line;
 | |
|                 columns[i] = column;
 | |
|             }
 | |
| 
 | |
|             line++;
 | |
|             column = 1;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     lines[i] = line;
 | |
|     columns[i] = column;
 | |
| 
 | |
|     host.lines = lines;
 | |
|     host.columns = columns;
 | |
| }
 | |
| 
 | |
| var OffsetToLocation = function() {
 | |
|     this.lines = null;
 | |
|     this.columns = null;
 | |
|     this.linesAndColumnsComputed = false;
 | |
| };
 | |
| 
 | |
| OffsetToLocation.prototype = {
 | |
|     setSource: function(source, startOffset, startLine, startColumn) {
 | |
|         this.source = source;
 | |
|         this.startOffset = typeof startOffset === 'undefined' ? 0 : startOffset;
 | |
|         this.startLine = typeof startLine === 'undefined' ? 1 : startLine;
 | |
|         this.startColumn = typeof startColumn === 'undefined' ? 1 : startColumn;
 | |
|         this.linesAndColumnsComputed = false;
 | |
|     },
 | |
| 
 | |
|     ensureLinesAndColumnsComputed: function() {
 | |
|         if (!this.linesAndColumnsComputed) {
 | |
|             computeLinesAndColumns(this, this.source);
 | |
|             this.linesAndColumnsComputed = true;
 | |
|         }
 | |
|     },
 | |
|     getLocation: function(offset, filename) {
 | |
|         this.ensureLinesAndColumnsComputed();
 | |
| 
 | |
|         return {
 | |
|             source: filename,
 | |
|             offset: this.startOffset + offset,
 | |
|             line: this.lines[offset],
 | |
|             column: this.columns[offset]
 | |
|         };
 | |
|     },
 | |
|     getLocationRange: function(start, end, filename) {
 | |
|         this.ensureLinesAndColumnsComputed();
 | |
| 
 | |
|         return {
 | |
|             source: filename,
 | |
|             start: {
 | |
|                 offset: this.startOffset + start,
 | |
|                 line: this.lines[start],
 | |
|                 column: this.columns[start]
 | |
|             },
 | |
|             end: {
 | |
|                 offset: this.startOffset + end,
 | |
|                 line: this.lines[end],
 | |
|                 column: this.columns[end]
 | |
|             }
 | |
|         };
 | |
|     }
 | |
| };
 | |
| 
 | |
| module.exports = OffsetToLocation;
 |