Blame view
node_modules/eslint/lib/rules/generator-star-spacing.js
4.85 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 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
/** * @fileoverview Rule to check the spacing around the * in generator functions. * @author Jamund Ferguson */ "use strict"; //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ module.exports = { meta: { docs: { description: "enforce consistent spacing around `*` operators in generator functions", category: "ECMAScript 6", recommended: false }, fixable: "whitespace", schema: [ { oneOf: [ { enum: ["before", "after", "both", "neither"] }, { type: "object", properties: { before: { type: "boolean" }, after: { type: "boolean" } }, additionalProperties: false } ] } ] }, create(context) { const mode = (function(option) { if (!option || typeof option === "string") { return { before: { before: true, after: false }, after: { before: false, after: true }, both: { before: true, after: true }, neither: { before: false, after: false } }[option || "before"]; } return option; }(context.options[0])); const sourceCode = context.getSourceCode(); /** * Checks if the given token is a star token or not. * * @param {Token} token - The token to check. * @returns {boolean} `true` if the token is a star token. */ function isStarToken(token) { return token.value === "*" && token.type === "Punctuator"; } /** * Gets the generator star token of the given function node. * * @param {ASTNode} node - The function node to get. * @returns {Token} Found star token. */ function getStarToken(node) { return sourceCode.getFirstToken( (node.parent.method || node.parent.type === "MethodDefinition") ? node.parent : node, isStarToken ); } /** * Checks the spacing between two tokens before or after the star token. * @param {string} side Either "before" or "after". * @param {Token} leftToken `function` keyword token if side is "before", or * star token if side is "after". * @param {Token} rightToken Star token if side is "before", or identifier * token if side is "after". * @returns {void} */ function checkSpacing(side, leftToken, rightToken) { if (!!(rightToken.range[0] - leftToken.range[1]) !== mode[side]) { const after = leftToken.value === "*"; const spaceRequired = mode[side]; const node = after ? leftToken : rightToken; const type = spaceRequired ? "Missing" : "Unexpected"; const message = "{{type}} space {{side}} *."; const data = { type, side }; context.report({ node, message, data, fix(fixer) { if (spaceRequired) { if (after) { return fixer.insertTextAfter(node, " "); } return fixer.insertTextBefore(node, " "); } return fixer.removeRange([leftToken.range[1], rightToken.range[0]]); } }); } } /** * Enforces the spacing around the star if node is a generator function. * @param {ASTNode} node A function expression or declaration node. * @returns {void} */ function checkFunction(node) { if (!node.generator) { return; } const starToken = getStarToken(node); // Only check before when preceded by `function`|`static` keyword const prevToken = sourceCode.getTokenBefore(starToken); if (prevToken.value === "function" || prevToken.value === "static") { checkSpacing("before", prevToken, starToken); } const nextToken = sourceCode.getTokenAfter(starToken); checkSpacing("after", starToken, nextToken); } return { FunctionDeclaration: checkFunction, FunctionExpression: checkFunction }; } }; |