parentheses.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.AssignmentExpression = AssignmentExpression;
  6. exports.BinaryExpression = BinaryExpression;
  7. exports.ClassExpression = ClassExpression;
  8. exports.ArrowFunctionExpression = exports.ConditionalExpression = ConditionalExpression;
  9. exports.DoExpression = DoExpression;
  10. exports.FunctionExpression = FunctionExpression;
  11. exports.FunctionTypeAnnotation = FunctionTypeAnnotation;
  12. exports.Identifier = Identifier;
  13. exports.LogicalExpression = LogicalExpression;
  14. exports.NullableTypeAnnotation = NullableTypeAnnotation;
  15. exports.ObjectExpression = ObjectExpression;
  16. exports.OptionalIndexedAccessType = OptionalIndexedAccessType;
  17. exports.OptionalCallExpression = exports.OptionalMemberExpression = OptionalMemberExpression;
  18. exports.SequenceExpression = SequenceExpression;
  19. exports.TSSatisfiesExpression = exports.TSAsExpression = TSAsExpression;
  20. exports.TSConditionalType = TSConditionalType;
  21. exports.TSConstructorType = exports.TSFunctionType = TSFunctionType;
  22. exports.TSInferType = TSInferType;
  23. exports.TSInstantiationExpression = TSInstantiationExpression;
  24. exports.TSIntersectionType = TSIntersectionType;
  25. exports.SpreadElement = exports.UnaryExpression = exports.TSTypeAssertion = UnaryLike;
  26. exports.TSTypeOperator = TSTypeOperator;
  27. exports.TSUnionType = TSUnionType;
  28. exports.IntersectionTypeAnnotation = exports.UnionTypeAnnotation = UnionTypeAnnotation;
  29. exports.UpdateExpression = UpdateExpression;
  30. exports.AwaitExpression = exports.YieldExpression = YieldExpression;
  31. var _t = require("@babel/types");
  32. var _index = require("./index.js");
  33. const {
  34. isMemberExpression,
  35. isOptionalMemberExpression,
  36. isYieldExpression,
  37. isStatement
  38. } = _t;
  39. const PRECEDENCE = new Map([["||", 0], ["??", 1], ["&&", 2], ["|", 3], ["^", 4], ["&", 5], ["==", 6], ["===", 6], ["!=", 6], ["!==", 6], ["<", 7], [">", 7], ["<=", 7], [">=", 7], ["in", 7], ["instanceof", 7], [">>", 8], ["<<", 8], [">>>", 8], ["+", 9], ["-", 9], ["*", 10], ["/", 10], ["%", 10], ["**", 11]]);
  40. function isTSTypeExpression(nodeId) {
  41. return nodeId === 156 || nodeId === 201 || nodeId === 209;
  42. }
  43. const isClassExtendsClause = (node, parent, parentId) => {
  44. return (parentId === 21 || parentId === 22) && parent.superClass === node;
  45. };
  46. const hasPostfixPart = (node, parent, parentId) => {
  47. switch (parentId) {
  48. case 108:
  49. case 132:
  50. return parent.object === node;
  51. case 17:
  52. case 130:
  53. case 112:
  54. return parent.callee === node;
  55. case 222:
  56. return parent.tag === node;
  57. case 191:
  58. return true;
  59. }
  60. return false;
  61. };
  62. function NullableTypeAnnotation(node, parent, parentId) {
  63. return parentId === 4;
  64. }
  65. function FunctionTypeAnnotation(node, parent, parentId, tokenContext) {
  66. return (parentId === 239 || parentId === 90 || parentId === 4 || (tokenContext & _index.TokenContext.arrowFlowReturnType) > 0
  67. );
  68. }
  69. function UpdateExpression(node, parent, parentId) {
  70. return hasPostfixPart(node, parent, parentId) || isClassExtendsClause(node, parent, parentId);
  71. }
  72. function needsParenBeforeExpressionBrace(tokenContext) {
  73. return (tokenContext & (_index.TokenContext.expressionStatement | _index.TokenContext.arrowBody)) > 0;
  74. }
  75. function ObjectExpression(node, parent, parentId, tokenContext) {
  76. return needsParenBeforeExpressionBrace(tokenContext);
  77. }
  78. function DoExpression(node, parent, parentId, tokenContext) {
  79. return (tokenContext & _index.TokenContext.expressionStatement) > 0 && !node.async;
  80. }
  81. function BinaryLike(node, parent, parentId, nodeType) {
  82. if (isClassExtendsClause(node, parent, parentId)) {
  83. return true;
  84. }
  85. if (hasPostfixPart(node, parent, parentId) || parentId === 238 || parentId === 145 || parentId === 8) {
  86. return true;
  87. }
  88. let parentPos;
  89. switch (parentId) {
  90. case 10:
  91. case 107:
  92. parentPos = PRECEDENCE.get(parent.operator);
  93. break;
  94. case 156:
  95. case 201:
  96. parentPos = 7;
  97. }
  98. if (parentPos !== undefined) {
  99. const nodePos = nodeType === 2 ? 7 : PRECEDENCE.get(node.operator);
  100. if (parentPos > nodePos) return true;
  101. if (parentPos === nodePos && parentId === 10 && (nodePos === 11 ? parent.left === node : parent.right === node)) {
  102. return true;
  103. }
  104. if (nodeType === 1 && parentId === 107 && (nodePos === 1 && parentPos !== 1 || parentPos === 1 && nodePos !== 1)) {
  105. return true;
  106. }
  107. }
  108. return false;
  109. }
  110. function UnionTypeAnnotation(node, parent, parentId) {
  111. switch (parentId) {
  112. case 4:
  113. case 115:
  114. case 90:
  115. case 239:
  116. return true;
  117. }
  118. return false;
  119. }
  120. function OptionalIndexedAccessType(node, parent, parentId) {
  121. return parentId === 84 && parent.objectType === node;
  122. }
  123. function TSAsExpression(node, parent, parentId) {
  124. if ((parentId === 6 || parentId === 7) && parent.left === node) {
  125. return true;
  126. }
  127. if (parentId === 10 && (parent.operator === "|" || parent.operator === "&") && node === parent.left) {
  128. return true;
  129. }
  130. return BinaryLike(node, parent, parentId, 2);
  131. }
  132. function TSConditionalType(node, parent, parentId) {
  133. switch (parentId) {
  134. case 155:
  135. case 195:
  136. case 211:
  137. case 212:
  138. return true;
  139. case 175:
  140. return parent.objectType === node;
  141. case 181:
  142. case 219:
  143. return parent.types[0] === node;
  144. case 161:
  145. return parent.checkType === node || parent.extendsType === node;
  146. }
  147. return false;
  148. }
  149. function TSUnionType(node, parent, parentId) {
  150. switch (parentId) {
  151. case 181:
  152. case 211:
  153. case 155:
  154. case 195:
  155. return true;
  156. case 175:
  157. return parent.objectType === node;
  158. }
  159. return false;
  160. }
  161. function TSIntersectionType(node, parent, parentId) {
  162. return parentId === 211 || TSTypeOperator(node, parent, parentId);
  163. }
  164. function TSInferType(node, parent, parentId) {
  165. if (TSTypeOperator(node, parent, parentId)) {
  166. return true;
  167. }
  168. if ((parentId === 181 || parentId === 219) && node.typeParameter.constraint && parent.types[0] === node) {
  169. return true;
  170. }
  171. return false;
  172. }
  173. function TSTypeOperator(node, parent, parentId) {
  174. switch (parentId) {
  175. case 155:
  176. case 195:
  177. return true;
  178. case 175:
  179. if (parent.objectType === node) {
  180. return true;
  181. }
  182. }
  183. return false;
  184. }
  185. function TSInstantiationExpression(node, parent, parentId) {
  186. switch (parentId) {
  187. case 17:
  188. case 130:
  189. case 112:
  190. case 177:
  191. return (parent.typeParameters
  192. ) != null;
  193. }
  194. return false;
  195. }
  196. function TSFunctionType(node, parent, parentId) {
  197. if (TSUnionType(node, parent, parentId)) return true;
  198. return parentId === 219 || parentId === 161 && (parent.checkType === node || parent.extendsType === node);
  199. }
  200. function BinaryExpression(node, parent, parentId, tokenContext) {
  201. if (BinaryLike(node, parent, parentId, 0)) return true;
  202. return (tokenContext & _index.TokenContext.forInOrInitHeadAccumulate) > 0 && node.operator === "in";
  203. }
  204. function LogicalExpression(node, parent, parentId) {
  205. return BinaryLike(node, parent, parentId, 1);
  206. }
  207. function SequenceExpression(node, parent, parentId) {
  208. if (parentId === 144 || parentId === 133 || parentId === 108 && parent.property === node || parentId === 132 && parent.property === node || parentId === 224) {
  209. return false;
  210. }
  211. if (parentId === 21) {
  212. return true;
  213. }
  214. if (parentId === 68) {
  215. return parent.right === node;
  216. }
  217. if (parentId === 60) {
  218. return true;
  219. }
  220. return !isStatement(parent);
  221. }
  222. function YieldExpression(node, parent, parentId) {
  223. return parentId === 10 || parentId === 107 || parentId === 238 || parentId === 145 || hasPostfixPart(node, parent, parentId) || parentId === 8 && isYieldExpression(node) || parentId === 28 && node === parent.test || isClassExtendsClause(node, parent, parentId) || isTSTypeExpression(parentId);
  224. }
  225. function ClassExpression(node, parent, parentId, tokenContext) {
  226. return (tokenContext & (_index.TokenContext.expressionStatement | _index.TokenContext.exportDefault)) > 0;
  227. }
  228. function UnaryLike(node, parent, parentId) {
  229. return hasPostfixPart(node, parent, parentId) || parentId === 10 && parent.operator === "**" && parent.left === node || isClassExtendsClause(node, parent, parentId);
  230. }
  231. function FunctionExpression(node, parent, parentId, tokenContext) {
  232. return (tokenContext & (_index.TokenContext.expressionStatement | _index.TokenContext.exportDefault)) > 0;
  233. }
  234. function ConditionalExpression(node, parent, parentId) {
  235. switch (parentId) {
  236. case 238:
  237. case 145:
  238. case 10:
  239. case 107:
  240. case 8:
  241. return true;
  242. case 28:
  243. if (parent.test === node) {
  244. return true;
  245. }
  246. }
  247. if (isTSTypeExpression(parentId)) {
  248. return true;
  249. }
  250. return UnaryLike(node, parent, parentId);
  251. }
  252. function OptionalMemberExpression(node, parent, parentId) {
  253. switch (parentId) {
  254. case 17:
  255. return parent.callee === node;
  256. case 108:
  257. return parent.object === node;
  258. }
  259. return false;
  260. }
  261. function AssignmentExpression(node, parent, parentId, tokenContext) {
  262. if (needsParenBeforeExpressionBrace(tokenContext) && node.left.type === "ObjectPattern") {
  263. return true;
  264. }
  265. return ConditionalExpression(node, parent, parentId);
  266. }
  267. function Identifier(node, parent, parentId, tokenContext, getRawIdentifier) {
  268. var _node$extra;
  269. if (getRawIdentifier && getRawIdentifier(node) !== node.name) {
  270. return false;
  271. }
  272. if (parentId === 6 && (_node$extra = node.extra) != null && _node$extra.parenthesized && parent.left === node) {
  273. const rightType = parent.right.type;
  274. if ((rightType === "FunctionExpression" || rightType === "ClassExpression") && parent.right.id == null) {
  275. return true;
  276. }
  277. }
  278. if (tokenContext & _index.TokenContext.forOfHead || (parentId === 108 || parentId === 132) && tokenContext & (_index.TokenContext.expressionStatement | _index.TokenContext.forInitHead | _index.TokenContext.forInHead)) {
  279. if (node.name === "let") {
  280. const isFollowedByBracket = isMemberExpression(parent, {
  281. object: node,
  282. computed: true
  283. }) || isOptionalMemberExpression(parent, {
  284. object: node,
  285. computed: true,
  286. optional: false
  287. });
  288. if (isFollowedByBracket && tokenContext & (_index.TokenContext.expressionStatement | _index.TokenContext.forInitHead | _index.TokenContext.forInHead)) {
  289. return true;
  290. }
  291. return (tokenContext & _index.TokenContext.forOfHead) > 0;
  292. }
  293. }
  294. return parentId === 68 && parent.left === node && node.name === "async" && !parent.await;
  295. }
  296. //# sourceMappingURL=parentheses.js.map