Skip to content

Commit 4f73e9c

Browse files
committed
fix(check-param-names, require-param): support nested array destructuring
1 parent 7fc84e9 commit 4f73e9c

File tree

4 files changed

+94
-8
lines changed

4 files changed

+94
-8
lines changed

README.md

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2472,6 +2472,22 @@ export default function Item({
24722472
val = 4
24732473
}) {
24742474
}
2475+
2476+
/**
2477+
* @param obj
2478+
* @param obj.data
2479+
* @param obj.data.0
2480+
* @param obj.data.1
2481+
* @param obj.data.2
2482+
* @param obj.defaulting
2483+
* @param obj.defaulting.0
2484+
* @param obj.defaulting.1
2485+
*/
2486+
function Item({
2487+
data: [foo, bar, ...baz],
2488+
defaulting: [quux, xyz] = []
2489+
}) {
2490+
}
24752491
````
24762492

24772493

@@ -11720,7 +11736,7 @@ function quux ({ foo: { bar } }) {}
1172011736
* Description.
1172111737
* @param {object} options Options.
1172211738
* @param {object} options.foo A description.
11723-
* @param {object} options.foo.bar
11739+
* @param {object} options.foo.bar
1172411740
*/
1172511741
function foo({ foo: { bar: { baz } }}) {}
1172611742
// Message: Missing JSDoc @param "options.foo.bar.baz" declaration.
@@ -12313,6 +12329,22 @@ function quux ({ foo: { bar } }) {}
1231312329
*/
1231412330
function quux ({ foo: { bar } }) {}
1231512331
// Options: [{"checkTypesPattern":"FooBar"}]
12332+
12333+
/**
12334+
* @param obj
12335+
* @param obj.data
12336+
* @param obj.data.0
12337+
* @param obj.data.1
12338+
* @param obj.data.2
12339+
* @param obj.defaulting
12340+
* @param obj.defaulting.0
12341+
* @param obj.defaulting.1
12342+
*/
12343+
function Item({
12344+
data: [foo, bar, ...baz],
12345+
defaulting: [quux, xyz] = []
12346+
}) {
12347+
}
1231612348
````
1231712349

1231812350

src/jsdocUtils.js

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,17 +135,33 @@ const getFunctionParameterNames = (functionNode : Object) : Array<T> => {
135135
}
136136

137137
if (param.type === 'Property') {
138+
if (param.value.type === 'ArrayPattern') {
139+
return [param.key.name, param.value.elements.map((prop, idx) => {
140+
return {
141+
name: idx,
142+
restElement: prop.type === 'RestElement',
143+
};
144+
})];
145+
}
138146
if (param.value.type === 'ObjectPattern') {
139147
return [param.key.name, param.value.properties.map((prop) => {
140148
return getParamName(prop, isProperty);
141149
})];
142150
}
143-
if (param.value.type === 'AssignmentPattern' &&
144-
param.value.left.type === 'ObjectPattern'
145-
) {
146-
return [param.key.name, param.value.left.properties.map((prop) => {
147-
return getParamName(prop, isProperty);
148-
})];
151+
if (param.value.type === 'AssignmentPattern') {
152+
if (param.value.left.type === 'ObjectPattern') {
153+
return [param.key.name, param.value.left.properties.map((prop) => {
154+
return getParamName(prop, isProperty);
155+
})];
156+
}
157+
if (param.value.left.type === 'ArrayPattern') {
158+
return [param.key.name, param.value.left.elements.map((prop, idx) => {
159+
return {
160+
name: idx,
161+
restElement: prop.type === 'RestElement',
162+
};
163+
})];
164+
}
149165
}
150166

151167
// As function parameters, these do not allow dynamic properties, etc.

test/rules/assertions/checkParamNames.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1404,5 +1404,24 @@ export default {
14041404
sourceType: 'module',
14051405
},
14061406
},
1407+
{
1408+
code: `
1409+
/**
1410+
* @param obj
1411+
* @param obj.data
1412+
* @param obj.data.0
1413+
* @param obj.data.1
1414+
* @param obj.data.2
1415+
* @param obj.defaulting
1416+
* @param obj.defaulting.0
1417+
* @param obj.defaulting.1
1418+
*/
1419+
function Item({
1420+
data: [foo, bar, ...baz],
1421+
defaulting: [quux, xyz] = []
1422+
}) {
1423+
}
1424+
`,
1425+
},
14071426
],
14081427
};

test/rules/assertions/requireParam.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2098,7 +2098,7 @@ export default {
20982098
* Description.
20992099
* @param {object} options Options.
21002100
* @param {object} options.foo A description.
2101-
* @param {object} options.foo.bar
2101+
* @param {object} options.foo.bar
21022102
*/
21032103
function foo({ foo: { bar: { baz } }}) {}
21042104
`,
@@ -3010,5 +3010,24 @@ export default {
30103010
},
30113011
],
30123012
},
3013+
{
3014+
code: `
3015+
/**
3016+
* @param obj
3017+
* @param obj.data
3018+
* @param obj.data.0
3019+
* @param obj.data.1
3020+
* @param obj.data.2
3021+
* @param obj.defaulting
3022+
* @param obj.defaulting.0
3023+
* @param obj.defaulting.1
3024+
*/
3025+
function Item({
3026+
data: [foo, bar, ...baz],
3027+
defaulting: [quux, xyz] = []
3028+
}) {
3029+
}
3030+
`,
3031+
},
30133032
],
30143033
};

0 commit comments

Comments
 (0)