fix(linter): point to the opening fragment for jsx_no_useless_fragment

In real codebases the fragment child may be a wall of text that gets
printed on the screen.
This commit is contained in:
Boshen 2023-10-23 10:24:10 +08:00
parent 7edc7f0690
commit b6b6853e41
No known key found for this signature in database
GPG key ID: 234DA6A7079C6801
2 changed files with 38 additions and 37 deletions

View file

@ -88,11 +88,13 @@ impl JsxNoUselessFragment {
&& !is_fragment_with_only_text_and_is_not_child(node.id(), &elem.children, ctx)
&& !(self.allow_expressions && is_fragment_with_single_expression(&elem.children))
{
ctx.diagnostic(JsxNoUselessFragmentDiagnostic::NeedsMoreChildren(elem.span));
let span = elem.opening_element.span;
ctx.diagnostic(JsxNoUselessFragmentDiagnostic::NeedsMoreChildren(span));
}
if is_child_of_html_element(node, ctx) {
ctx.diagnostic(JsxNoUselessFragmentDiagnostic::ChildOfHtmlElement(elem.span));
let span = elem.opening_element.span;
ctx.diagnostic(JsxNoUselessFragmentDiagnostic::ChildOfHtmlElement(span));
}
}
fn check_fragment(&self, node: &AstNode, elem: &JSXFragment, ctx: &LintContext) {
@ -100,11 +102,13 @@ impl JsxNoUselessFragment {
&& !is_fragment_with_only_text_and_is_not_child(node.id(), &elem.children, ctx)
&& !(self.allow_expressions && is_fragment_with_single_expression(&elem.children))
{
ctx.diagnostic(JsxNoUselessFragmentDiagnostic::NeedsMoreChildren(elem.span));
let span = elem.opening_fragment.span;
ctx.diagnostic(JsxNoUselessFragmentDiagnostic::NeedsMoreChildren(span));
}
if is_child_of_html_element(node, ctx) {
ctx.diagnostic(JsxNoUselessFragmentDiagnostic::ChildOfHtmlElement(elem.span));
let span = elem.opening_fragment.span;
ctx.diagnostic(JsxNoUselessFragmentDiagnostic::ChildOfHtmlElement(span));
}
}
}

View file

@ -5,58 +5,57 @@ expression: jsx_no_useless_fragment
⚠ eslint-plugin-react(jsx-no-useless-fragment): Fragments should contain more than one child.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │ <></>
· ─────
· ──
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Fragments should contain more than one child.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │ <>{}</>
· ───────
· ──
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Fragments should contain more than one child.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │ <p>moo<>foo</></p>
· ────────
· ──
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Passing a fragment to a HTML element is useless.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │ <p>moo<>foo</></p>
· ────────
· ──
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Fragments should contain more than one child.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │ <>{meow}</>
· ───────────
· ──
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Fragments should contain more than one child.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │ <p><>{meow}</></p>
· ───────────
· ──
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Passing a fragment to a HTML element is useless.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │ <p><>{meow}</></p>
· ───────────
· ──
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Fragments should contain more than one child.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │ <><div/></>
· ───────────
· ──
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Fragments should contain more than one child.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │
2 │ ╭─▶ <>
3 │ │ <div/>
4 │ ╰─▶ </>
5 │
1 │
2 │ <>
· ──
3 │ <div/>
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Fragments should contain more than one child.
@ -67,78 +66,76 @@ expression: jsx_no_useless_fragment
⚠ eslint-plugin-react(jsx-no-useless-fragment): Fragments should contain more than one child.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │
2 │ ╭─▶ <React.Fragment>
3 │ │ <Foo />
4 │ ╰─▶ </React.Fragment>
5 │
1 │
2 │ <React.Fragment>
· ────────────────
3 │ <Foo />
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Fragments should contain more than one child.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │ <Eeee><>foo</></Eeee>
· ────────
· ──
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Fragments should contain more than one child.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │ <div><>foo</></div>
· ────────
· ──
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Passing a fragment to a HTML element is useless.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │ <div><>foo</></div>
· ────────
· ──
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Passing a fragment to a HTML element is useless.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │ <div><>{"a"}{"b"}</></div>
· ───────────────
· ──
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Passing a fragment to a HTML element is useless.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │ <div><>{"a"}{"b"}</></div>
· ───────────────
· ──
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Passing a fragment to a HTML element is useless.
╭─[jsx_no_useless_fragment.tsx:4:1]
4 │ <Eeee />
5 │ <>{"a"}{"b"}</>
· ───────────────
· ──
6 │ </section>
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Passing a fragment to a HTML element is useless.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │ <div><Fragment>{"a"}{"b"}</Fragment></div>
· ───────────────────────────────
· ──────────
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Passing a fragment to a HTML element is useless.
╭─[jsx_no_useless_fragment.tsx:2:1]
2 │ <section>
3 │ ╭─▶ git<>
4 │ │ <b>hub</b>.
5 │ ╰─▶ </>
6 │
2 │ <section>
3 │ git<>
· ──
4 │ <b>hub</b>.
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Passing a fragment to a HTML element is useless.
╭─[jsx_no_useless_fragment.tsx:6:1]
6 │
7 │ git<> <b>hub</b></>
· ────────────────
· ──
8 │ </section>
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Passing a fragment to a HTML element is useless.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │ <div>a <>{""}{""}</> a</div>
· ─────────────
· ──
╰────
⚠ eslint-plugin-react(jsx-no-useless-fragment): Fragments should contain more than one child.
@ -160,7 +157,7 @@ expression: jsx_no_useless_fragment
⚠ eslint-plugin-react(jsx-no-useless-fragment): Fragments should contain more than one child.
╭─[jsx_no_useless_fragment.tsx:1:1]
1 │ <><Foo>{moo}</Foo></>
· ─────────────────────
· ──
╰────