Blame view
node_modules/eslint/lib/rules/no-extra-semi.js
3.9 KB
f7563de62
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
/** * @fileoverview Rule to flag use of unnecessary semicolons * @author Nicholas C. Zakas */ "use strict"; //------------------------------------------------------------------------------ // Requirements //------------------------------------------------------------------------------ const FixTracker = require("../util/fix-tracker"); const astUtils = require("../ast-utils"); //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ module.exports = { meta: { docs: { description: "disallow unnecessary semicolons", category: "Possible Errors", recommended: true }, fixable: "code", schema: [] }, create(context) { const sourceCode = context.getSourceCode(); /** * Reports an unnecessary semicolon error. * @param {Node|Token} nodeOrToken - A node or a token to be reported. * @returns {void} */ function report(nodeOrToken) { context.report({ node: nodeOrToken, message: "Unnecessary semicolon.", fix(fixer) { // Expand the replacement range to include the surrounding // tokens to avoid conflicting with semi. // https://github.com/eslint/eslint/issues/7928 return new FixTracker(fixer, context.getSourceCode()) .retainSurroundingTokens(nodeOrToken) .remove(nodeOrToken); } }); } /** * Checks for a part of a class body. * This checks tokens from a specified token to a next MethodDefinition or the end of class body. * * @param {Token} firstToken - The first token to check. * @returns {void} */ function checkForPartOfClassBody(firstToken) { for (let token = firstToken; token.type === "Punctuator" && !astUtils.isClosingBraceToken(token); token = sourceCode.getTokenAfter(token) ) { if (astUtils.isSemicolonToken(token)) { report(token); } } } return { /** * Reports this empty statement, except if the parent node is a loop. * @param {Node} node - A EmptyStatement node to be reported. * @returns {void} */ EmptyStatement(node) { const parent = node.parent, allowedParentTypes = [ "ForStatement", "ForInStatement", "ForOfStatement", "WhileStatement", "DoWhileStatement", "IfStatement", "LabeledStatement", "WithStatement" ]; if (allowedParentTypes.indexOf(parent.type) === -1) { report(node); } }, /** * Checks tokens from the head of this class body to the first MethodDefinition or the end of this class body. * @param {Node} node - A ClassBody node to check. * @returns {void} */ ClassBody(node) { checkForPartOfClassBody(sourceCode.getFirstToken(node, 1)); // 0 is `{`. }, /** * Checks tokens from this MethodDefinition to the next MethodDefinition or the end of this class body. * @param {Node} node - A MethodDefinition node of the start point. * @returns {void} */ MethodDefinition(node) { checkForPartOfClassBody(sourceCode.getTokenAfter(node)); } }; } }; |