'use strict';
var objectPatternB = require('nodes');
var nodes = objectPatternB.nodes;
var syntax = require('nodes/syntax.json');
var objectPatternA = require('../util/self');
var getSelfId = objectPatternA.getSelfId;
var objectPattern = require('../util/arguments');
var getArgumentsId = objectPattern.getArgumentsId;
function arrowify(program) {
var q = [
'#ArrowFunctionExpression => #ThisExpression',
'#ArrowFunctionExpression => #Identifier:reference[name=arguments]'
];
program.search(q).forEach(function (expression) {
var arrowFunction = expression.scope();
var arrowScope = arrowFunction.scope('[type!=ArrowFunctionExpression]');
var id;
if (expression.type === syntax.ThisExpression) {
id = getSelfId(arrowScope);
} else {
id = getArgumentsId(arrowScope);
}
expression.parentNode.replaceChild(expression, id.clone());
});
program.search('#ArrowFunctionExpression').forEach(function (node) {
var shallow = new nodes.FunctionExpression(node);
node.parentNode.replaceChild(node, shallow);
});
}
exports.transform = arrowify; |