| /** |
| * @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; |
| } |
| } |
| }; |
| } |
| }; |