UNPKG

3.98 kBJavaScriptView Raw
1"use strict";
2
3exports.__esModule = true;
4
5var _getIterator2 = require("babel-runtime/core-js/get-iterator");
6
7var _getIterator3 = _interopRequireDefault(_getIterator2);
8
9var _keys = require("babel-runtime/core-js/object/keys");
10
11var _keys2 = _interopRequireDefault(_keys);
12
13exports.needsWhitespace = needsWhitespace;
14exports.needsWhitespaceBefore = needsWhitespaceBefore;
15exports.needsWhitespaceAfter = needsWhitespaceAfter;
16exports.needsParens = needsParens;
17
18var _whitespace = require("./whitespace");
19
20var _whitespace2 = _interopRequireDefault(_whitespace);
21
22var _parentheses = require("./parentheses");
23
24var parens = _interopRequireWildcard(_parentheses);
25
26var _babelTypes = require("babel-types");
27
28var t = _interopRequireWildcard(_babelTypes);
29
30function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
31
32function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
33
34function expandAliases(obj) {
35 var newObj = {};
36
37 function add(type, func) {
38 var fn = newObj[type];
39 newObj[type] = fn ? function (node, parent, stack) {
40 var result = fn(node, parent, stack);
41
42 return result == null ? func(node, parent, stack) : result;
43 } : func;
44 }
45
46 for (var _iterator = (0, _keys2.default)(obj), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
47 var _ref;
48
49 if (_isArray) {
50 if (_i >= _iterator.length) break;
51 _ref = _iterator[_i++];
52 } else {
53 _i = _iterator.next();
54 if (_i.done) break;
55 _ref = _i.value;
56 }
57
58 var type = _ref;
59
60
61 var aliases = t.FLIPPED_ALIAS_KEYS[type];
62 if (aliases) {
63 for (var _iterator2 = aliases, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {
64 var _ref2;
65
66 if (_isArray2) {
67 if (_i2 >= _iterator2.length) break;
68 _ref2 = _iterator2[_i2++];
69 } else {
70 _i2 = _iterator2.next();
71 if (_i2.done) break;
72 _ref2 = _i2.value;
73 }
74
75 var alias = _ref2;
76
77 add(alias, obj[type]);
78 }
79 } else {
80 add(type, obj[type]);
81 }
82 }
83
84 return newObj;
85}
86
87var expandedParens = expandAliases(parens);
88var expandedWhitespaceNodes = expandAliases(_whitespace2.default.nodes);
89var expandedWhitespaceList = expandAliases(_whitespace2.default.list);
90
91function find(obj, node, parent, printStack) {
92 var fn = obj[node.type];
93 return fn ? fn(node, parent, printStack) : null;
94}
95
96function isOrHasCallExpression(node) {
97 if (t.isCallExpression(node)) {
98 return true;
99 }
100
101 if (t.isMemberExpression(node)) {
102 return isOrHasCallExpression(node.object) || !node.computed && isOrHasCallExpression(node.property);
103 } else {
104 return false;
105 }
106}
107
108function needsWhitespace(node, parent, type) {
109 if (!node) return 0;
110
111 if (t.isExpressionStatement(node)) {
112 node = node.expression;
113 }
114
115 var linesInfo = find(expandedWhitespaceNodes, node, parent);
116
117 if (!linesInfo) {
118 var items = find(expandedWhitespaceList, node, parent);
119 if (items) {
120 for (var i = 0; i < items.length; i++) {
121 linesInfo = needsWhitespace(items[i], node, type);
122 if (linesInfo) break;
123 }
124 }
125 }
126
127 return linesInfo && linesInfo[type] || 0;
128}
129
130function needsWhitespaceBefore(node, parent) {
131 return needsWhitespace(node, parent, "before");
132}
133
134function needsWhitespaceAfter(node, parent) {
135 return needsWhitespace(node, parent, "after");
136}
137
138function needsParens(node, parent, printStack) {
139 if (!parent) return false;
140
141 if (t.isNewExpression(parent) && parent.callee === node) {
142 if (isOrHasCallExpression(node)) return true;
143 }
144
145 return find(expandedParens, node, parent, printStack);
146}
\No newline at end of file