1 | "use strict";
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.needsWhitespace = needsWhitespace;
|
7 | exports.needsWhitespaceBefore = needsWhitespaceBefore;
|
8 | exports.needsWhitespaceAfter = needsWhitespaceAfter;
|
9 | exports.needsParens = needsParens;
|
10 |
|
11 | var whitespace = require("./whitespace");
|
12 |
|
13 | var parens = require("./parentheses");
|
14 |
|
15 | var t = require("@babel/types");
|
16 |
|
17 | const {
|
18 | isCallExpression,
|
19 | isExpressionStatement,
|
20 | isMemberExpression,
|
21 | isNewExpression
|
22 | } = t;
|
23 |
|
24 | function expandAliases(obj) {
|
25 | const newObj = {};
|
26 |
|
27 | function add(type, func) {
|
28 | const fn = newObj[type];
|
29 | newObj[type] = fn ? function (node, parent, stack) {
|
30 | const result = fn(node, parent, stack);
|
31 | return result == null ? func(node, parent, stack) : result;
|
32 | } : func;
|
33 | }
|
34 |
|
35 | for (const type of Object.keys(obj)) {
|
36 | const aliases = t.FLIPPED_ALIAS_KEYS[type];
|
37 |
|
38 | if (aliases) {
|
39 | for (const alias of aliases) {
|
40 | add(alias, obj[type]);
|
41 | }
|
42 | } else {
|
43 | add(type, obj[type]);
|
44 | }
|
45 | }
|
46 |
|
47 | return newObj;
|
48 | }
|
49 |
|
50 | const expandedParens = expandAliases(parens);
|
51 | const expandedWhitespaceNodes = expandAliases(whitespace.nodes);
|
52 | const expandedWhitespaceList = expandAliases(whitespace.list);
|
53 |
|
54 | function find(obj, node, parent, printStack) {
|
55 | const fn = obj[node.type];
|
56 | return fn ? fn(node, parent, printStack) : null;
|
57 | }
|
58 |
|
59 | function isOrHasCallExpression(node) {
|
60 | if (isCallExpression(node)) {
|
61 | return true;
|
62 | }
|
63 |
|
64 | return isMemberExpression(node) && isOrHasCallExpression(node.object);
|
65 | }
|
66 |
|
67 | function needsWhitespace(node, parent, type) {
|
68 | if (!node) return 0;
|
69 |
|
70 | if (isExpressionStatement(node)) {
|
71 | node = node.expression;
|
72 | }
|
73 |
|
74 | let linesInfo = find(expandedWhitespaceNodes, node, parent);
|
75 |
|
76 | if (!linesInfo) {
|
77 | const items = find(expandedWhitespaceList, node, parent);
|
78 |
|
79 | if (items) {
|
80 | for (let i = 0; i < items.length; i++) {
|
81 | linesInfo = needsWhitespace(items[i], node, type);
|
82 | if (linesInfo) break;
|
83 | }
|
84 | }
|
85 | }
|
86 |
|
87 | if (typeof linesInfo === "object" && linesInfo !== null) {
|
88 | return linesInfo[type] || 0;
|
89 | }
|
90 |
|
91 | return 0;
|
92 | }
|
93 |
|
94 | function needsWhitespaceBefore(node, parent) {
|
95 | return needsWhitespace(node, parent, "before");
|
96 | }
|
97 |
|
98 | function needsWhitespaceAfter(node, parent) {
|
99 | return needsWhitespace(node, parent, "after");
|
100 | }
|
101 |
|
102 | function needsParens(node, parent, printStack) {
|
103 | if (!parent) return false;
|
104 |
|
105 | if (isNewExpression(parent) && parent.callee === node) {
|
106 | if (isOrHasCallExpression(node)) return true;
|
107 | }
|
108 |
|
109 | return find(expandedParens, node, parent, printStack);
|
110 | } |
\ | No newline at end of file |