Skip to content

Commit c51d616

Browse files
committed
fix(check-param-names): check duplicate nested names; fixes #474
1 parent 3e8ea59 commit c51d616

File tree

3 files changed

+102
-3
lines changed

3 files changed

+102
-3
lines changed

README.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1631,6 +1631,38 @@ function quux (foo, foo) {
16311631
}
16321632
// Message: Duplicate @param "foo"
16331633

1634+
/**
1635+
* @param cfg
1636+
* @param cfg.foo
1637+
* @param cfg.foo
1638+
*/
1639+
function quux ({foo, bar}) {
1640+
1641+
}
1642+
// Message: Duplicate @param "cfg.foo"
1643+
1644+
/**
1645+
* @param cfg
1646+
* @param cfg.foo
1647+
* @param [cfg.foo]
1648+
* @param baz
1649+
*/
1650+
function quux ({foo, bar}, baz) {
1651+
1652+
}
1653+
// Message: Duplicate @param "cfg.foo"
1654+
1655+
/**
1656+
* @param cfg
1657+
* @param cfg.foo
1658+
* @param [cfg.foo="with a default"]
1659+
* @param baz
1660+
*/
1661+
function quux ({foo, bar}, baz) {
1662+
1663+
}
1664+
// Message: Duplicate @param "cfg.foo"
1665+
16341666
export class SomeClass {
16351667
/**
16361668
* @param prop

src/rules/checkParamNames.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,13 @@ const validateParameterNames = (
77
functionParameterNames : Array<string>, jsdoc, jsdocNode, utils, report,
88
) => {
99
const paramTags = entries(jsdoc.tags).filter(([, tag]) => {
10-
return tag.tag === targetTagName && !tag.name.includes('.');
10+
return tag.tag === targetTagName;
1111
});
12+
const paramTagsNonNested = paramTags.filter(([, tag]) => {
13+
return !tag.name.includes('.');
14+
});
15+
16+
let dotted = 0;
1217

1318
return paramTags.some(([, tag], index) => {
1419
let tagsIndex;
@@ -24,7 +29,13 @@ const validateParameterNames = (
2429

2530
return true;
2631
}
27-
const functionParameterName = functionParameterNames[index];
32+
if (tag.name.includes('.')) {
33+
dotted++;
34+
35+
return false;
36+
}
37+
38+
const functionParameterName = functionParameterNames[index - dotted];
2839

2940
if (!functionParameterName) {
3041
if (allowExtraTrailingParamDocs) {
@@ -46,7 +57,7 @@ const validateParameterNames = (
4657

4758
if (functionParameterName !== tag.name.trim()) {
4859
const expectedNames = functionParameterNames.join(', ');
49-
const actualNames = paramTags.map(([, {name}]) => {
60+
const actualNames = paramTagsNonNested.map(([, {name}]) => {
5061
return name.trim();
5162
}).join(', ');
5263

test/rules/assertions/checkParamNames.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,62 @@ export default {
188188
},
189189
],
190190
},
191+
{
192+
code: `
193+
/**
194+
* @param cfg
195+
* @param cfg.foo
196+
* @param cfg.foo
197+
*/
198+
function quux ({foo, bar}) {
199+
200+
}
201+
`,
202+
errors: [
203+
{
204+
line: 5,
205+
message: 'Duplicate @param "cfg.foo"',
206+
},
207+
],
208+
},
209+
{
210+
code: `
211+
/**
212+
* @param cfg
213+
* @param cfg.foo
214+
* @param [cfg.foo]
215+
* @param baz
216+
*/
217+
function quux ({foo, bar}, baz) {
218+
219+
}
220+
`,
221+
errors: [
222+
{
223+
line: 5,
224+
message: 'Duplicate @param "cfg.foo"',
225+
},
226+
],
227+
},
228+
{
229+
code: `
230+
/**
231+
* @param cfg
232+
* @param cfg.foo
233+
* @param [cfg.foo="with a default"]
234+
* @param baz
235+
*/
236+
function quux ({foo, bar}, baz) {
237+
238+
}
239+
`,
240+
errors: [
241+
{
242+
line: 5,
243+
message: 'Duplicate @param "cfg.foo"',
244+
},
245+
],
246+
},
191247
{
192248
code: `
193249
export class SomeClass {

0 commit comments

Comments
 (0)