diff --git a/README.md b/README.md index c120d2529..2130b8d99 100644 --- a/README.md +++ b/README.md @@ -2472,6 +2472,22 @@ export default function Item({ val = 4 }) { } + +/** + * @param obj + * @param obj.data + * @param obj.data.0 + * @param obj.data.1 + * @param obj.data.2 + * @param obj.defaulting + * @param obj.defaulting.0 + * @param obj.defaulting.1 + */ +function Item({ + data: [foo, bar, ...baz], + defaulting: [quux, xyz] = [] +}) { +} ```` @@ -11720,7 +11736,7 @@ function quux ({ foo: { bar } }) {} * Description. * @param {object} options Options. * @param {object} options.foo A description. - * @param {object} options.foo.bar + * @param {object} options.foo.bar */ function foo({ foo: { bar: { baz } }}) {} // Message: Missing JSDoc @param "options.foo.bar.baz" declaration. @@ -12313,6 +12329,22 @@ function quux ({ foo: { bar } }) {} */ function quux ({ foo: { bar } }) {} // Options: [{"checkTypesPattern":"FooBar"}] + +/** + * @param obj + * @param obj.data + * @param obj.data.0 + * @param obj.data.1 + * @param obj.data.2 + * @param obj.defaulting + * @param obj.defaulting.0 + * @param obj.defaulting.1 + */ +function Item({ + data: [foo, bar, ...baz], + defaulting: [quux, xyz] = [] +}) { +} ```` diff --git a/src/jsdocUtils.js b/src/jsdocUtils.js index f63d509f2..9c79b1992 100644 --- a/src/jsdocUtils.js +++ b/src/jsdocUtils.js @@ -135,17 +135,33 @@ const getFunctionParameterNames = (functionNode : Object) : Array => { } if (param.type === 'Property') { + if (param.value.type === 'ArrayPattern') { + return [param.key.name, param.value.elements.map((prop, idx) => { + return { + name: idx, + restElement: prop.type === 'RestElement', + }; + })]; + } if (param.value.type === 'ObjectPattern') { return [param.key.name, param.value.properties.map((prop) => { return getParamName(prop, isProperty); })]; } - if (param.value.type === 'AssignmentPattern' && - param.value.left.type === 'ObjectPattern' - ) { - return [param.key.name, param.value.left.properties.map((prop) => { - return getParamName(prop, isProperty); - })]; + if (param.value.type === 'AssignmentPattern') { + if (param.value.left.type === 'ObjectPattern') { + return [param.key.name, param.value.left.properties.map((prop) => { + return getParamName(prop, isProperty); + })]; + } + if (param.value.left.type === 'ArrayPattern') { + return [param.key.name, param.value.left.elements.map((prop, idx) => { + return { + name: idx, + restElement: prop.type === 'RestElement', + }; + })]; + } } // As function parameters, these do not allow dynamic properties, etc. diff --git a/test/rules/assertions/checkParamNames.js b/test/rules/assertions/checkParamNames.js index 89c0fe8d1..c68fe0529 100644 --- a/test/rules/assertions/checkParamNames.js +++ b/test/rules/assertions/checkParamNames.js @@ -1404,5 +1404,24 @@ export default { sourceType: 'module', }, }, + { + code: ` + /** + * @param obj + * @param obj.data + * @param obj.data.0 + * @param obj.data.1 + * @param obj.data.2 + * @param obj.defaulting + * @param obj.defaulting.0 + * @param obj.defaulting.1 + */ + function Item({ + data: [foo, bar, ...baz], + defaulting: [quux, xyz] = [] + }) { + } + `, + }, ], }; diff --git a/test/rules/assertions/requireParam.js b/test/rules/assertions/requireParam.js index bbdedc8f5..034ba348c 100644 --- a/test/rules/assertions/requireParam.js +++ b/test/rules/assertions/requireParam.js @@ -2098,7 +2098,7 @@ export default { * Description. * @param {object} options Options. * @param {object} options.foo A description. - * @param {object} options.foo.bar + * @param {object} options.foo.bar */ function foo({ foo: { bar: { baz } }}) {} `, @@ -3010,5 +3010,24 @@ export default { }, ], }, + { + code: ` + /** + * @param obj + * @param obj.data + * @param obj.data.0 + * @param obj.data.1 + * @param obj.data.2 + * @param obj.defaulting + * @param obj.defaulting.0 + * @param obj.defaulting.1 + */ + function Item({ + data: [foo, bar, ...baz], + defaulting: [quux, xyz] = [] + }) { + } + `, + }, ], };