yield-star-spacing.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /**
  2. * @fileoverview Rule to check the spacing around the * in yield* expressions.
  3. * @author Bryan Smith
  4. * @deprecated in ESLint v8.53.0
  5. */
  6. "use strict";
  7. //------------------------------------------------------------------------------
  8. // Rule Definition
  9. //------------------------------------------------------------------------------
  10. /** @type {import('../types').Rule.RuleModule} */
  11. module.exports = {
  12. meta: {
  13. deprecated: {
  14. message: "Formatting rules are being moved out of ESLint core.",
  15. url: "https://eslint.org/blog/2023/10/deprecating-formatting-rules/",
  16. deprecatedSince: "8.53.0",
  17. availableUntil: "11.0.0",
  18. replacedBy: [
  19. {
  20. message:
  21. "ESLint Stylistic now maintains deprecated stylistic core rules.",
  22. url: "https://eslint.style/guide/migration",
  23. plugin: {
  24. name: "@stylistic/eslint-plugin",
  25. url: "https://eslint.style",
  26. },
  27. rule: {
  28. name: "yield-star-spacing",
  29. url: "https://eslint.style/rules/yield-star-spacing",
  30. },
  31. },
  32. ],
  33. },
  34. type: "layout",
  35. docs: {
  36. description:
  37. "Require or disallow spacing around the `*` in `yield*` expressions",
  38. recommended: false,
  39. url: "https://eslint.org/docs/latest/rules/yield-star-spacing",
  40. },
  41. fixable: "whitespace",
  42. schema: [
  43. {
  44. oneOf: [
  45. {
  46. enum: ["before", "after", "both", "neither"],
  47. },
  48. {
  49. type: "object",
  50. properties: {
  51. before: { type: "boolean" },
  52. after: { type: "boolean" },
  53. },
  54. additionalProperties: false,
  55. },
  56. ],
  57. },
  58. ],
  59. messages: {
  60. missingBefore: "Missing space before *.",
  61. missingAfter: "Missing space after *.",
  62. unexpectedBefore: "Unexpected space before *.",
  63. unexpectedAfter: "Unexpected space after *.",
  64. },
  65. },
  66. create(context) {
  67. const sourceCode = context.sourceCode;
  68. const mode = (function (option) {
  69. if (!option || typeof option === "string") {
  70. return {
  71. before: { before: true, after: false },
  72. after: { before: false, after: true },
  73. both: { before: true, after: true },
  74. neither: { before: false, after: false },
  75. }[option || "after"];
  76. }
  77. return option;
  78. })(context.options[0]);
  79. /**
  80. * Checks the spacing between two tokens before or after the star token.
  81. * @param {string} side Either "before" or "after".
  82. * @param {Token} leftToken `function` keyword token if side is "before", or
  83. * star token if side is "after".
  84. * @param {Token} rightToken Star token if side is "before", or identifier
  85. * token if side is "after".
  86. * @returns {void}
  87. */
  88. function checkSpacing(side, leftToken, rightToken) {
  89. if (
  90. sourceCode.isSpaceBetweenTokens(leftToken, rightToken) !==
  91. mode[side]
  92. ) {
  93. const after = leftToken.value === "*";
  94. const spaceRequired = mode[side];
  95. const node = after ? leftToken : rightToken;
  96. let messageId;
  97. if (spaceRequired) {
  98. messageId =
  99. side === "before" ? "missingBefore" : "missingAfter";
  100. } else {
  101. messageId =
  102. side === "before"
  103. ? "unexpectedBefore"
  104. : "unexpectedAfter";
  105. }
  106. context.report({
  107. node,
  108. messageId,
  109. fix(fixer) {
  110. if (spaceRequired) {
  111. if (after) {
  112. return fixer.insertTextAfter(node, " ");
  113. }
  114. return fixer.insertTextBefore(node, " ");
  115. }
  116. return fixer.removeRange([
  117. leftToken.range[1],
  118. rightToken.range[0],
  119. ]);
  120. },
  121. });
  122. }
  123. }
  124. /**
  125. * Enforces the spacing around the star if node is a yield* expression.
  126. * @param {ASTNode} node A yield expression node.
  127. * @returns {void}
  128. */
  129. function checkExpression(node) {
  130. if (!node.delegate) {
  131. return;
  132. }
  133. const tokens = sourceCode.getFirstTokens(node, 3);
  134. const yieldToken = tokens[0];
  135. const starToken = tokens[1];
  136. const nextToken = tokens[2];
  137. checkSpacing("before", yieldToken, starToken);
  138. checkSpacing("after", starToken, nextToken);
  139. }
  140. return {
  141. YieldExpression: checkExpression,
  142. };
  143. },
  144. };