parentheses.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.ArrowFunctionExpression = ArrowFunctionExpression;
  6. exports.AssignmentExpression = AssignmentExpression;
  7. exports.Binary = Binary;
  8. exports.BinaryExpression = BinaryExpression;
  9. exports.ClassExpression = ClassExpression;
  10. exports.ConditionalExpression = ConditionalExpression;
  11. exports.DoExpression = DoExpression;
  12. exports.FunctionExpression = FunctionExpression;
  13. exports.FunctionTypeAnnotation = FunctionTypeAnnotation;
  14. exports.Identifier = Identifier;
  15. exports.LogicalExpression = LogicalExpression;
  16. exports.NullableTypeAnnotation = NullableTypeAnnotation;
  17. exports.ObjectExpression = ObjectExpression;
  18. exports.OptionalIndexedAccessType = OptionalIndexedAccessType;
  19. exports.OptionalCallExpression = exports.OptionalMemberExpression = OptionalMemberExpression;
  20. exports.SequenceExpression = SequenceExpression;
  21. exports.TSAsExpression = TSAsExpression;
  22. exports.TSInferType = TSInferType;
  23. exports.TSTypeAssertion = TSTypeAssertion;
  24. exports.TSIntersectionType = exports.TSUnionType = TSUnionType;
  25. exports.UnaryLike = UnaryLike;
  26. exports.IntersectionTypeAnnotation = exports.UnionTypeAnnotation = UnionTypeAnnotation;
  27. exports.UpdateExpression = UpdateExpression;
  28. exports.AwaitExpression = exports.YieldExpression = YieldExpression;
  29. var _t = require("@babel/types");
  30. const {
  31. isArrayTypeAnnotation,
  32. isArrowFunctionExpression,
  33. isAssignmentExpression,
  34. isAwaitExpression,
  35. isBinary,
  36. isBinaryExpression,
  37. isUpdateExpression,
  38. isCallExpression,
  39. isClassDeclaration,
  40. isClassExpression,
  41. isConditional,
  42. isConditionalExpression,
  43. isExportDeclaration,
  44. isExportDefaultDeclaration,
  45. isExpressionStatement,
  46. isFor,
  47. isForInStatement,
  48. isForOfStatement,
  49. isForStatement,
  50. isFunctionExpression,
  51. isIfStatement,
  52. isIndexedAccessType,
  53. isIntersectionTypeAnnotation,
  54. isLogicalExpression,
  55. isMemberExpression,
  56. isNewExpression,
  57. isNullableTypeAnnotation,
  58. isObjectPattern,
  59. isOptionalCallExpression,
  60. isOptionalMemberExpression,
  61. isReturnStatement,
  62. isSequenceExpression,
  63. isSwitchStatement,
  64. isTSArrayType,
  65. isTSAsExpression,
  66. isTSIntersectionType,
  67. isTSNonNullExpression,
  68. isTSOptionalType,
  69. isTSRestType,
  70. isTSTypeAssertion,
  71. isTSUnionType,
  72. isTaggedTemplateExpression,
  73. isThrowStatement,
  74. isTypeAnnotation,
  75. isUnaryLike,
  76. isUnionTypeAnnotation,
  77. isVariableDeclarator,
  78. isWhileStatement,
  79. isYieldExpression
  80. } = _t;
  81. const PRECEDENCE = {
  82. "||": 0,
  83. "??": 0,
  84. "&&": 1,
  85. "|": 2,
  86. "^": 3,
  87. "&": 4,
  88. "==": 5,
  89. "===": 5,
  90. "!=": 5,
  91. "!==": 5,
  92. "<": 6,
  93. ">": 6,
  94. "<=": 6,
  95. ">=": 6,
  96. in: 6,
  97. instanceof: 6,
  98. ">>": 7,
  99. "<<": 7,
  100. ">>>": 7,
  101. "+": 8,
  102. "-": 8,
  103. "*": 9,
  104. "/": 9,
  105. "%": 9,
  106. "**": 10
  107. };
  108. const isClassExtendsClause = (node, parent) => (isClassDeclaration(parent) || isClassExpression(parent)) && parent.superClass === node;
  109. const hasPostfixPart = (node, parent) => (isMemberExpression(parent) || isOptionalMemberExpression(parent)) && parent.object === node || (isCallExpression(parent) || isOptionalCallExpression(parent) || isNewExpression(parent)) && parent.callee === node || isTaggedTemplateExpression(parent) && parent.tag === node || isTSNonNullExpression(parent);
  110. function NullableTypeAnnotation(node, parent) {
  111. return isArrayTypeAnnotation(parent);
  112. }
  113. function FunctionTypeAnnotation(node, parent, printStack) {
  114. return isUnionTypeAnnotation(parent) || isIntersectionTypeAnnotation(parent) || isArrayTypeAnnotation(parent) || isTypeAnnotation(parent) && isArrowFunctionExpression(printStack[printStack.length - 3]);
  115. }
  116. function UpdateExpression(node, parent) {
  117. return hasPostfixPart(node, parent) || isClassExtendsClause(node, parent);
  118. }
  119. function ObjectExpression(node, parent, printStack) {
  120. return isFirstInContext(printStack, {
  121. expressionStatement: true,
  122. arrowBody: true
  123. });
  124. }
  125. function DoExpression(node, parent, printStack) {
  126. return !node.async && isFirstInContext(printStack, {
  127. expressionStatement: true
  128. });
  129. }
  130. function Binary(node, parent) {
  131. if (node.operator === "**" && isBinaryExpression(parent, {
  132. operator: "**"
  133. })) {
  134. return parent.left === node;
  135. }
  136. if (isClassExtendsClause(node, parent)) {
  137. return true;
  138. }
  139. if (hasPostfixPart(node, parent) || isUnaryLike(parent) || isAwaitExpression(parent)) {
  140. return true;
  141. }
  142. if (isBinary(parent)) {
  143. const parentOp = parent.operator;
  144. const parentPos = PRECEDENCE[parentOp];
  145. const nodeOp = node.operator;
  146. const nodePos = PRECEDENCE[nodeOp];
  147. if (parentPos === nodePos && parent.right === node && !isLogicalExpression(parent) || parentPos > nodePos) {
  148. return true;
  149. }
  150. }
  151. }
  152. function UnionTypeAnnotation(node, parent) {
  153. return isArrayTypeAnnotation(parent) || isNullableTypeAnnotation(parent) || isIntersectionTypeAnnotation(parent) || isUnionTypeAnnotation(parent);
  154. }
  155. function OptionalIndexedAccessType(node, parent) {
  156. return isIndexedAccessType(parent, {
  157. objectType: node
  158. });
  159. }
  160. function TSAsExpression() {
  161. return true;
  162. }
  163. function TSTypeAssertion() {
  164. return true;
  165. }
  166. function TSUnionType(node, parent) {
  167. return isTSArrayType(parent) || isTSOptionalType(parent) || isTSIntersectionType(parent) || isTSUnionType(parent) || isTSRestType(parent);
  168. }
  169. function TSInferType(node, parent) {
  170. return isTSArrayType(parent) || isTSOptionalType(parent);
  171. }
  172. function BinaryExpression(node, parent) {
  173. return node.operator === "in" && (isVariableDeclarator(parent) || isFor(parent));
  174. }
  175. function SequenceExpression(node, parent) {
  176. if (isForStatement(parent) || isThrowStatement(parent) || isReturnStatement(parent) || isIfStatement(parent) && parent.test === node || isWhileStatement(parent) && parent.test === node || isForInStatement(parent) && parent.right === node || isSwitchStatement(parent) && parent.discriminant === node || isExpressionStatement(parent) && parent.expression === node) {
  177. return false;
  178. }
  179. return true;
  180. }
  181. function YieldExpression(node, parent) {
  182. return isBinary(parent) || isUnaryLike(parent) || hasPostfixPart(node, parent) || isAwaitExpression(parent) && isYieldExpression(node) || isConditionalExpression(parent) && node === parent.test || isClassExtendsClause(node, parent);
  183. }
  184. function ClassExpression(node, parent, printStack) {
  185. return isFirstInContext(printStack, {
  186. expressionStatement: true,
  187. exportDefault: true
  188. });
  189. }
  190. function UnaryLike(node, parent) {
  191. return hasPostfixPart(node, parent) || isBinaryExpression(parent, {
  192. operator: "**",
  193. left: node
  194. }) || isClassExtendsClause(node, parent);
  195. }
  196. function FunctionExpression(node, parent, printStack) {
  197. return isFirstInContext(printStack, {
  198. expressionStatement: true,
  199. exportDefault: true
  200. });
  201. }
  202. function ArrowFunctionExpression(node, parent) {
  203. return isExportDeclaration(parent) || ConditionalExpression(node, parent);
  204. }
  205. function ConditionalExpression(node, parent) {
  206. if (isUnaryLike(parent) || isBinary(parent) || isConditionalExpression(parent, {
  207. test: node
  208. }) || isAwaitExpression(parent) || isTSTypeAssertion(parent) || isTSAsExpression(parent)) {
  209. return true;
  210. }
  211. return UnaryLike(node, parent);
  212. }
  213. function OptionalMemberExpression(node, parent) {
  214. return isCallExpression(parent, {
  215. callee: node
  216. }) || isMemberExpression(parent, {
  217. object: node
  218. });
  219. }
  220. function AssignmentExpression(node, parent) {
  221. if (isObjectPattern(node.left)) {
  222. return true;
  223. } else {
  224. return ConditionalExpression(node, parent);
  225. }
  226. }
  227. function LogicalExpression(node, parent) {
  228. switch (node.operator) {
  229. case "||":
  230. if (!isLogicalExpression(parent)) return false;
  231. return parent.operator === "??" || parent.operator === "&&";
  232. case "&&":
  233. return isLogicalExpression(parent, {
  234. operator: "??"
  235. });
  236. case "??":
  237. return isLogicalExpression(parent) && parent.operator !== "??";
  238. }
  239. }
  240. function Identifier(node, parent, printStack) {
  241. var _node$extra;
  242. if ((_node$extra = node.extra) != null && _node$extra.parenthesized && isAssignmentExpression(parent, {
  243. left: node
  244. }) && (isFunctionExpression(parent.right) || isClassExpression(parent.right)) && parent.right.id == null) {
  245. return true;
  246. }
  247. if (node.name === "let") {
  248. const isFollowedByBracket = isMemberExpression(parent, {
  249. object: node,
  250. computed: true
  251. }) || isOptionalMemberExpression(parent, {
  252. object: node,
  253. computed: true,
  254. optional: false
  255. });
  256. return isFirstInContext(printStack, {
  257. expressionStatement: isFollowedByBracket,
  258. forHead: isFollowedByBracket,
  259. forInHead: isFollowedByBracket,
  260. forOfHead: true
  261. });
  262. }
  263. return node.name === "async" && isForOfStatement(parent) && node === parent.left;
  264. }
  265. function isFirstInContext(printStack, {
  266. expressionStatement = false,
  267. arrowBody = false,
  268. exportDefault = false,
  269. forHead = false,
  270. forInHead = false,
  271. forOfHead = false
  272. }) {
  273. let i = printStack.length - 1;
  274. let node = printStack[i];
  275. i--;
  276. let parent = printStack[i];
  277. while (i >= 0) {
  278. if (expressionStatement && isExpressionStatement(parent, {
  279. expression: node
  280. }) || exportDefault && isExportDefaultDeclaration(parent, {
  281. declaration: node
  282. }) || arrowBody && isArrowFunctionExpression(parent, {
  283. body: node
  284. }) || forHead && isForStatement(parent, {
  285. init: node
  286. }) || forInHead && isForInStatement(parent, {
  287. left: node
  288. }) || forOfHead && isForOfStatement(parent, {
  289. left: node
  290. })) {
  291. return true;
  292. }
  293. if (hasPostfixPart(node, parent) && !isNewExpression(parent) || isSequenceExpression(parent) && parent.expressions[0] === node || isUpdateExpression(parent) && !parent.prefix || isConditional(parent, {
  294. test: node
  295. }) || isBinary(parent, {
  296. left: node
  297. }) || isAssignmentExpression(parent, {
  298. left: node
  299. })) {
  300. node = parent;
  301. i--;
  302. parent = printStack[i];
  303. } else {
  304. return false;
  305. }
  306. }
  307. return false;
  308. }