项目原始demo,不改动
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
Este repositório está arquivado. Pode ver ficheiros e cloná-lo, mas não pode fazer envios ou lançar questões ou pedidos de integração.
 
 
 
 

196 linhas
7.2 KiB

  1. /**
  2. * @fileoverview Specify the maximum number of statements allowed per line.
  3. * @author Kenneth Williams
  4. */
  5. "use strict";
  6. //------------------------------------------------------------------------------
  7. // Requirements
  8. //------------------------------------------------------------------------------
  9. const astUtils = require("../ast-utils");
  10. //------------------------------------------------------------------------------
  11. // Rule Definition
  12. //------------------------------------------------------------------------------
  13. module.exports = {
  14. meta: {
  15. docs: {
  16. description: "enforce a maximum number of statements allowed per line",
  17. category: "Stylistic Issues",
  18. recommended: false,
  19. url: "https://eslint.org/docs/rules/max-statements-per-line"
  20. },
  21. schema: [
  22. {
  23. type: "object",
  24. properties: {
  25. max: {
  26. type: "integer",
  27. minimum: 1
  28. }
  29. },
  30. additionalProperties: false
  31. }
  32. ]
  33. },
  34. create(context) {
  35. const sourceCode = context.getSourceCode(),
  36. options = context.options[0] || {},
  37. maxStatementsPerLine = typeof options.max !== "undefined" ? options.max : 1,
  38. message = "This line has {{numberOfStatementsOnThisLine}} {{statements}}. Maximum allowed is {{maxStatementsPerLine}}.";
  39. let lastStatementLine = 0,
  40. numberOfStatementsOnThisLine = 0,
  41. firstExtraStatement;
  42. //--------------------------------------------------------------------------
  43. // Helpers
  44. //--------------------------------------------------------------------------
  45. const SINGLE_CHILD_ALLOWED = /^(?:(?:DoWhile|For|ForIn|ForOf|If|Labeled|While)Statement|Export(?:Default|Named)Declaration)$/;
  46. /**
  47. * Reports with the first extra statement, and clears it.
  48. *
  49. * @returns {void}
  50. */
  51. function reportFirstExtraStatementAndClear() {
  52. if (firstExtraStatement) {
  53. context.report({
  54. node: firstExtraStatement,
  55. message,
  56. data: {
  57. numberOfStatementsOnThisLine,
  58. maxStatementsPerLine,
  59. statements: numberOfStatementsOnThisLine === 1 ? "statement" : "statements"
  60. }
  61. });
  62. }
  63. firstExtraStatement = null;
  64. }
  65. /**
  66. * Gets the actual last token of a given node.
  67. *
  68. * @param {ASTNode} node - A node to get. This is a node except EmptyStatement.
  69. * @returns {Token} The actual last token.
  70. */
  71. function getActualLastToken(node) {
  72. return sourceCode.getLastToken(node, astUtils.isNotSemicolonToken);
  73. }
  74. /**
  75. * Addresses a given node.
  76. * It updates the state of this rule, then reports the node if the node violated this rule.
  77. *
  78. * @param {ASTNode} node - A node to check.
  79. * @returns {void}
  80. */
  81. function enterStatement(node) {
  82. const line = node.loc.start.line;
  83. /*
  84. * Skip to allow non-block statements if this is direct child of control statements.
  85. * `if (a) foo();` is counted as 1.
  86. * But `if (a) foo(); else foo();` should be counted as 2.
  87. */
  88. if (SINGLE_CHILD_ALLOWED.test(node.parent.type) &&
  89. node.parent.alternate !== node
  90. ) {
  91. return;
  92. }
  93. // Update state.
  94. if (line === lastStatementLine) {
  95. numberOfStatementsOnThisLine += 1;
  96. } else {
  97. reportFirstExtraStatementAndClear();
  98. numberOfStatementsOnThisLine = 1;
  99. lastStatementLine = line;
  100. }
  101. // Reports if the node violated this rule.
  102. if (numberOfStatementsOnThisLine === maxStatementsPerLine + 1) {
  103. firstExtraStatement = firstExtraStatement || node;
  104. }
  105. }
  106. /**
  107. * Updates the state of this rule with the end line of leaving node to check with the next statement.
  108. *
  109. * @param {ASTNode} node - A node to check.
  110. * @returns {void}
  111. */
  112. function leaveStatement(node) {
  113. const line = getActualLastToken(node).loc.end.line;
  114. // Update state.
  115. if (line !== lastStatementLine) {
  116. reportFirstExtraStatementAndClear();
  117. numberOfStatementsOnThisLine = 1;
  118. lastStatementLine = line;
  119. }
  120. }
  121. //--------------------------------------------------------------------------
  122. // Public API
  123. //--------------------------------------------------------------------------
  124. return {
  125. BreakStatement: enterStatement,
  126. ClassDeclaration: enterStatement,
  127. ContinueStatement: enterStatement,
  128. DebuggerStatement: enterStatement,
  129. DoWhileStatement: enterStatement,
  130. ExpressionStatement: enterStatement,
  131. ForInStatement: enterStatement,
  132. ForOfStatement: enterStatement,
  133. ForStatement: enterStatement,
  134. FunctionDeclaration: enterStatement,
  135. IfStatement: enterStatement,
  136. ImportDeclaration: enterStatement,
  137. LabeledStatement: enterStatement,
  138. ReturnStatement: enterStatement,
  139. SwitchStatement: enterStatement,
  140. ThrowStatement: enterStatement,
  141. TryStatement: enterStatement,
  142. VariableDeclaration: enterStatement,
  143. WhileStatement: enterStatement,
  144. WithStatement: enterStatement,
  145. ExportNamedDeclaration: enterStatement,
  146. ExportDefaultDeclaration: enterStatement,
  147. ExportAllDeclaration: enterStatement,
  148. "BreakStatement:exit": leaveStatement,
  149. "ClassDeclaration:exit": leaveStatement,
  150. "ContinueStatement:exit": leaveStatement,
  151. "DebuggerStatement:exit": leaveStatement,
  152. "DoWhileStatement:exit": leaveStatement,
  153. "ExpressionStatement:exit": leaveStatement,
  154. "ForInStatement:exit": leaveStatement,
  155. "ForOfStatement:exit": leaveStatement,
  156. "ForStatement:exit": leaveStatement,
  157. "FunctionDeclaration:exit": leaveStatement,
  158. "IfStatement:exit": leaveStatement,
  159. "ImportDeclaration:exit": leaveStatement,
  160. "LabeledStatement:exit": leaveStatement,
  161. "ReturnStatement:exit": leaveStatement,
  162. "SwitchStatement:exit": leaveStatement,
  163. "ThrowStatement:exit": leaveStatement,
  164. "TryStatement:exit": leaveStatement,
  165. "VariableDeclaration:exit": leaveStatement,
  166. "WhileStatement:exit": leaveStatement,
  167. "WithStatement:exit": leaveStatement,
  168. "ExportNamedDeclaration:exit": leaveStatement,
  169. "ExportDefaultDeclaration:exit": leaveStatement,
  170. "ExportAllDeclaration:exit": leaveStatement,
  171. "Program:exit": reportFirstExtraStatementAndClear
  172. };
  173. }
  174. };