jashkenas--coffeescript/lib/coffee-script/sourcemap.js

162 lines
4.6 KiB
JavaScript
Raw Normal View History

2015-01-29 17:20:46 +00:00
// Generated by CoffeeScript 1.9.0
2013-02-28 20:51:29 +00:00
(function() {
2013-03-18 11:46:19 +00:00
var LineMap, SourceMap;
LineMap = (function() {
function LineMap(_line) {
this.line = _line;
this.columns = [];
2013-02-28 20:51:29 +00:00
}
LineMap.prototype.add = function(column, _arg, options) {
2013-02-28 20:51:29 +00:00
var sourceColumn, sourceLine;
sourceLine = _arg[0], sourceColumn = _arg[1];
if (options == null) {
options = {};
}
if (this.columns[column] && options.noReplace) {
2013-02-28 20:51:29 +00:00
return;
}
return this.columns[column] = {
line: this.line,
column: column,
2013-02-28 20:51:29 +00:00
sourceLine: sourceLine,
sourceColumn: sourceColumn
};
};
LineMap.prototype.sourceLocation = function(column) {
var mapping;
while (!((mapping = this.columns[column]) || (column <= 0))) {
column--;
2013-02-28 20:51:29 +00:00
}
return mapping && [mapping.sourceLine, mapping.sourceColumn];
2013-02-28 20:51:29 +00:00
};
return LineMap;
2013-02-28 20:51:29 +00:00
})();
SourceMap = (function() {
var BASE64_CHARS, VLQ_CONTINUATION_BIT, VLQ_SHIFT, VLQ_VALUE_MASK;
2013-02-28 20:51:29 +00:00
function SourceMap() {
this.lines = [];
2013-02-28 20:51:29 +00:00
}
SourceMap.prototype.add = function(sourceLocation, generatedLocation, options) {
var column, line, lineMap, _base;
if (options == null) {
options = {};
}
line = generatedLocation[0], column = generatedLocation[1];
lineMap = ((_base = this.lines)[line] || (_base[line] = new LineMap(line)));
return lineMap.add(column, sourceLocation, options);
2013-02-28 20:51:29 +00:00
};
SourceMap.prototype.sourceLocation = function(_arg) {
var column, line, lineMap;
line = _arg[0], column = _arg[1];
while (!((lineMap = this.lines[line]) || (line <= 0))) {
line--;
2013-02-28 20:51:29 +00:00
}
return lineMap && lineMap.sourceLocation(column);
2013-02-28 20:51:29 +00:00
};
SourceMap.prototype.generate = function(options, code) {
2013-03-18 11:36:34 +00:00
var buffer, lastColumn, lastSourceColumn, lastSourceLine, lineMap, lineNumber, mapping, needComma, v3, writingline, _i, _j, _len, _len1, _ref, _ref1;
if (options == null) {
options = {};
2013-02-28 20:51:29 +00:00
}
if (code == null) {
code = null;
2013-02-28 20:51:29 +00:00
}
writingline = 0;
lastColumn = 0;
lastSourceLine = 0;
lastSourceColumn = 0;
needComma = false;
buffer = "";
2013-03-18 11:36:34 +00:00
_ref = this.lines;
for (lineNumber = _i = 0, _len = _ref.length; _i < _len; lineNumber = ++_i) {
lineMap = _ref[lineNumber];
if (lineMap) {
_ref1 = lineMap.columns;
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
mapping = _ref1[_j];
if (!(mapping)) {
continue;
}
while (writingline < mapping.line) {
lastColumn = 0;
needComma = false;
buffer += ";";
writingline++;
}
if (needComma) {
buffer += ",";
needComma = false;
}
buffer += this.encodeVlq(mapping.column - lastColumn);
lastColumn = mapping.column;
buffer += this.encodeVlq(0);
buffer += this.encodeVlq(mapping.sourceLine - lastSourceLine);
2013-03-18 13:50:40 +00:00
lastSourceLine = mapping.sourceLine;
2013-03-18 11:36:34 +00:00
buffer += this.encodeVlq(mapping.sourceColumn - lastSourceColumn);
lastSourceColumn = mapping.sourceColumn;
needComma = true;
}
}
2013-03-18 11:36:34 +00:00
}
v3 = {
version: 3,
file: options.generatedFile || '',
sourceRoot: options.sourceRoot || '',
sources: options.sourceFiles || [''],
names: [],
mappings: buffer
};
if (options.inline) {
v3.sourcesContent = [code];
}
return JSON.stringify(v3, null, 2);
2013-02-28 20:51:29 +00:00
};
VLQ_SHIFT = 5;
2013-02-28 20:51:29 +00:00
VLQ_CONTINUATION_BIT = 1 << VLQ_SHIFT;
2013-02-28 20:51:29 +00:00
VLQ_VALUE_MASK = VLQ_CONTINUATION_BIT - 1;
2013-02-28 20:51:29 +00:00
SourceMap.prototype.encodeVlq = function(value) {
var answer, nextChunk, signBit, valueToEncode;
answer = '';
signBit = value < 0 ? 1 : 0;
valueToEncode = (Math.abs(value) << 1) + signBit;
while (valueToEncode || !answer) {
nextChunk = valueToEncode & VLQ_VALUE_MASK;
valueToEncode = valueToEncode >> VLQ_SHIFT;
if (valueToEncode) {
nextChunk |= VLQ_CONTINUATION_BIT;
}
answer += this.encodeBase64(nextChunk);
}
return answer;
};
2013-02-28 20:51:29 +00:00
BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
2013-02-28 20:51:29 +00:00
SourceMap.prototype.encodeBase64 = function(value) {
return BASE64_CHARS[value] || (function() {
throw new Error("Cannot Base64 encode value: " + value);
})();
};
2013-02-28 20:51:29 +00:00
return SourceMap;
2013-02-28 20:51:29 +00:00
})();
2013-02-28 20:51:29 +00:00
module.exports = SourceMap;
2013-02-28 20:51:29 +00:00
}).call(this);