UNPKG

decaffeinate-parser

Version:

A better AST for CoffeeScript, inspired by CoffeeScriptRedux.

42 lines (41 loc) 1.55 kB
"use strict"; 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;