From 131d41344dcc56f184e798818c9ddf4cbe78f708 Mon Sep 17 00:00:00 2001 From: Boshen Date: Sat, 15 Jun 2024 23:35:53 +0800 Subject: [PATCH] fix(linter): do not run getter-return in typescript --- .../src/rules/eslint/getter_return.rs | 50 ++------------ .../src/snapshots/getter_return.snap | 68 +++++++++---------- crates/oxc_linter/src/tester.rs | 6 ++ 3 files changed, 47 insertions(+), 77 deletions(-) diff --git a/crates/oxc_linter/src/rules/eslint/getter_return.rs b/crates/oxc_linter/src/rules/eslint/getter_return.rs index 037bddf2006d2..187f7422c583c 100644 --- a/crates/oxc_linter/src/rules/eslint/getter_return.rs +++ b/crates/oxc_linter/src/rules/eslint/getter_return.rs @@ -54,6 +54,10 @@ declare_oxc_lint!( impl Rule for GetterReturn { fn run<'a>(&self, node: &AstNode<'a>, ctx: &LintContext<'a>) { + // https://eslint.org/docs/latest/rules/getter-return#handled_by_typescript + if ctx.source_type().is_typescript() { + return; + } match node.kind() { AstKind::Function(func) if !func.is_typescript_syntax() => { self.run_diagnostic(node, ctx, func.span); @@ -350,54 +354,12 @@ fn test() { ("foo.defineProperties(null, { bar: { get() {} } });", None), ("foo.create(null, { bar: { get() {} } });", None), ("var foo = { get willThrowSoValid() { throw MyException() } };", None), - ("export abstract class Foo { protected abstract get foobar(): number; }", None), - ( - "class T { - theme: number; - get type(): number { - switch (theme) { - case 1: return 1; - case 2: return 2; - default: return 3; - } - throw new Error('test') - } - }", - None, - ), - ( - "class T { - theme: number; - get type(): number { - switch (theme) { - case 1: return 1; - case 2: return 2; - default: return 3; - } - } - }", - None, - ), ( "const originalClearTimeout = targetWindow.clearTimeout; Object.defineProperty(targetWindow, 'vscodeOriginalClearTimeout', { get: () => originalClearTimeout }); ", None, ), - ( - "class T { - get width(): number | undefined { - const val = undefined - if (!val) { - return; - } - - return val * val; - } - }", - None, - ), - ("function fn(): void { console.log('test') }", None), ]; let fail = vec![ @@ -437,5 +399,7 @@ fn test() { ("(Object?.create)(foo, { bar: { get: function (){} } });", Some(serde_json::json!([{ "allowImplicit": true }]))), ]; - Tester::new(GetterReturn::NAME, pass, fail).test_and_snapshot(); + Tester::new(GetterReturn::NAME, pass, fail) + .change_rule_path_extension("js") + .test_and_snapshot(); } diff --git a/crates/oxc_linter/src/snapshots/getter_return.snap b/crates/oxc_linter/src/snapshots/getter_return.snap index f6d71aa15a3f9..eff78a93eb2d3 100644 --- a/crates/oxc_linter/src/snapshots/getter_return.snap +++ b/crates/oxc_linter/src/snapshots/getter_return.snap @@ -3,14 +3,14 @@ source: crates/oxc_linter/src/tester.rs expression: getter_return --- ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:20] + ╭─[getter_return.js:1:20] 1 │ var foo = { get bar() {} }; · ───── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:2:6] + ╭─[getter_return.js:2:6] 1 │ var foo = { get 2 │ bar () {} }; · ───── @@ -18,49 +18,49 @@ expression: getter_return help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:20] + ╭─[getter_return.js:1:20] 1 │ var foo = { get bar(){if(baz) {return true;}} }; · ────────────────────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:20] + ╭─[getter_return.js:1:20] 1 │ var foo = { get bar() { ~function () {return true;}} }; · ───────────────────────────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:20] + ╭─[getter_return.js:1:20] 1 │ var foo = { get bar() { return; } }; · ────────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:20] + ╭─[getter_return.js:1:20] 1 │ var foo = { get bar() {} }; · ───── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:20] + ╭─[getter_return.js:1:20] 1 │ var foo = { get bar() {if (baz) {return;}} }; · ─────────────────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:20] + ╭─[getter_return.js:1:20] 1 │ class foo { get bar(){} } · ──── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:3:4] + ╭─[getter_return.js:3:4] 2 │ static get 3 │ bar(){} } · ──── @@ -68,175 +68,175 @@ expression: getter_return help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:20] + ╭─[getter_return.js:1:20] 1 │ class foo { get bar(){ if (baz) { return true; }}} · ────────────────────────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:20] + ╭─[getter_return.js:1:20] 1 │ class foo { get bar(){ ~function () { return true; }()}} · ──────────────────────────────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:20] + ╭─[getter_return.js:1:20] 1 │ class foo { get bar(){} } · ──── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:20] + ╭─[getter_return.js:1:20] 1 │ class foo { get bar(){if (baz) {return true;} } } · ──────────────────────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:42] + ╭─[getter_return.js:1:42] 1 │ Object.defineProperty(foo, 'bar', { get: function (){}}); · ───────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:42] + ╭─[getter_return.js:1:42] 1 │ Object.defineProperty(foo, 'bar', { get: function getfoo (){}}); · ──────────────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:40] + ╭─[getter_return.js:1:40] 1 │ Object.defineProperty(foo, 'bar', { get(){} }); · ──── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:42] + ╭─[getter_return.js:1:42] 1 │ Object.defineProperty(foo, 'bar', { get: () => {}}); · ──────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:42] + ╭─[getter_return.js:1:42] 1 │ Object.defineProperty(foo, "bar", { get: function (){if(bar) {return true;}}}); · ─────────────────────────────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:42] + ╭─[getter_return.js:1:42] 1 │ Object.defineProperty(foo, "bar", { get: function (){ ~function () { return true; }()}}); · ───────────────────────────────────────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:43] + ╭─[getter_return.js:1:43] 1 │ Reflect.defineProperty(foo, 'bar', { get: function (){}}); · ───────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:34] + ╭─[getter_return.js:1:34] 1 │ Object.create(foo, { bar: { get: function() {} } }) · ───────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:32] + ╭─[getter_return.js:1:32] 1 │ Object.create(foo, { bar: { get() {} } }) · ───── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:34] + ╭─[getter_return.js:1:34] 1 │ Object.create(foo, { bar: { get: () => {} } }) · ──────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:44] + ╭─[getter_return.js:1:44] 1 │ Object.defineProperties(foo, { bar: { get: function () {}} }); · ────────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:44] + ╭─[getter_return.js:1:44] 1 │ Object.defineProperties(foo, { bar: { get: function (){if(bar) {return true;}}}}); · ─────────────────────────────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:44] + ╭─[getter_return.js:1:44] 1 │ Object.defineProperties(foo, { bar: { get: function () {~function () { return true; }()}} }); · ───────────────────────────────────────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:42] + ╭─[getter_return.js:1:42] 1 │ Object.defineProperty(foo, "bar", { get: function (){}}); · ───────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:34] + ╭─[getter_return.js:1:34] 1 │ Object.create(foo, { bar: { get: function (){} } }); · ───────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:43] + ╭─[getter_return.js:1:43] 1 │ Reflect.defineProperty(foo, "bar", { get: function (){}}); · ───────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:43] + ╭─[getter_return.js:1:43] 1 │ Object?.defineProperty(foo, 'bar', { get: function (){} }); · ───────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:45] + ╭─[getter_return.js:1:45] 1 │ (Object?.defineProperty)(foo, 'bar', { get: function (){} }); · ───────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:43] + ╭─[getter_return.js:1:43] 1 │ Object?.defineProperty(foo, 'bar', { get: function (){} }); · ───────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:45] + ╭─[getter_return.js:1:45] 1 │ (Object?.defineProperty)(foo, 'bar', { get: function (){} }); · ───────────── ╰──── help: Return a value from all code paths in getter. ⚠ eslint(getter-return): Expected to always return a value in getter. - ╭─[getter_return.tsx:1:37] + ╭─[getter_return.js:1:37] 1 │ (Object?.create)(foo, { bar: { get: function (){} } }); · ───────────── ╰──── diff --git a/crates/oxc_linter/src/tester.rs b/crates/oxc_linter/src/tester.rs index 873277d135077..ae657a196cf62 100644 --- a/crates/oxc_linter/src/tester.rs +++ b/crates/oxc_linter/src/tester.rs @@ -134,6 +134,12 @@ impl Tester { self } + /// Change the extension of the path + pub fn change_rule_path_extension(mut self, ext: &str) -> Self { + self.rule_path = self.rule_path.with_extension(ext); + self + } + pub fn with_import_plugin(mut self, yes: bool) -> Self { self.import_plugin = yes; self