Permalink
Cannot retrieve contributors at this time
| /** | |
| * @fileoverview Rule to flag the generator functions that does not have yield. | |
| * @author Toru Nagashima | |
| */ | |
| "use strict"; | |
| //------------------------------------------------------------------------------ | |
| // Rule Definition | |
| //------------------------------------------------------------------------------ | |
| module.exports = { | |
| meta: { | |
| type: "suggestion", | |
| docs: { | |
| description: "require generator functions to contain `yield`", | |
| category: "ECMAScript 6", | |
| recommended: true, | |
| url: "https://eslint.org/docs/rules/require-yield" | |
| }, | |
| schema: [] | |
| }, | |
| create(context) { | |
| const stack = []; | |
| /** | |
| * If the node is a generator function, start counting `yield` keywords. | |
| * @param {Node} node A function node to check. | |
| * @returns {void} | |
| */ | |
| function beginChecking(node) { | |
| if (node.generator) { | |
| stack.push(0); | |
| } | |
| } | |
| /** | |
| * If the node is a generator function, end counting `yield` keywords, then | |
| * reports result. | |
| * @param {Node} node A function node to check. | |
| * @returns {void} | |
| */ | |
| function endChecking(node) { | |
| if (!node.generator) { | |
| return; | |
| } | |
| const countYield = stack.pop(); | |
| if (countYield === 0 && node.body.body.length > 0) { | |
| context.report({ node, message: "This generator function does not have 'yield'." }); | |
| } | |
| } | |
| return { | |
| FunctionDeclaration: beginChecking, | |
| "FunctionDeclaration:exit": endChecking, | |
| FunctionExpression: beginChecking, | |
| "FunctionExpression:exit": endChecking, | |
| // Increases the count of `yield` keyword. | |
| YieldExpression() { | |
| /* istanbul ignore else */ | |
| if (stack.length > 0) { | |
| stack[stack.length - 1] += 1; | |
| } | |
| } | |
| }; | |
| } | |
| }; |