Skip to content

Commit 6371c4a

Browse files
committedJul 5, 2024·
fix(check-param-names): proper error messages for rest elements; fixes #1225
Also: - chore: update pnpm action setup
1 parent 14dc1bd commit 6371c4a

File tree

5 files changed

+92
-7
lines changed

5 files changed

+92
-7
lines changed
 

‎.github/workflows/feature.yaml

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ jobs:
33
runs-on: ubuntu-latest
44
name: Lint
55
steps:
6-
- uses: pnpm/action-setup@v2
6+
- uses: pnpm/action-setup@v4
77
with:
88
version: latest
99
- name: setup repository
@@ -22,7 +22,7 @@ jobs:
2222
runs-on: ubuntu-latest
2323
name: Test (Node.js ${{ matrix.node_js_version }})
2424
steps:
25-
- uses: pnpm/action-setup@v2
25+
- uses: pnpm/action-setup@v4
2626
with:
2727
version: latest
2828
- name: setup repository
@@ -46,7 +46,7 @@ jobs:
4646
runs-on: ubuntu-latest
4747
name: Build
4848
steps:
49-
- uses: pnpm/action-setup@v2
49+
- uses: pnpm/action-setup@v4
5050
with:
5151
version: latest
5252
- name: setup repository

‎.github/workflows/main.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ jobs:
44
environment: release
55
name: Release
66
steps:
7-
- uses: pnpm/action-setup@v2
7+
- uses: pnpm/action-setup@v4
88
with:
99
version: latest
1010
- name: setup repository

‎src/jsdocUtils.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,10 @@ const getFunctionParameterNames = (
436436
name: /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (
437437
/** @type {import('@typescript-eslint/types').TSESTree.RestElement} */ (
438438
param
439-
).argument).name,
439+
// @ts-expect-error Ok
440+
).argument).name ?? param?.argument?.elements?.map(({name}) => {
441+
return name;
442+
}),
440443
restElement: true,
441444
};
442445
}

‎src/rules/checkParamNames.js

+29-1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,24 @@ const validateParameterNames = (
8787

8888
return true;
8989
}
90+
if (
91+
typeof functionParameterName === 'object' &&
92+
'name' in functionParameterName &&
93+
Array.isArray(functionParameterName.name)
94+
) {
95+
const actualName = tag.name.trim();
96+
const expectedName = functionParameterName.name[index];
97+
if (actualName === expectedName) {
98+
thisOffset--;
99+
return false;
100+
}
101+
report(
102+
`Expected @${targetTagName} name to be "${expectedName}". Got "${actualName}".`,
103+
null,
104+
tag,
105+
);
106+
return true;
107+
}
90108

91109
if (Array.isArray(functionParameterName)) {
92110
if (!checkDestructured) {
@@ -236,6 +254,7 @@ const validateParameterNames = (
236254
]) => {
237255
return name.trim();
238256
});
257+
239258
const expectedNames = functionParameterNames.map((item, idx) => {
240259
if (/**
241260
* @type {[string|undefined, (import('../jsdocUtils.js').FlattendRootInfo & {
@@ -260,7 +279,15 @@ const validateParameterNames = (
260279
}
261280

262281
report(
263-
`Expected @${targetTagName} names to be "${expectedNames.join(', ')}". Got "${actualNames.join(', ')}".`,
282+
`Expected @${targetTagName} names to be "${
283+
expectedNames.map((expectedName) => {
284+
return typeof expectedName === 'object' &&
285+
'name' in expectedName &&
286+
expectedName.restElement
287+
? '...' + expectedName.name
288+
: expectedName;
289+
}).join(', ')
290+
}". Got "${actualNames.join(', ')}".`,
264291
null,
265292
tag,
266293
);
@@ -352,6 +379,7 @@ export default iterateJsdoc(({
352379
}
353380

354381
const functionParameterNames = utils.getFunctionParameterNames(useDefaultObjectProperties);
382+
355383
const targetTagName = /** @type {string} */ (utils.getPreferredTagName({
356384
tagName: 'param',
357385
}));

‎test/rules/assertions/checkParamNames.js

+55-1
Original file line numberDiff line numberDiff line change
@@ -1276,7 +1276,46 @@ export default {
12761276
parser: typescriptEslintParser,
12771277
sourceType: 'module',
12781278
},
1279-
}
1279+
},
1280+
{
1281+
code: `
1282+
interface A {
1283+
/**
1284+
* @param params Values for the placeholders
1285+
*/
1286+
getText(key: string, ...params: string[]): string
1287+
}
1288+
`,
1289+
errors: [
1290+
{
1291+
line: 4,
1292+
message: 'Expected @param names to be "key, ...params". Got "params".',
1293+
},
1294+
],
1295+
languageOptions: {
1296+
parser: typescriptEslintParser,
1297+
},
1298+
},
1299+
{
1300+
code: `
1301+
/**
1302+
* @param arg Arg
1303+
*/
1304+
export function fn(...[type, arg]: FnArgs): void {
1305+
// ...
1306+
}
1307+
`,
1308+
errors: [
1309+
{
1310+
line: 3,
1311+
message: 'Expected @param name to be "type". Got "arg".',
1312+
},
1313+
],
1314+
languageOptions: {
1315+
parser: typescriptEslintParser,
1316+
sourceType: 'module',
1317+
},
1318+
},
12801319
],
12811320
valid: [
12821321
{
@@ -1961,5 +2000,20 @@ export default {
19612000
},
19622001
],
19632002
},
2003+
{
2004+
code: `
2005+
/**
2006+
* @param type Type
2007+
* @param arg Arg
2008+
*/
2009+
export function fn(...[type, arg]: FnArgs): void {
2010+
// ...
2011+
}
2012+
`,
2013+
languageOptions: {
2014+
parser: typescriptEslintParser,
2015+
sourceType: 'module',
2016+
},
2017+
},
19642018
],
19652019
};

0 commit comments

Comments
 (0)
Please sign in to comment.