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