From dc1f9309cf04aa7314e758980ac687558482f47f Mon Sep 17 00:00:00 2001 From: Armano Date: Fri, 10 Jun 2022 07:29:13 +0200 Subject: [PATCH] fix: [TS4.7] allow visiting of typeParameters in TSTypeQuery (#5166) * fix: allow visiting of typeParameters in TSTypeQuery * fix: update eslint disable to noFormat --- .prettierignore | 3 + .../no-unused-vars/no-unused-vars.test.ts | 9 + .../src/referencer/TypeVisitor.ts | 1 + packages/scope-manager/tests/fixtures.test.ts | 4 +- .../type-query-with-parameters.ts | 5 + .../type-query-with-parameters.ts.shot | 167 ++++++++++++++++++ packages/visitor-keys/src/visitor-keys.ts | 2 +- 7 files changed, 189 insertions(+), 2 deletions(-) create mode 100644 packages/scope-manager/tests/fixtures/type-declaration/type-query-with-parameters.ts create mode 100644 packages/scope-manager/tests/fixtures/type-declaration/type-query-with-parameters.ts.shot diff --git a/.prettierignore b/.prettierignore index 896d5c464a3..eda67619c87 100644 --- a/.prettierignore +++ b/.prettierignore @@ -14,6 +14,9 @@ packages/eslint-plugin/src/configs/*.json CONTRIBUTORS.md packages/ast-spec/src/*/*/fixtures/_error_/*/fixture.ts +# Syntax not yet supported +packages/scope-manager/tests/fixtures/type-declaration/type-query-with-parameters.ts + # Ignore CHANGELOG.md files to avoid issues with automated release job CHANGELOG.md diff --git a/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars.test.ts b/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars.test.ts index fb7eadb47b7..cca98d2a952 100644 --- a/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars.test.ts @@ -739,6 +739,15 @@ export function foo() { return new Promise(); } `, + // https://github.com/typescript-eslint/typescript-eslint/issues/5152 + { + code: noFormat` +function foo(value: T): T { + return { value }; +} +export type Foo = typeof foo; + `, + }, // https://github.com/typescript-eslint/typescript-eslint/issues/2331 { code: ` diff --git a/packages/scope-manager/src/referencer/TypeVisitor.ts b/packages/scope-manager/src/referencer/TypeVisitor.ts index e9abb40f4f4..0d345a149a2 100644 --- a/packages/scope-manager/src/referencer/TypeVisitor.ts +++ b/packages/scope-manager/src/referencer/TypeVisitor.ts @@ -265,6 +265,7 @@ class TypeVisitor extends Visitor { } this.#referencer.currentScope().referenceValue(expr); } + this.visit(node.typeParameters); } protected TSTypeAnnotation(node: TSESTree.TSTypeAnnotation): void { diff --git a/packages/scope-manager/tests/fixtures.test.ts b/packages/scope-manager/tests/fixtures.test.ts index f029367ba06..b5a2fc70bd6 100644 --- a/packages/scope-manager/tests/fixtures.test.ts +++ b/packages/scope-manager/tests/fixtures.test.ts @@ -13,7 +13,9 @@ const ONLY = [].join(path.sep); const FIXTURES_DIR = path.resolve(__dirname, 'fixtures'); const fixtures = glob - .sync(`${FIXTURES_DIR}/**/*.{js,ts,jsx,tsx}`, { + .sync('**/*.{js,ts,jsx,tsx}', { + cwd: FIXTURES_DIR, + absolute: true, ignore: ['fixtures.test.ts'], }) .map(absolute => { diff --git a/packages/scope-manager/tests/fixtures/type-declaration/type-query-with-parameters.ts b/packages/scope-manager/tests/fixtures/type-declaration/type-query-with-parameters.ts new file mode 100644 index 00000000000..e8928f9f914 --- /dev/null +++ b/packages/scope-manager/tests/fixtures/type-declaration/type-query-with-parameters.ts @@ -0,0 +1,5 @@ +function foo(y: T) { + return { y }; +} + +export type Foo = typeof foo; diff --git a/packages/scope-manager/tests/fixtures/type-declaration/type-query-with-parameters.ts.shot b/packages/scope-manager/tests/fixtures/type-declaration/type-query-with-parameters.ts.shot new file mode 100644 index 00000000000..7ec279b55f8 --- /dev/null +++ b/packages/scope-manager/tests/fixtures/type-declaration/type-query-with-parameters.ts.shot @@ -0,0 +1,167 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`type-declaration type-query-with-parameters 1`] = ` +ScopeManager { + variables: Array [ + ImplicitGlobalConstTypeVariable, + Variable$2 { + defs: Array [ + FunctionNameDefinition$1 { + name: Identifier<"foo">, + node: FunctionDeclaration$1, + }, + ], + name: "foo", + references: Array [ + Reference$3 { + identifier: Identifier<"foo">, + isRead: true, + isTypeReference: false, + isValueReference: true, + isWrite: false, + resolved: Variable$2, + }, + ], + isValueVariable: true, + isTypeVariable: false, + }, + Variable$3 { + defs: Array [], + name: "arguments", + references: Array [], + isValueVariable: true, + isTypeVariable: true, + }, + Variable$4 { + defs: Array [ + ParameterDefinition$2 { + name: Identifier<"y">, + node: FunctionDeclaration$1, + }, + ], + name: "y", + references: Array [ + Reference$2 { + identifier: Identifier<"y">, + isRead: true, + isTypeReference: false, + isValueReference: true, + isWrite: false, + resolved: Variable$4, + }, + ], + isValueVariable: true, + isTypeVariable: false, + }, + Variable$5 { + defs: Array [ + TypeDefinition$3 { + name: Identifier<"T">, + node: TSTypeParameter$2, + }, + ], + name: "T", + references: Array [ + Reference$1 { + identifier: Identifier<"T">, + isRead: true, + isTypeReference: true, + isValueReference: false, + isWrite: false, + resolved: Variable$5, + }, + ], + isValueVariable: false, + isTypeVariable: true, + }, + Variable$6 { + defs: Array [ + TypeDefinition$4 { + name: Identifier<"Foo">, + node: TSTypeAliasDeclaration$3, + }, + ], + name: "Foo", + references: Array [], + isValueVariable: false, + isTypeVariable: true, + }, + Variable$7 { + defs: Array [ + TypeDefinition$5 { + name: Identifier<"T">, + node: TSTypeParameter$4, + }, + ], + name: "T", + references: Array [ + Reference$4 { + identifier: Identifier<"T">, + isRead: true, + isTypeReference: true, + isValueReference: false, + isWrite: false, + resolved: Variable$7, + }, + ], + isValueVariable: false, + isTypeVariable: true, + }, + ], + scopes: Array [ + GlobalScope$1 { + block: Program$5, + isStrict: false, + references: Array [], + set: Map { + "const" => ImplicitGlobalConstTypeVariable, + "foo" => Variable$2, + "Foo" => Variable$6, + }, + type: "global", + upper: null, + variables: Array [ + ImplicitGlobalConstTypeVariable, + Variable$2, + Variable$6, + ], + }, + FunctionScope$2 { + block: FunctionDeclaration$1, + isStrict: false, + references: Array [ + Reference$1, + Reference$2, + ], + set: Map { + "arguments" => Variable$3, + "y" => Variable$4, + "T" => Variable$5, + }, + type: "function", + upper: GlobalScope$1, + variables: Array [ + Variable$3, + Variable$4, + Variable$5, + ], + }, + TypeScope$3 { + block: TSTypeAliasDeclaration$3, + isStrict: true, + references: Array [ + Reference$3, + Reference$4, + ], + set: Map { + "T" => Variable$7, + }, + type: "type", + upper: GlobalScope$1, + variables: Array [ + Variable$7, + ], + }, + ], +} +`; diff --git a/packages/visitor-keys/src/visitor-keys.ts b/packages/visitor-keys/src/visitor-keys.ts index f7be9f1aed8..4c3a26d4066 100644 --- a/packages/visitor-keys/src/visitor-keys.ts +++ b/packages/visitor-keys/src/visitor-keys.ts @@ -142,7 +142,7 @@ const additionalKeys: AdditionalKeys = { TSTypeParameterDeclaration: ['params'], TSTypeParameterInstantiation: ['params'], TSTypePredicate: ['typeAnnotation', 'parameterName'], - TSTypeQuery: ['exprName'], + TSTypeQuery: ['exprName', 'typeParameters'], TSTypeReference: ['typeName', 'typeParameters'], TSUndefinedKeyword: [], TSUnionType: ['types'],