parentheses.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  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.TSTypeAssertion = exports.TSSatisfiesExpression = exports.TSAsExpression = TSAsExpression;
  22. exports.TSInferType = TSInferType;
  23. exports.TSInstantiationExpression = TSInstantiationExpression;
  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. isClass,
  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. isTSInstantiationExpression,
  67. isTSIntersectionType,
  68. isTSNonNullExpression,
  69. isTSOptionalType,
  70. isTSRestType,
  71. isTSTypeAssertion,
  72. isTSUnionType,
  73. isTaggedTemplateExpression,
  74. isThrowStatement,
  75. isTypeAnnotation,
  76. isUnaryLike,
  77. isUnionTypeAnnotation,
  78. isVariableDeclarator,
  79. isWhileStatement,
  80. isYieldExpression,
  81. isTSSatisfiesExpression
  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. function isTSTypeExpression(node) {
  112. return isTSAsExpression(node) || isTSSatisfiesExpression(node) || isTSTypeAssertion(node);
  113. }
  114. const isClassExtendsClause = (node, parent) => isClass(parent, {
  115. superClass: node
  116. });
  117. 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);
  118. function NullableTypeAnnotation(node, parent) {
  119. return isArrayTypeAnnotation(parent);
  120. }
  121. function FunctionTypeAnnotation(node, parent, printStack) {
  122. if (printStack.length < 3) return;
  123. return isUnionTypeAnnotation(parent) || isIntersectionTypeAnnotation(parent) || isArrayTypeAnnotation(parent) || isTypeAnnotation(parent) && isArrowFunctionExpression(printStack[printStack.length - 3]);
  124. }
  125. function UpdateExpression(node, parent) {
  126. return hasPostfixPart(node, parent) || isClassExtendsClause(node, parent);
  127. }
  128. function ObjectExpression(node, parent, printStack) {
  129. return isFirstInContext(printStack, 1 | 2);
  130. }
  131. function DoExpression(node, parent, printStack) {
  132. return !node.async && isFirstInContext(printStack, 1);
  133. }
  134. function Binary(node, parent) {
  135. if (node.operator === "**" && isBinaryExpression(parent, {
  136. operator: "**"
  137. })) {
  138. return parent.left === node;
  139. }
  140. if (isClassExtendsClause(node, parent)) {
  141. return true;
  142. }
  143. if (hasPostfixPart(node, parent) || isUnaryLike(parent) || isAwaitExpression(parent)) {
  144. return true;
  145. }
  146. if (isBinary(parent)) {
  147. const parentOp = parent.operator;
  148. const parentPos = PRECEDENCE[parentOp];
  149. const nodeOp = node.operator;
  150. const nodePos = PRECEDENCE[nodeOp];
  151. if (parentPos === nodePos && parent.right === node && !isLogicalExpression(parent) || parentPos > nodePos) {
  152. return true;
  153. }
  154. }
  155. }
  156. function UnionTypeAnnotation(node, parent) {
  157. return isArrayTypeAnnotation(parent) || isNullableTypeAnnotation(parent) || isIntersectionTypeAnnotation(parent) || isUnionTypeAnnotation(parent);
  158. }
  159. function OptionalIndexedAccessType(node, parent) {
  160. return isIndexedAccessType(parent, {
  161. objectType: node
  162. });
  163. }
  164. function TSAsExpression() {
  165. return true;
  166. }
  167. function TSUnionType(node, parent) {
  168. return isTSArrayType(parent) || isTSOptionalType(parent) || isTSIntersectionType(parent) || isTSUnionType(parent) || isTSRestType(parent);
  169. }
  170. function TSInferType(node, parent) {
  171. return isTSArrayType(parent) || isTSOptionalType(parent);
  172. }
  173. function TSInstantiationExpression(node, parent) {
  174. return (isCallExpression(parent) || isOptionalCallExpression(parent) || isNewExpression(parent) || isTSInstantiationExpression(parent)) && !!parent.typeParameters;
  175. }
  176. function BinaryExpression(node, parent) {
  177. return node.operator === "in" && (isVariableDeclarator(parent) || isFor(parent));
  178. }
  179. function SequenceExpression(node, parent) {
  180. 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) {
  181. return false;
  182. }
  183. return true;
  184. }
  185. function YieldExpression(node, parent) {
  186. return isBinary(parent) || isUnaryLike(parent) || hasPostfixPart(node, parent) || isAwaitExpression(parent) && isYieldExpression(node) || isConditionalExpression(parent) && node === parent.test || isClassExtendsClause(node, parent);
  187. }
  188. function ClassExpression(node, parent, printStack) {
  189. return isFirstInContext(printStack, 1 | 4);
  190. }
  191. function UnaryLike(node, parent) {
  192. return hasPostfixPart(node, parent) || isBinaryExpression(parent, {
  193. operator: "**",
  194. left: node
  195. }) || isClassExtendsClause(node, parent);
  196. }
  197. function FunctionExpression(node, parent, printStack) {
  198. return isFirstInContext(printStack, 1 | 4);
  199. }
  200. function ArrowFunctionExpression(node, parent) {
  201. return isExportDeclaration(parent) || ConditionalExpression(node, parent);
  202. }
  203. function ConditionalExpression(node, parent) {
  204. if (isUnaryLike(parent) || isBinary(parent) || isConditionalExpression(parent, {
  205. test: node
  206. }) || isAwaitExpression(parent) || isTSTypeExpression(parent)) {
  207. return true;
  208. }
  209. return UnaryLike(node, parent);
  210. }
  211. function OptionalMemberExpression(node, parent) {
  212. return isCallExpression(parent, {
  213. callee: node
  214. }) || isMemberExpression(parent, {
  215. object: node
  216. });
  217. }
  218. function AssignmentExpression(node, parent) {
  219. if (isObjectPattern(node.left)) {
  220. return true;
  221. } else {
  222. return ConditionalExpression(node, parent);
  223. }
  224. }
  225. function LogicalExpression(node, parent) {
  226. if (isTSTypeExpression(parent)) return true;
  227. switch (node.operator) {
  228. case "||":
  229. if (!isLogicalExpression(parent)) return false;
  230. return parent.operator === "??" || parent.operator === "&&";
  231. case "&&":
  232. return isLogicalExpression(parent, {
  233. operator: "??"
  234. });
  235. case "??":
  236. return isLogicalExpression(parent) && parent.operator !== "??";
  237. }
  238. }
  239. function Identifier(node, parent, printStack) {
  240. var _node$extra;
  241. if ((_node$extra = node.extra) != null && _node$extra.parenthesized && isAssignmentExpression(parent, {
  242. left: node
  243. }) && (isFunctionExpression(parent.right) || isClassExpression(parent.right)) && parent.right.id == null) {
  244. return true;
  245. }
  246. if (node.name === "let") {
  247. const isFollowedByBracket = isMemberExpression(parent, {
  248. object: node,
  249. computed: true
  250. }) || isOptionalMemberExpression(parent, {
  251. object: node,
  252. computed: true,
  253. optional: false
  254. });
  255. return isFirstInContext(printStack, isFollowedByBracket ? 1 | 8 | 16 | 32 : 32);
  256. }
  257. return node.name === "async" && isForOfStatement(parent) && node === parent.left;
  258. }
  259. function isFirstInContext(printStack, checkParam) {
  260. const expressionStatement = checkParam & 1;
  261. const arrowBody = checkParam & 2;
  262. const exportDefault = checkParam & 4;
  263. const forHead = checkParam & 8;
  264. const forInHead = checkParam & 16;
  265. const forOfHead = checkParam & 32;
  266. let i = printStack.length - 1;
  267. if (i <= 0) return;
  268. let node = printStack[i];
  269. i--;
  270. let parent = printStack[i];
  271. while (i >= 0) {
  272. if (expressionStatement && isExpressionStatement(parent, {
  273. expression: node
  274. }) || exportDefault && isExportDefaultDeclaration(parent, {
  275. declaration: node
  276. }) || arrowBody && isArrowFunctionExpression(parent, {
  277. body: node
  278. }) || forHead && isForStatement(parent, {
  279. init: node
  280. }) || forInHead && isForInStatement(parent, {
  281. left: node
  282. }) || forOfHead && isForOfStatement(parent, {
  283. left: node
  284. })) {
  285. return true;
  286. }
  287. if (i > 0 && (hasPostfixPart(node, parent) && !isNewExpression(parent) || isSequenceExpression(parent) && parent.expressions[0] === node || isUpdateExpression(parent) && !parent.prefix || isConditional(parent, {
  288. test: node
  289. }) || isBinary(parent, {
  290. left: node
  291. }) || isAssignmentExpression(parent, {
  292. left: node
  293. }))) {
  294. node = parent;
  295. i--;
  296. parent = printStack[i];
  297. } else {
  298. return false;
  299. }
  300. }
  301. return false;
  302. }
  303. //# sourceMappingURL=parentheses.js.map