decaffeinate-parser
Version:
A better AST for CoffeeScript, inspired by CoffeeScriptRedux.
38 lines (37 loc) • 1.33 kB
JavaScript
import lex from 'coffee-lex';
import { patchCoffeeScript } from './ext/coffee-script';
import mapProgram from './mappers/mapProgram';
import parseCS1AsCS2 from './parseCS1AsCS2';
import parseCS2 from './parseCS2';
import fixLocations from './util/fixLocations';
import ParseContext from './util/ParseContext';
export var DEFAULT_OPTIONS = {
useCS2: false
};
export function parse(source, options) {
if (options === void 0) { options = DEFAULT_OPTIONS; }
patchCoffeeScript();
var parse = options.useCS2 ? parseCS2 : parseCS1AsCS2;
var sourceLex = function (s) {
return lex(s, { useCS2: options.useCS2 });
};
var context = ParseContext.fromSource(source, sourceLex, parse);
fixLocations(context, context.ast);
var program = mapProgram(context);
traverse(program, function (node, parent) {
node.parentNode = parent;
});
return program;
}
export 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);
}