shift-spidermonkey-converter
Version:
convert ASTs between Shift and SpiderMonkey formats
139 lines (132 loc) • 14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = cook;
/**
* Copyright 2016 Shape Security, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License")
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Exports a single function which "cooks" template strings, i.e. interprets any escape sequences and converts \r\n into \n.
// Adapted from shift-parser's scanStringEscape
function getHexValue(rune) {
if ("0" <= rune && rune <= "9") {
return rune.charCodeAt(0) - 48;
}
if ("a" <= rune && rune <= "f") {
return rune.charCodeAt(0) - 87;
}
if ("A" <= rune && rune <= "F") {
return rune.charCodeAt(0) - 55;
}
return -1;
}
function isLineTerminator(cp) {
return cp === 0x0A || cp === 0x0D || cp === 0x2028 || cp === 0x2029;
}
function fromCodePoint(cp) {
if (cp <= 0xFFFF) return String.fromCharCode(cp);
var cu1 = String.fromCharCode(Math.floor((cp - 0x10000) / 0x400) + 0xD800);
var cu2 = String.fromCharCode((cp - 0x10000) % 0x400 + 0xDC00);
return cu1 + cu2;
}
function cook(source) {
// convert a TemplateCharacters into its Template Value
// https://tc39.github.io/ecma262/#sec-static-semantics-tv-and-trv
var str = "";
for (var index = 0; index < source.length; ++index) {
var ch = source.charAt(index);
if (ch === "\\") {
ch = source.charAt(++index);
if (!isLineTerminator(ch.charCodeAt(0))) {
switch (ch) {
case "n":
str += "\n";
break;
case "r":
str += "\r";
break;
case "t":
str += "\t";
break;
case "u":
case "x":
var unescaped = void 0;
index++;
if (ch === "u") {
if (source.charAt(index) === "{") {
//\u{HexDigits}
var i = index + 1;
var hexDigits = 0,
_ch = void 0;
while (i < source.length) {
_ch = source.charAt(i);
var hex = getHexValue(_ch);
if (hex === -1) {
break;
}
hexDigits = hexDigits << 4 | hex;
i++;
}
index = i;
unescaped = hexDigits;
} else {
//\uHex4Digits
var r1 = getHexValue(source.charAt(index));
var r2 = getHexValue(source.charAt(index + 1));
var r3 = getHexValue(source.charAt(index + 2));
var r4 = getHexValue(source.charAt(index + 3));
index += 3;
unescaped = r1 << 12 | r2 << 8 | r3 << 4 | r4;
}
} else {
var _r = getHexValue(source.charAt(index));
var _r2 = getHexValue(source.charAt(index + 1));
index++;
unescaped = _r << 4 | _r2;
}
str += fromCodePoint(unescaped);
break;
case "b":
str += "\b";
break;
case "f":
str += "\f";
break;
case "v":
str += "\x0B";
break;
case "0":
str += "\0";
break;
default:
str += ch;
}
} else {
if (ch === "\r" && source.charAt(index + 1) === "\n") {
index++;
}
}
} else if (isLineTerminator(ch.charCodeAt(0))) {
if (ch === "\r" && source.charAt(index + 1) === "\n") {
index++;
}
str += "\n";
} else {
str += ch;
}
}
return str;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb29rLXRlbXBsYXRlLXN0cmluZy5qcyJdLCJuYW1lcyI6WyJjb29rIiwiZ2V0SGV4VmFsdWUiLCJydW5lIiwiY2hhckNvZGVBdCIsImlzTGluZVRlcm1pbmF0b3IiLCJjcCIsImZyb21Db2RlUG9pbnQiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJjdTEiLCJNYXRoIiwiZmxvb3IiLCJjdTIiLCJzb3VyY2UiLCJzdHIiLCJpbmRleCIsImxlbmd0aCIsImNoIiwiY2hhckF0IiwidW5lc2NhcGVkIiwiaSIsImhleERpZ2l0cyIsImhleCIsInIxIiwicjIiLCJyMyIsInI0Il0sIm1hcHBpbmdzIjoiOzs7OztrQkE4Q3dCQSxJO0FBOUN4Qjs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQTtBQUNBOzs7QUFHQSxTQUFTQyxXQUFULENBQXFCQyxJQUFyQixFQUEyQjtBQUN6QixNQUFJLE9BQU9BLElBQVAsSUFBZUEsUUFBUSxHQUEzQixFQUFnQztBQUM5QixXQUFPQSxLQUFLQyxVQUFMLENBQWdCLENBQWhCLElBQXFCLEVBQTVCO0FBQ0Q7QUFDRCxNQUFJLE9BQU9ELElBQVAsSUFBZUEsUUFBUSxHQUEzQixFQUFnQztBQUM5QixXQUFPQSxLQUFLQyxVQUFMLENBQWdCLENBQWhCLElBQXFCLEVBQTVCO0FBQ0Q7QUFDRCxNQUFJLE9BQU9ELElBQVAsSUFBZUEsUUFBUSxHQUEzQixFQUFnQztBQUM5QixXQUFPQSxLQUFLQyxVQUFMLENBQWdCLENBQWhCLElBQXFCLEVBQTVCO0FBQ0Q7QUFDRCxTQUFPLENBQUMsQ0FBUjtBQUNEOztBQUVELFNBQVNDLGdCQUFULENBQTBCQyxFQUExQixFQUE4QjtBQUM1QixTQUFRQSxPQUFPLElBQVIsSUFBa0JBLE9BQU8sSUFBekIsSUFBbUNBLE9BQU8sTUFBMUMsSUFBc0RBLE9BQU8sTUFBcEU7QUFDRDs7QUFFRCxTQUFTQyxhQUFULENBQXVCRCxFQUF2QixFQUEyQjtBQUN6QixNQUFJQSxNQUFNLE1BQVYsRUFBa0IsT0FBT0Us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RUEsbUJBQU8sTUFBUDtBQUNBO0FBQ0YsZUFBSyxHQUFMO0FBQ0VBLG1CQUFPLElBQVA7QUFDQTtBQUNGO0FBQ0VBLG1CQUFPRyxFQUFQO0FBNURKO0FBOERELE9BL0RELE1BK0RPO0FBQ0wsWUFBSUEsT0FBTyxJQUFQLElBQWVKLE9BQU9LLE1BQVAsQ0FBY0gsUUFBUSxDQUF0QixNQUE2QixJQUFoRCxFQUFzRDtBQUNwREE7QUFDRDtBQUNGO0FBQ0YsS0F0RUQsTUFzRU8sSUFBSVgsaUJBQWlCYSxHQUFHZCxVQUFILENBQWMsQ0FBZCxDQUFqQixDQUFKLEVBQXdDO0FBQzdDLFVBQUljLE9BQU8sSUFBUCxJQUFlSixPQUFPSyxNQUFQLENBQWNILFFBQVEsQ0FBdEIsTUFBNkIsSUFBaEQsRUFBc0Q7QUFDcERBO0FBQ0Q7QUFDREQsYUFBTyxJQUFQO0FBQ0QsS0FMTSxNQUtBO0FBQ0xBLGFBQU9HLEVBQVA7QUFDRDtBQUNGO0FBQ0QsU0FBT0gsR0FBUDtBQUNEIiwiZmlsZSI6ImNvb2stdGVtcGxhdGUtc3RyaW5nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNiBTaGFwZSBTZWN1cml0eSwgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIilcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cblxuLy8gRXhwb3J0cyBhIHNpbmdsZSBmdW5jdGlvbiB3aGljaCBcImNvb2tzXCIgdGVtcGxhdGUgc3RyaW5ncywgaS5lLiBpbnRlcnByZXRzIGFueSBlc2NhcGUgc2VxdWVuY2VzIGFuZCBjb252ZXJ0cyBcXHJcXG4gaW50byBcXG4uXG4vLyBBZGFwdGVkIGZyb20gc2hpZnQtcGFyc2VyJ3Mgc2NhblN0cmluZ0VzY2FwZVxuXG5cbmZ1bmN0aW9uIGdldEhleFZhbHVlKHJ1bmUpIHtcbiAgaWYgKFwiMFwiIDw9IHJ1bmUgJiYgcnVuZSA8PSBcIjlcIikge1xuICAgIHJldHVybiBydW5lLmNoYXJDb2RlQXQoMCkgLSA0ODtcbiAgfVxuICBpZiAoXCJhXCIgPD0gcnVuZSAmJiBydW5lIDw9IFwiZlwiKSB7XG4gICAgcmV0dXJuIHJ1bmUuY2hhckNvZGVBdCgwKSAtIDg3O1xuICB9XG4gIGlmIChcIkFcIiA8PSBydW5lICYmIHJ1bmUgPD0gXCJGXCIpIHtcbiAgICByZXR1cm4gcnVuZS5jaGFyQ29kZUF0KDApIC0gNTU7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBpc0xpbmVUZXJtaW5hdG9yKGNwKSB7XG4gIHJldHVybiAoY3AgPT09IDB4MEEpIHx8IChjcCA9PT0gMHgwRCkgfHwgKGNwID09PSAweDIwMjgpIHx8IChjcCA9PT0gMHgyMDI5KTtcbn1cblxuZnVuY3Rpb24gZnJvbUNvZGVQb2ludChjcCkge1xuICBpZiAoY3AgPD0gMHhGRkZGKSByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjcCk7XG4gIGxldCBjdTEgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKE1hdGguZmxvb3IoKGNwIC0gMHgxMDAwMCkgLyAweDQwMCkgKyAweEQ4MDApO1xuICBsZXQgY3UyID0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGNwIC0gMHgxMDAwMCkgJSAweDQwMCkgKyAweERDMDApO1xuICByZXR1cm4gY3UxICsgY3UyO1xufVxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvb2soc291cmNlKSB7XG4gIC8vIGNvbnZlcnQgYSBUZW1wbGF0ZUNoYXJhY3RlcnMgaW50byBpdHMgVGVtcGxhdGUgVmFsdWVcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RhdGljLXNlbWFudGljcy10di1hbmQtdHJ2XG4gIGxldCBzdHIgPSBcIlwiO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlLmxlbmd0aDsgKytpbmRleCkge1xuICAgIGxldCBjaCA9IHNvdXJjZS5jaGFyQXQoaW5kZXgpO1xuICAgIGlmIChjaCA9PT0gXCJcXFxcXCIpIHtcbiAgICAgIGNoID0gc291cmNlLmNoYXJBdCgrK2luZGV4KTtcbiAgICAgIGlmICghaXNMaW5lVGVybWluYXRvcihjaC5jaGFyQ29kZUF0KDApKSkge1xuICAgICAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICAgICAgY2FzZSBcIm5cIjpcbiAgICAgICAgICAgIHN0ciArPSBcIlxcblwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInJcIjpcbiAgICAgICAgICAgIHN0ciArPSBcIlxcclwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInRcIjpcbiAgICAgICAgICAgIHN0ciArPSBcIlxcdFwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInVcIjpcbiAgICAgICAgICBjYXNlIFwieFwiOlxuICAgICAgICAgICAgbGV0IHVuZXNjYXBlZDtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICBpZiAoY2ggPT09IFwidVwiKSB7XG4gICAgICAgICAgICAgIGlmIChzb3VyY2UuY2hhckF0KGluZGV4KSA9PT0gXCJ7XCIpIHtcbiAgICAgICAgICAgICAgICAvL1xcdXtIZXhEaWdpdHN9XG4gICAgICAgICAgICAgICAgbGV0IGkgPSBpbmRleCArIDE7XG4gICAgICAgICAgICAgICAgbGV0IGhleERpZ2l0cyA9IDAsIGNoO1xuICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgc291cmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgY2ggPSBzb3VyY2UuY2hhckF0KGkpO1xuICAgICAgICAgICAgICAgICAgbGV0IGhleCA9IGdldEhleFZhbHVlKGNoKTtcbiAgICAgICAgICAgICAgICAgIGlmIChoZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaGV4RGlnaXRzID0gKGhleERpZ2l0cyA8PCA0KSB8IGhleDtcbiAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIHVuZXNjYXBlZCA9IGhleERpZ2l0cztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL1xcdUhleDREaWdpdHNcbiAgICAgICAgICAgICAgICBsZXQgcjEgPSBnZXRIZXhWYWx1ZShzb3VyY2UuY2hhckF0KGluZGV4KSk7XG4gICAgICAgICAgICAgICAgbGV0IHIyID0gZ2V0SGV4VmFsdWUoc291cmNlLmNoYXJBdChpbmRleCArIDEpKTtcbiAgICAgICAgICAgICAgICBsZXQgcjMgPSBnZXRIZXhWYWx1ZShzb3VyY2UuY2hhckF0KGluZGV4ICsgMikpO1xuICAgICAgICAgICAgICAgIGxldCByNCA9IGdldEhleFZhbHVlKHNvdXJjZS5jaGFyQXQoaW5kZXggKyAzKSk7XG4gICAgICAgICAgICAgICAgaW5kZXggKz0gMztcbiAgICAgICAgICAgICAgICB1bmVzY2FwZWQgPSByMSA8PCAxMiB8IHIyIDw8IDggfCByMyA8PCA0IHwgcjQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxldCByMSA9IGdldEhleFZhbHVlKHNvdXJjZS5jaGFyQXQoaW5kZXgpKTtcbiAgICAgICAgICAgICAgbGV0IHIyID0gZ2V0SGV4VmFsdWUoc291cmNlLmNoYXJBdChpbmRleCArIDEpKTtcbiAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgdW5lc2NhcGVkID0gcjEgPDwgNCB8IHIyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RyICs9IGZyb21Db2RlUG9pbnQodW5lc2NhcGVkKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJiXCI6XG4gICAgICAgICAgICBzdHIgKz0gXCJcXGJcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJmXCI6XG4gICAgICAgICAgICBzdHIgKz0gXCJcXGZcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJ2XCI6XG4gICAgICAgICAgICBzdHIgKz0gXCJcXHUwMDBCXCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiMFwiOlxuICAgICAgICAgICAgc3RyICs9IFwiXFwwXCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgc3RyICs9IGNoO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY2ggPT09IFwiXFxyXCIgJiYgc291cmNlLmNoYXJBdChpbmRleCArIDEpID09PSBcIlxcblwiKSB7XG4gICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNMaW5lVGVybWluYXRvcihjaC5jaGFyQ29kZUF0KDApKSkge1xuICAgICAgaWYgKGNoID09PSBcIlxcclwiICYmIHNvdXJjZS5jaGFyQXQoaW5kZXggKyAxKSA9PT0gXCJcXG5cIikge1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgc3RyICs9IFwiXFxuXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSBjaDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn1cbiJdfQ==