Skip to content

Commit

Permalink
fix(check-param-names, require-param): support nested array destr…
Browse files Browse the repository at this point in the history
…ucturing
  • Loading branch information
brettz9 committed Sep 12, 2020
1 parent 7fc84e9 commit 4f73e9c
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 8 deletions.
34 changes: 33 additions & 1 deletion README.md
Expand Up @@ -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] = []
}) {
}
````


Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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] = []
}) {
}
````


Expand Down
28 changes: 22 additions & 6 deletions src/jsdocUtils.js
Expand Up @@ -135,17 +135,33 @@ const getFunctionParameterNames = (functionNode : Object) : Array<T> => {
}

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.
Expand Down
19 changes: 19 additions & 0 deletions test/rules/assertions/checkParamNames.js
Expand Up @@ -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] = []
}) {
}
`,
},
],
};
21 changes: 20 additions & 1 deletion test/rules/assertions/requireParam.js
Expand Up @@ -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 } }}) {}
`,
Expand Down Expand Up @@ -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] = []
}) {
}
`,
},
],
};

0 comments on commit 4f73e9c

Please sign in to comment.