From eb1a43ce3113c906800192c3ef766d2ff188776f Mon Sep 17 00:00:00 2001 From: Anix Date: Sat, 28 Mar 2020 05:45:10 +0530 Subject: [PATCH] Fix: require-await ignore async generators (fixes #12459) (#13048) * Fix: require-await should ignore async generators (fixes #12459) * Chore: docs update and test update * Docs: fixed typo for generator to generators Co-Authored-By: Kai Cataldo * Chore: added more tests for async generators Co-authored-by: Kai Cataldo --- docs/rules/require-await.md | 1 + lib/rules/require-await.js | 2 +- tests/lib/rules/require-await.js | 30 ++++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/docs/rules/require-await.md b/docs/rules/require-await.md index 2fb871cf139..595d0acbf00 100644 --- a/docs/rules/require-await.md +++ b/docs/rules/require-await.md @@ -18,6 +18,7 @@ async function fetchData(processDataItem) { Asynchronous functions that don't use `await` might not need to be asynchronous functions and could be the unintentional result of refactoring. +Note: this rule ignores async generator functions. This is because generators yield rather than return a value and async generators might yield all the values of another async generator without ever actually needing to use await. ## Rule Details diff --git a/lib/rules/require-await.js b/lib/rules/require-await.js index 274e241cfc7..9b5acc78c81 100644 --- a/lib/rules/require-await.js +++ b/lib/rules/require-await.js @@ -68,7 +68,7 @@ module.exports = { * @returns {void} */ function exitFunction(node) { - if (node.async && !scopeInfo.hasAwait && !astUtils.isEmptyFunction(node)) { + if (!node.generator && node.async && !scopeInfo.hasAwait && !astUtils.isEmptyFunction(node)) { context.report({ node, loc: astUtils.getFunctionHeadLoc(node, sourceCode), diff --git a/tests/lib/rules/require-await.js b/tests/lib/rules/require-await.js index 76e67eb23b7..4ed598dc86c 100644 --- a/tests/lib/rules/require-await.js +++ b/tests/lib/rules/require-await.js @@ -55,7 +55,37 @@ ruleTester.run("require-await", rule, { } `, parser: require.resolve("../../fixtures/parsers/typescript-parsers/global-for-await-of") + }, + { + code: "async function* run() { yield * anotherAsyncGenerator() }", + parserOptions: { ecmaVersion: 9 } + }, + { + code: `async function* run() { + await new Promise(resolve => setTimeout(resolve, 100)); + yield 'Hello'; + console.log('World'); + } + `, + parserOptions: { ecmaVersion: 9 } + }, + { + code: "async function* run() { }", + parserOptions: { ecmaVersion: 9 } + }, + { + code: "const foo = async function *(){}", + parserOptions: { ecmaVersion: 9 } + }, + { + code: 'const foo = async function *(){ console.log("bar") }', + parserOptions: { ecmaVersion: 9 } + }, + { + code: 'async function* run() { console.log("bar") }', + parserOptions: { ecmaVersion: 9 } } + ], invalid: [ {