From 2247efafa0a6b687b92e1385d42b64deb7993399 Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Sat, 14 Oct 2017 13:57:27 -0400 Subject: [PATCH] Update: Add FunctionExpression to require-jsdoc (fixes #5867) (#9395) * Update: Add FunctionExpression to require-jsdoc (fixes #5867) * Bug fix: function expression as computed property --- docs/rules/require-jsdoc.md | 71 ++++++++++++++++++++++++++------ lib/rules/require-jsdoc.js | 29 +++++-------- tests/lib/rules/require-jsdoc.js | 71 ++++++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+), 30 deletions(-) diff --git a/docs/rules/require-jsdoc.md b/docs/rules/require-jsdoc.md index 8fa31d87d08..b9deb7daa69 100644 --- a/docs/rules/require-jsdoc.md +++ b/docs/rules/require-jsdoc.md @@ -24,6 +24,7 @@ This rule requires JSDoc comments for specified nodes. Supported nodes: * `"ClassDeclaration"` * `"MethodDefinition"` * `"ArrowFunctionExpression"` +* `"FunctionExpression"` ## Options @@ -40,7 +41,8 @@ Default option settings are: "FunctionDeclaration": true, "MethodDefinition": false, "ClassDeclaration": false, - "ArrowFunctionExpression": false + "ArrowFunctionExpression": false, + "FunctionExpression": false } }] } @@ -48,14 +50,16 @@ Default option settings are: ### require -Examples of **incorrect** code for this rule with the `{ "require": { "FunctionDeclaration": true, "MethodDefinition": true, "ClassDeclaration": true, "ArrowFunctionExpression": true } }` option: +Examples of **incorrect** code for this rule with the `{ "require": { "FunctionDeclaration": true, "MethodDefinition": true, "ClassDeclaration": true, "ArrowFunctionExpression": true, "FunctionExpression": true } }` option: ```js /*eslint "require-jsdoc": ["error", { "require": { "FunctionDeclaration": true, "MethodDefinition": true, - "ClassDeclaration": true + "ClassDeclaration": true, + "ArrowFunctionExpression": true, + "FunctionExpression": true } }]*/ @@ -65,21 +69,39 @@ function foo() { var foo = () => { return 10; -} +}; -class Test{ - getDate(){} +class Foo { + bar() { + return 10; + } } + +var foo = function() { + return 10; +}; + +var foo = { + bar: function() { + return 10; + }, + + baz() { + return 10; + } +}; ``` -Examples of **correct** code for this rule with the `{ "require": { "FunctionDeclaration": true, "MethodDefinition": true, "ClassDeclaration": true, "ArrowFunctionExpression": true } }` option: +Examples of **correct** code for this rule with the `{ "require": { "FunctionDeclaration": true, "MethodDefinition": true, "ClassDeclaration": true, "ArrowFunctionExpression": true, "FunctionExpression": true } }` option: ```js /*eslint "require-jsdoc": ["error", { "require": { "FunctionDeclaration": true, "MethodDefinition": true, - "ClassDeclaration": true + "ClassDeclaration": true, + "ArrowFunctionExpression": true, + "FunctionExpression": true } }]*/ @@ -119,15 +141,40 @@ array.filter(function(item) { }); /** - * It returns 10 + * A class that can return the number 10 */ -class Test{ +class Foo { /** - * returns the date + * It returns 10 */ - getDate(){} + bar() { + return 10; + } } +/** + * It returns 10 + */ +var foo = function() { + return 10; +}; + +var foo = { + /** + * It returns 10 + */ + bar: function() { + return 10; + }, + + /** + * It returns 10 + */ + baz() { + return 10; + } +}; + setTimeout(() => {}, 10); // since it's an anonymous arrow function ``` diff --git a/lib/rules/require-jsdoc.js b/lib/rules/require-jsdoc.js index f1ecde81f95..a02ee3659c3 100644 --- a/lib/rules/require-jsdoc.js +++ b/lib/rules/require-jsdoc.js @@ -30,6 +30,9 @@ module.exports = { }, ArrowFunctionExpression: { type: "boolean" + }, + FunctionExpression: { + type: "boolean" } }, additionalProperties: false @@ -45,7 +48,9 @@ module.exports = { const DEFAULT_OPTIONS = { FunctionDeclaration: true, MethodDefinition: false, - ClassDeclaration: false + ClassDeclaration: false, + ArrowFunctionExpression: false, + FunctionExpression: false }; const options = Object.assign(DEFAULT_OPTIONS, context.options[0] && context.options[0].require || {}); @@ -58,21 +63,6 @@ module.exports = { context.report({ node, message: "Missing JSDoc comment." }); } - /** - * Check if the jsdoc comment is present for class methods - * @param {ASTNode} node node to examine - * @returns {void} - */ - function checkClassMethodJsDoc(node) { - if (node.parent.type === "MethodDefinition") { - const jsdocComment = source.getJSDocComment(node); - - if (!jsdocComment) { - report(node); - } - } - } - /** * Check if the jsdoc comment is present or not. * @param {ASTNode} node node to examine @@ -93,8 +83,11 @@ module.exports = { } }, FunctionExpression(node) { - if (options.MethodDefinition) { - checkClassMethodJsDoc(node); + if ( + (options.MethodDefinition && node.parent.type === "MethodDefinition") || + (options.FunctionExpression && (node.parent.type === "VariableDeclarator" || (node.parent.type === "Property" && node === node.parent.value))) + ) { + checkJsDoc(node); } }, ClassDeclaration(node) { diff --git a/tests/lib/rules/require-jsdoc.js b/tests/lib/rules/require-jsdoc.js index d7bf04bfd61..5b4a4146ad5 100644 --- a/tests/lib/rules/require-jsdoc.js +++ b/tests/lib/rules/require-jsdoc.js @@ -191,6 +191,40 @@ ruleTester.run("require-jsdoc", rule, { } }], parserOptions: { ecmaVersion: 6 } + }, + { + code: "/**\nJSDoc Block\n*/\nvar foo = function() {}", + options: [{ + require: { + FunctionExpression: true + } + }] + }, + { + code: "const foo = {/**\nJSDoc Block\n*/\nbar() {}}", + options: [{ + require: { + FunctionExpression: true + } + }], + parserOptions: { ecmaVersion: 6 } + }, + { + code: "var foo = {/**\nJSDoc Block\n*/\nbar: function() {}}", + options: [{ + require: { + FunctionExpression: true + } + }] + }, + { + code: " var foo = { [function() {}]: 1 };", + options: [{ + require: { + FunctionExpression: true + } + }], + parserOptions: { ecmaVersion: 6 } } ], @@ -341,6 +375,43 @@ ruleTester.run("require-jsdoc", rule, { message: "Missing JSDoc comment.", type: "ArrowFunctionExpression" }] + }, + { + code: "var foo = function() {}", + options: [{ + require: { + FunctionExpression: true + } + }], + errors: [{ + message: "Missing JSDoc comment.", + type: "FunctionExpression" + }] + }, + { + code: "const foo = {bar() {}}", + options: [{ + require: { + FunctionExpression: true + } + }], + parserOptions: { ecmaVersion: 6 }, + errors: [{ + message: "Missing JSDoc comment.", + type: "FunctionExpression" + }] + }, + { + code: "var foo = {bar: function() {}}", + options: [{ + require: { + FunctionExpression: true + } + }], + errors: [{ + message: "Missing JSDoc comment.", + type: "FunctionExpression" + }] } ] });