Skip to content

Commit

Permalink
fix(eslint-plugin): [no-shadow] handle false positives on generics an…
Browse files Browse the repository at this point in the history
…d parameters (#5902)

* fix(eslint-plugin): [no-shadow] handle false positives on generics and parameters

* Update packages/eslint-plugin/src/rules/no-shadow.ts

Co-authored-by: Josh Goldberg <git@joshuakgoldberg.com>
  • Loading branch information
yeonjuan and JoshuaKGoldberg committed Nov 13, 2022
1 parent 91d71bc commit 769e8c8
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 2 deletions.
5 changes: 3 additions & 2 deletions packages/eslint-plugin/src/rules/no-shadow.ts
Expand Up @@ -147,8 +147,9 @@ export default util.createRule<Options, MessageIds>({
return false;
}

const id = variable.identifiers[0];
return util.isFunctionType(id.parent);
return variable.defs.every(
def => def.node.type === AST_NODE_TYPES.TSFunctionType,
);
}

function isGenericOfStaticMethod(
Expand Down
75 changes: 75 additions & 0 deletions packages/eslint-plugin/tests/rules/no-shadow/no-shadow.test.ts
Expand Up @@ -12,6 +12,25 @@ const ruleTester = new RuleTester({

ruleTester.run('no-shadow TS tests', rule, {
valid: [
'function foo<T = (arg: any) => any>(arg: T) {}',
'function foo<T = ([arg]: [any]) => any>(arg: T) {}',
'function foo<T = ({ args }: { args: any }) => any>(arg: T) {}',
'function foo<T = (...args: any[]) => any>(fn: T, args: any[]) {}',
'function foo<T extends (...args: any[]) => any>(fn: T, args: any[]) {}',
'function foo<T extends (...args: any[]) => any>(fn: T, ...args: any[]) {}',
'function foo<T extends ([args]: any[]) => any>(fn: T, args: any[]) {}',
'function foo<T extends ([...args]: any[]) => any>(fn: T, args: any[]) {}',
'function foo<T extends ({ args }: { args: any }) => any>(fn: T, args: any) {}',
`
function foo<T extends (id: string, ...args: any[]) => any>(
fn: T,
...args: any[]
) {}
`,
`
type Args = 1;
function foo<T extends (Args: any) => void>(arg: T) {}
`,
// nested conditional types
`
export type ArrayInput<Func> = Func extends (arg0: Array<infer T>) => any
Expand Down Expand Up @@ -375,6 +394,22 @@ type T = 1;
},
{
code: `
type T = 1;
function foo<T>(arg: T) {}
`,
errors: [
{
messageId: 'noShadow',
data: {
name: 'T',
shadowedLine: 2,
shadowedColumn: 6,
},
},
],
},
{
code: `
function foo<T>() {
return function <T>() {};
}
Expand All @@ -392,6 +427,22 @@ function foo<T>() {
},
{
code: `
type T = string;
function foo<T extends (arg: any) => void>(arg: T) {}
`,
errors: [
{
messageId: 'noShadow',
data: {
name: 'T',
shadowedLine: 2,
shadowedColumn: 6,
},
},
],
},
{
code: `
const x = 1;
{
type x = string;
Expand Down Expand Up @@ -703,5 +754,29 @@ let y;
},
],
},
{
code: `
function foo<T extends (...args: any[]) => any>(fn: T, args: any[]) {}
`,
options: [
{
ignoreTypeValueShadow: false,
builtinGlobals: true,
},
],
globals: {
args: 'writable',
},
errors: [
{
messageId: 'noShadowGlobal',
data: {
name: 'args',
shadowedLine: 2,
shadowedColumn: 5,
},
},
],
},
],
});

0 comments on commit 769e8c8

Please sign in to comment.