feat(linter/jsdoc): Implement require-param rule (#3554)

Part of #1170

>
https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-param.md

NOTE: `config.useDefaultObjectProperties` is not implemented for now.
This commit is contained in:
Yuji Sugiura 2024-06-07 16:58:16 +09:00 committed by GitHub
parent a939ddd096
commit 4a075cccd6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 1926 additions and 1 deletions

View file

@ -18,6 +18,9 @@ extend-exclude = [
"tasks/prettier_conformance/prettier",
]
[default]
extend-ignore-re = ["(?Rm)^.*(#|//)\\s*spellchecker:disable-line$"]
[default.extend-words]
trivias = "trivias"
trivia = "trivia"

View file

@ -390,6 +390,7 @@ mod jsdoc {
pub mod empty_tags;
pub mod implements_on_classes;
pub mod no_defaults;
pub mod require_param;
pub mod require_property;
pub mod require_property_description;
pub mod require_property_name;
@ -757,6 +758,7 @@ oxc_macros::declare_all_lint_rules! {
jsdoc::empty_tags,
jsdoc::implements_on_classes,
jsdoc::no_defaults,
jsdoc::require_param,
jsdoc::require_property,
jsdoc::require_property_type,
jsdoc::require_property_name,

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,426 @@
---
source: crates/oxc_linter/src/tester.rs
expression: require_param
---
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:29]
4 │ */
5 │ function quux (foo) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:30]
4 │ */
5 │ function quux ({foo}) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:34]
4 │ */
5 │ function quux (foo, bar, {baz}) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:34]
4 │ */
5 │ function quux (foo, bar, {baz}) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:30]
4 │ */
5 │ function quux ({foo}) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:35]
4 │ */
5 │ function quux ({foo: bar = 5} = {}) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:30]
4 │ */
5 │ function quux ({foo}) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:30]
4 │ */
5 │ function quux ({foo}) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:30]
4 │ */
5 │ function quux ({foo}) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:31]
4 │ */
5 │ function quux ({ foo, bar: { baz }}) {
· ─── ─────────────
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:30]
4 │ */
5 │ function quux ({foo}, {bar}) {
· ─── ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:30]
4 │ */
5 │ function quux ({foo}, {bar}) {
· ─── ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:30]
4 │ */
5 │ function quux ({foo}, {bar}) {
· ─── ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:29]
4 │ */
5 │ function quux (foo, bar) {
· ─── ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:34]
4 │ */
5 │ function quux (foo, bar) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:29]
4 │ */
5 │ function quux (foo, bar, baz) {
· ─── ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:6:39]
5 │ */
6 │ function quux (foo, bar, baz) {
· ───
7 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:29]
4 │ */
5 │ function quux (foo, bar, baz) {
· ─── ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:29]
4 │ */
5 │ function quux (foo) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:29]
4 │ */
5 │ function quux (foo) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:29]
4 │ */
5 │ function quux (foo) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:29]
4 │ */
5 │ function quux (foo) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:29]
4 │ */
5 │ function quux (foo) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:29]
4 │ */
5 │ function quux (foo) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:26]
4 │ */
5 │ function quux ({bar, baz}, foo) {
· ─── ─── ───
6 │ }
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:25]
4 │ */
5 │ function quux (foo, {bar, baz}) {
· ─── ─── ───
6 │ }
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:26]
4 │ */
5 │ function quux ([bar, baz], foo) {
· ─── ─── ───
6 │ }
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:29]
4 │ */
5 │ function quux (foo) {
· ───
6 │ }
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:29]
4 │ */
5 │ function quux (foo) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:8:42]
7 │ */
8 │ function assign (employees, name) {
· ────
9 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:6:40]
5 │ */
6 │ function quux (baz, {foo: bar}) {
· ───
7 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:29]
4 │ */
5 │ function quux (foo) {
· ───
6 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:8:14]
7 │ async setData(
8 │ data: { last_modified?: number }
· ────────────────────────────────
9 │ ) {}
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:6:34]
5 │ */
6 │ function quux ({num, ...extra}) {
· ─────
7 │ }
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:7:41]
6 │ */
7 │ function quux ({opts: {num, ...extra}}) {
· ─────
8 │ }
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:6:32]
5 │ */
6 │ function baar ([a, ...extra]) {
· ─────
7 │ //
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:5:31]
4 │ */
5 │ function baar (a, ...extra) {
· ─────
6 │ //
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:6:39]
5 │ */
6 │ const bboxToObj = function ({x, y, width, height}) {
· ─ ─ ───── ──────
7 │ return {x, y, width, height};
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:6:39]
5 │ */
6 │ const bboxToObj = function ({x, y, width, height}) {
· ─ ─ ───── ──────
7 │ return {x, y, width, height};
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:7:23]
6 │ */
7 │ fetch = ({ url, ...options }, cacheKey) => {
· ─── ───────
8 │ }
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:6:16]
5 │ */
6 │ function f(param) {
· ─────
7 │ return !param;
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:7:34]
6 │ */
7 │ function quux ({ foo: { bar } }) {}
· ───
8 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:7:34]
6 │ */
7 │ function quux ({ foo: { bar } }) {}
· ───
8 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:7:27]
6 │ */
7 │ function quux ({ foo: { bar } }) {}
· ─────────────
8 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:7:34]
6 │ */
7 │ function quux ({ foo: { bar } }) {}
· ───
8 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:8:39]
7 │ */
8 │ function foo({ foo: { bar: { baz } }}) {}
· ───
9 │
╰────
help: Add `@param` tag with name.
⚠ eslint-plugin-jsdoc(require-param): Missing JSDoc `@param` declaration for function parameters.
╭─[require_param.tsx:3:25]
2 │ /** Foo. */
3 │ function foo(a, b, c) {}
· ─ ─ ─
4 │
╰────
help: Add `@param` tag with name.

View file

@ -38,7 +38,11 @@ pub fn get_function_nearest_jsdoc_node<'a, 'b>(
| AstKind::CallExpression(_)
// /** This JSDoc should NOT found for `ArrowFunctionExpression` callback */
// new Promise(() => {})
| AstKind::NewExpression(_) => {
| AstKind::NewExpression(_)
// /** This JSDoc should NOT found for inner `Function` */
// function outer() { return function inner() {} }
| AstKind::ReturnStatement(_)
=> {
// /** This JSDoc should NOT found for `VariableDeclaration` */
// export const foo = () => {}
let parent_node = ctx.nodes().parent_node(current_node.id())?;