index.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.TokenContext = void 0;
  6. exports.isLastChild = isLastChild;
  7. exports.parentNeedsParens = parentNeedsParens;
  8. var parens = require("./parentheses.js");
  9. var _t = require("@babel/types");
  10. var _nodes = require("../nodes.js");
  11. const {
  12. VISITOR_KEYS
  13. } = _t;
  14. const TokenContext = exports.TokenContext = {
  15. normal: 0,
  16. expressionStatement: 1,
  17. arrowBody: 2,
  18. exportDefault: 4,
  19. arrowFlowReturnType: 8,
  20. forInitHead: 16,
  21. forInHead: 32,
  22. forOfHead: 64,
  23. forInOrInitHeadAccumulate: 128,
  24. forInOrInitHeadAccumulatePassThroughMask: 128
  25. };
  26. for (const type of Object.keys(parens)) {
  27. const func = parens[type];
  28. if (_nodes.generatorInfosMap.has(type)) {
  29. _nodes.generatorInfosMap.get(type)[2] = func;
  30. }
  31. }
  32. function isOrHasCallExpression(node) {
  33. switch (node.type) {
  34. case "CallExpression":
  35. return true;
  36. case "MemberExpression":
  37. return isOrHasCallExpression(node.object);
  38. }
  39. return false;
  40. }
  41. function parentNeedsParens(node, parent, parentId) {
  42. switch (parentId) {
  43. case 112:
  44. if (parent.callee === node) {
  45. if (isOrHasCallExpression(node)) return true;
  46. }
  47. break;
  48. case 42:
  49. return !isDecoratorMemberExpression(node) && !(node.type === "CallExpression" && isDecoratorMemberExpression(node.callee)) && node.type !== "ParenthesizedExpression";
  50. }
  51. return false;
  52. }
  53. function isDecoratorMemberExpression(node) {
  54. switch (node.type) {
  55. case "Identifier":
  56. return true;
  57. case "MemberExpression":
  58. return !node.computed && node.property.type === "Identifier" && isDecoratorMemberExpression(node.object);
  59. default:
  60. return false;
  61. }
  62. }
  63. function isLastChild(parent, child) {
  64. const visitorKeys = VISITOR_KEYS[parent.type];
  65. for (let i = visitorKeys.length - 1; i >= 0; i--) {
  66. const val = parent[visitorKeys[i]];
  67. if (val === child) {
  68. return true;
  69. } else if (Array.isArray(val)) {
  70. let j = val.length - 1;
  71. while (j >= 0 && val[j] === null) j--;
  72. return j >= 0 && val[j] === child;
  73. } else if (val) {
  74. return false;
  75. }
  76. }
  77. return false;
  78. }
  79. //# sourceMappingURL=index.js.map