esformatter-literal-notation
Version:
esformatter plugin that converts array and object constructors to literal notations
86 lines (63 loc) • 1.43 kB
JavaScript
;
var tk = require('rocambole-token');
var rocambole = require('rocambole');
exports.transformBefore = transformBefore;
function transformBefore(ast) {
rocambole.moonwalk(ast, literalNotation);
}
function literalNotation(node) {
if (node.type !== 'NewExpression') {
return;
}
var hasArgs = node.arguments.length > 0;
if (node.callee.name === 'Object') {
convertObject(node, hasArgs);
return;
}
if (node.callee.name === 'Array') {
if (hasArgs) {
return;
}
convertArray(node);
return;
}
}
function convertObject(node, keepBraces) {
var endToken = node.endToken;
var token = node.startToken;
while (token !== endToken) {
if (keepBraces && token.value === '{') {
break;
}
tk.remove(token);
token = token.next;
}
if (!keepBraces) {
node.startToken = tk.before(endToken, {
type: 'Punctuator',
value: '{'
});
node.endToken = tk.after(endToken, {
type: 'Punctuator',
value: '}'
});
}
tk.remove(endToken);
}
function convertArray(node) {
var endToken = node.endToken;
var token = node.startToken;
while (token !== endToken) {
tk.remove(token);
token = token.next;
}
node.startToken = tk.before(endToken, {
type: 'Punctuator',
value: '['
});
node.endToken = tk.after(endToken, {
type: 'Punctuator',
value: ']'
});
tk.remove(endToken);
}