decaffeinate-parser
Version:
A better AST for CoffeeScript, inspired by CoffeeScriptRedux.
42 lines (41 loc) • 1.55 kB
JavaScript
;
exports.__esModule = true;
var coffee_lex_1 = require("coffee-lex");
var coffee_script_1 = require("./ext/coffee-script");
var mapProgram_1 = require("./mappers/mapProgram");
var parseCS1AsCS2_1 = require("./parseCS1AsCS2");
var parseCS2_1 = require("./parseCS2");
var fixLocations_1 = require("./util/fixLocations");
var ParseContext_1 = require("./util/ParseContext");
exports.DEFAULT_OPTIONS = {
useCS2: false
};
function parse(source, options) {
if (options === void 0) { options = exports.DEFAULT_OPTIONS; }
coffee_script_1.patchCoffeeScript();
var parse = options.useCS2 ? parseCS2_1["default"] : parseCS1AsCS2_1["default"];
var sourceLex = function (s) {
return coffee_lex_1["default"](s, { useCS2: options.useCS2 });
};
var context = ParseContext_1["default"].fromSource(source, sourceLex, parse);
fixLocations_1["default"](context, context.ast);
var program = mapProgram_1["default"](context);
traverse(program, function (node, parent) {
node.parentNode = parent;
});
return program;
}
exports.parse = parse;
function traverse(node, callback) {
function traverseRec(currentNode, currentParent) {
var shouldDescend = callback(currentNode, currentParent);
if (shouldDescend !== false) {
for (var _i = 0, _a = currentNode.getChildren(); _i < _a.length; _i++) {
var child = _a[_i];
traverseRec(child, currentNode);
}
}
}
traverseRec(node, null);
}
exports.traverse = traverse;