From fdca2275a08b55825ec3b65bde8377b83814328f Mon Sep 17 00:00:00 2001 From: Brett Zamir Date: Tue, 20 Jul 2021 12:47:48 +0800 Subject: [PATCH] fix(`require-returns`): handle contexts TSFunctionType, TSMethodSignature, MethodDefinition; fixes #767 --- README.md | 40 +++++++++++++++ src/jsdocUtils.js | 8 +++ test/rules/assertions/requireReturns.js | 68 +++++++++++++++++++++++++ 3 files changed, 116 insertions(+) diff --git a/README.md b/README.md index 74141281d..a4f6c984a 100644 --- a/README.md +++ b/README.md @@ -17453,6 +17453,46 @@ async function quux () { } // "jsdoc/require-returns": ["error"|"warn", {"forceReturnsWithAsync":true}] // Message: Missing JSDoc @returns declaration. + +export class A { + /** + * Description. + */ + public f(): string { + return ""; + } +} + +export interface B { + /** + * Description. + */ + f(): string; + + /** + * Description. + */ + g: () => string; + + /** + * Description. + */ + h(): void; + + /** + * Description. + */ + i: () => void; +} + +/** + * Description. + */ +export function f(): string { + return ""; +} +// "jsdoc/require-returns": ["error"|"warn", {"contexts":[":not(BlockStatement) > FunctionDeclaration","MethodDefinition","TSMethodSignature","TSPropertySignature > TSTypeAnnotation > TSFunctionType"]}] +// Message: Missing JSDoc @returns declaration. ```` The following patterns are not considered problems: diff --git a/src/jsdocUtils.js b/src/jsdocUtils.js index c9b3c6ef7..6c4ac63fa 100644 --- a/src/jsdocUtils.js +++ b/src/jsdocUtils.js @@ -527,6 +527,14 @@ const hasReturnValue = (node, promFilter) => { } switch (node.type) { + case 'TSFunctionType': + case 'TSMethodSignature': + return ![ + 'TSVoidKeyword', + 'TSUndefinedKeyword', + ].includes(node?.returnType?.typeAnnotation?.type); + case 'MethodDefinition': + return hasReturnValue(node.value, promFilter); case 'FunctionExpression': case 'FunctionDeclaration': case 'ArrowFunctionExpression': { diff --git a/test/rules/assertions/requireReturns.js b/test/rules/assertions/requireReturns.js index cae5dbaa2..b84649a90 100644 --- a/test/rules/assertions/requireReturns.js +++ b/test/rules/assertions/requireReturns.js @@ -1543,6 +1543,74 @@ export default { ecmaVersion: 8, }, }, + { + code: ` + export class A { + /** + * Description. + */ + public f(): string { + return ""; + } + } + + export interface B { + /** + * Description. + */ + f(): string; + + /** + * Description. + */ + g: () => string; + + /** + * Description. + */ + h(): void; + + /** + * Description. + */ + i: () => void; + } + + /** + * Description. + */ + export function f(): string { + return ""; + } + `, + errors: [ + { + line: 3, + message: 'Missing JSDoc @returns declaration.', + }, + { + line: 12, + message: 'Missing JSDoc @returns declaration.', + }, + { + line: 17, + message: 'Missing JSDoc @returns declaration.', + }, + { + line: 33, + message: 'Missing JSDoc @returns declaration.', + }, + ], + options: [{ + contexts: [ + ':not(BlockStatement) > FunctionDeclaration', + 'MethodDefinition', + 'TSMethodSignature', + 'TSPropertySignature > TSTypeAnnotation > TSFunctionType', + ], + }], + parser: require.resolve('@typescript-eslint/parser'), + }, ], valid: [ {