3 var _tk = require('rocambole-token');
4 var _ws = require('rocambole-whitespace');
5 var debug = require('debug')('esformatter:parentheses');
8 exports.addSpaceInside = addSpaceInsideExpressionParentheses;
9 function addSpaceInsideExpressionParentheses(node) {
10 var parentheses = getParentheses(node);
12 _ws.limitAfter(parentheses.opening, 'ExpressionOpeningParentheses');
13 _ws.limitBefore(parentheses.closing, 'ExpressionClosingParentheses');
18 exports.getParentheses = getParentheses;
19 function getParentheses(node) {
20 if (!isValidExpression(node)) {
21 debug('not valid expression: %s', node.type);
25 var opening = node.startToken;
26 if (/^(?:Binary|Logical)Expression$/.test(node.type) || opening.value !== '(') {
27 opening = _tk.findPrevNonEmpty(opening);
30 if (!opening || opening.value !== '(') {
31 // "safe" to assume it is not inside parentheses
33 'opening is not a parentheses; type: %s, opening: "%s"',
35 opening && opening.value
45 if (token.value === '(') {
47 } else if (token.value === ')') {
58 debug('not inside parentheses', count);
63 'found parentheses; type: %s, opening: "%s", closing: "%s"',
65 opening && opening.value,
66 closing && closing.value
75 // Literal when inside BinaryExpression might be surrounded by parenthesis
76 // CallExpression and ArrayExpression don't need spaces
77 var needExpressionParenthesesSpaces = {
79 CallExpression: false,
80 FunctionExpression: false,
81 ArrayExpression: false,
82 ObjectExpression: false,
83 // Special is used when we need to override default behavior
88 function isValidExpression(node) {
89 var needSpaces = needExpressionParenthesesSpaces[node.type];
95 if (needSpaces == null && node.type.indexOf('Expression') !== -1) {
96 if (node.type === 'ExpressionStatement' &&
97 (node.expression.callee && node.expression.callee.type === 'FunctionExpression')) {