UNPKG

2.54 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.needsWhitespace = needsWhitespace;
7exports.needsWhitespaceBefore = needsWhitespaceBefore;
8exports.needsWhitespaceAfter = needsWhitespaceAfter;
9exports.needsParens = needsParens;
10
11var whitespace = require("./whitespace");
12
13var parens = require("./parentheses");
14
15var t = require("@babel/types");
16
17const {
18 isCallExpression,
19 isExpressionStatement,
20 isMemberExpression,
21 isNewExpression
22} = t;
23
24function 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
50const expandedParens = expandAliases(parens);
51const expandedWhitespaceNodes = expandAliases(whitespace.nodes);
52const expandedWhitespaceList = expandAliases(whitespace.list);
53
54function find(obj, node, parent, printStack) {
55 const fn = obj[node.type];
56 return fn ? fn(node, parent, printStack) : null;
57}
58
59function isOrHasCallExpression(node) {
60 if (isCallExpression(node)) {
61 return true;
62 }
63
64 return isMemberExpression(node) && isOrHasCallExpression(node.object);
65}
66
67function 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
94function needsWhitespaceBefore(node, parent) {
95 return needsWhitespace(node, parent, "before");
96}
97
98function needsWhitespaceAfter(node, parent) {
99 return needsWhitespace(node, parent, "after");
100}
101
102function 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