no-spaced-func.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /**
  2. * @fileoverview Rule to check that spaced function application
  3. * @author Matt DuVall <http://www.mattduvall.com>
  4. * @deprecated in ESLint v3.3.0
  5. */
  6. "use strict";
  7. //------------------------------------------------------------------------------
  8. // Rule Definition
  9. //------------------------------------------------------------------------------
  10. /** @type {import('../types').Rule.RuleModule} */
  11. module.exports = {
  12. meta: {
  13. type: "layout",
  14. docs: {
  15. description:
  16. "Disallow spacing between function identifiers and their applications (deprecated)",
  17. recommended: false,
  18. url: "https://eslint.org/docs/latest/rules/no-spaced-func",
  19. },
  20. deprecated: {
  21. message: "Formatting rules are being moved out of ESLint core.",
  22. url: "https://eslint.org/blog/2016/08/eslint-v3.3.0-released/#deprecated-rules",
  23. deprecatedSince: "3.3.0",
  24. availableUntil: "11.0.0",
  25. replacedBy: [
  26. {
  27. message:
  28. "ESLint Stylistic now maintains deprecated stylistic core rules.",
  29. url: "https://eslint.style/guide/migration",
  30. plugin: {
  31. name: "@stylistic/eslint-plugin",
  32. url: "https://eslint.style",
  33. },
  34. rule: {
  35. name: "function-call-spacing",
  36. url: "https://eslint.style/rules/function-call-spacing",
  37. },
  38. },
  39. ],
  40. },
  41. fixable: "whitespace",
  42. schema: [],
  43. messages: {
  44. noSpacedFunction:
  45. "Unexpected space between function name and paren.",
  46. },
  47. },
  48. create(context) {
  49. const sourceCode = context.sourceCode;
  50. /**
  51. * Check if open space is present in a function name
  52. * @param {ASTNode} node node to evaluate
  53. * @returns {void}
  54. * @private
  55. */
  56. function detectOpenSpaces(node) {
  57. const lastCalleeToken = sourceCode.getLastToken(node.callee);
  58. let prevToken = lastCalleeToken,
  59. parenToken = sourceCode.getTokenAfter(lastCalleeToken);
  60. // advances to an open parenthesis.
  61. while (
  62. parenToken &&
  63. parenToken.range[1] < node.range[1] &&
  64. parenToken.value !== "("
  65. ) {
  66. prevToken = parenToken;
  67. parenToken = sourceCode.getTokenAfter(parenToken);
  68. }
  69. // look for a space between the callee and the open paren
  70. if (
  71. parenToken &&
  72. parenToken.range[1] < node.range[1] &&
  73. sourceCode.isSpaceBetweenTokens(prevToken, parenToken)
  74. ) {
  75. context.report({
  76. node,
  77. loc: lastCalleeToken.loc.start,
  78. messageId: "noSpacedFunction",
  79. fix(fixer) {
  80. return fixer.removeRange([
  81. prevToken.range[1],
  82. parenToken.range[0],
  83. ]);
  84. },
  85. });
  86. }
  87. }
  88. return {
  89. CallExpression: detectOpenSpaces,
  90. NewExpression: detectOpenSpaces,
  91. };
  92. },
  93. };