项目原始demo,不改动
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
 
 
 
 

115 lines
3.9 KiB

  1. /**
  2. * @fileoverview Enforce spacing between rest and spread operators and their expressions.
  3. * @author Kai Cataldo
  4. */
  5. "use strict";
  6. //------------------------------------------------------------------------------
  7. // Rule Definition
  8. //------------------------------------------------------------------------------
  9. module.exports = {
  10. meta: {
  11. docs: {
  12. description: "enforce spacing between rest and spread operators and their expressions",
  13. category: "ECMAScript 6",
  14. recommended: false,
  15. url: "https://eslint.org/docs/rules/rest-spread-spacing"
  16. },
  17. fixable: "whitespace",
  18. schema: [
  19. {
  20. enum: ["always", "never"]
  21. }
  22. ]
  23. },
  24. create(context) {
  25. const sourceCode = context.getSourceCode(),
  26. alwaysSpace = context.options[0] === "always";
  27. //--------------------------------------------------------------------------
  28. // Helpers
  29. //--------------------------------------------------------------------------
  30. /**
  31. * Checks whitespace between rest/spread operators and their expressions
  32. * @param {ASTNode} node - The node to check
  33. * @returns {void}
  34. */
  35. function checkWhiteSpace(node) {
  36. const operator = sourceCode.getFirstToken(node),
  37. nextToken = sourceCode.getTokenAfter(operator),
  38. hasWhitespace = sourceCode.isSpaceBetweenTokens(operator, nextToken);
  39. let type;
  40. switch (node.type) {
  41. case "SpreadElement":
  42. type = "spread";
  43. if (node.parent.type === "ObjectExpression") {
  44. type += " property";
  45. }
  46. break;
  47. case "RestElement":
  48. type = "rest";
  49. if (node.parent.type === "ObjectPattern") {
  50. type += " property";
  51. }
  52. break;
  53. case "ExperimentalSpreadProperty":
  54. type = "spread property";
  55. break;
  56. case "ExperimentalRestProperty":
  57. type = "rest property";
  58. break;
  59. default:
  60. return;
  61. }
  62. if (alwaysSpace && !hasWhitespace) {
  63. context.report({
  64. node,
  65. loc: {
  66. line: operator.loc.end.line,
  67. column: operator.loc.end.column
  68. },
  69. message: "Expected whitespace after {{type}} operator.",
  70. data: {
  71. type
  72. },
  73. fix(fixer) {
  74. return fixer.replaceTextRange([operator.range[1], nextToken.range[0]], " ");
  75. }
  76. });
  77. } else if (!alwaysSpace && hasWhitespace) {
  78. context.report({
  79. node,
  80. loc: {
  81. line: operator.loc.end.line,
  82. column: operator.loc.end.column
  83. },
  84. message: "Unexpected whitespace after {{type}} operator.",
  85. data: {
  86. type
  87. },
  88. fix(fixer) {
  89. return fixer.removeRange([operator.range[1], nextToken.range[0]]);
  90. }
  91. });
  92. }
  93. }
  94. //--------------------------------------------------------------------------
  95. // Public
  96. //--------------------------------------------------------------------------
  97. return {
  98. SpreadElement: checkWhiteSpace,
  99. RestElement: checkWhiteSpace,
  100. ExperimentalSpreadProperty: checkWhiteSpace,
  101. ExperimentalRestProperty: checkWhiteSpace
  102. };
  103. }
  104. };