parentheses.js 9.9 KB

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