parentheses.js 10.0 KB

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