-
Notifications
You must be signed in to change notification settings - Fork 719
Fix unused type parameter checking to skip overload signatures and only report on implementations #1618
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix unused type parameter checking to skip overload signatures and only report on implementations #1618
Changes from 6 commits
c5eeeec
e72f01e
64269ce
469d286
c72979a
beefab7
0065dbe
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6694,8 +6694,9 @@ func (c *Checker) checkUnusedIdentifiers(potentiallyUnusedIdentifiers []*ast.Nod | |
// Only report unused parameters on the implementation, not overloads. | ||
if node.Body() != nil { | ||
c.checkUnusedLocalsAndParameters(node) | ||
// Only report unused type parameters on the implementation, not overloads. | ||
c.checkUnusedTypeParameters(node) | ||
} | ||
|
||
c.checkUnusedTypeParameters(node) | ||
case ast.KindMethodSignature, ast.KindCallSignature, ast.KindConstructSignature, ast.KindFunctionType, ast.KindConstructorType, | ||
ast.KindTypeAliasDeclaration, ast.KindJSTypeAliasDeclaration, ast.KindInterfaceDeclaration: | ||
c.checkUnusedTypeParameters(node) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
overloadUnusedTypeParameters.ts(3,30): error TS6196: 'T' is declared but never used. | ||
overloadUnusedTypeParameters.ts(13,31): error TS6196: 'T' is declared but never used. | ||
|
||
|
||
==== overloadUnusedTypeParameters.ts (2 errors) ==== | ||
export function tryParseJson<T>(text: string): unknown; | ||
export function tryParseJson<T>(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; | ||
export function tryParseJson<T>() { | ||
~ | ||
!!! error TS6196: 'T' is declared but never used. | ||
throw new Error("noop") | ||
} | ||
|
||
export function tryParseJson2<T>(text: string): unknown; | ||
export function tryParseJson2<T>(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; | ||
export function tryParseJson2() { | ||
throw new Error("noop") | ||
} | ||
|
||
export function tryParseJson3<T>(_text: string): unknown { | ||
~ | ||
!!! error TS6196: 'T' is declared but never used. | ||
throw new Error("noop") | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
//// [tests/cases/compiler/overloadUnusedTypeParameters.ts] //// | ||
|
||
//// [overloadUnusedTypeParameters.ts] | ||
export function tryParseJson<T>(text: string): unknown; | ||
export function tryParseJson<T>(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; | ||
export function tryParseJson<T>() { | ||
throw new Error("noop") | ||
} | ||
|
||
export function tryParseJson2<T>(text: string): unknown; | ||
export function tryParseJson2<T>(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; | ||
export function tryParseJson2() { | ||
throw new Error("noop") | ||
} | ||
|
||
export function tryParseJson3<T>(_text: string): unknown { | ||
throw new Error("noop") | ||
} | ||
|
||
//// [overloadUnusedTypeParameters.js] | ||
export function tryParseJson() { | ||
throw new Error("noop"); | ||
} | ||
export function tryParseJson2() { | ||
throw new Error("noop"); | ||
} | ||
export function tryParseJson3(_text) { | ||
throw new Error("noop"); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
//// [tests/cases/compiler/overloadUnusedTypeParameters.ts] //// | ||
|
||
=== overloadUnusedTypeParameters.ts === | ||
export function tryParseJson<T>(text: string): unknown; | ||
>tryParseJson : Symbol(tryParseJson, Decl(overloadUnusedTypeParameters.ts, 0, 0), Decl(overloadUnusedTypeParameters.ts, 0, 55), Decl(overloadUnusedTypeParameters.ts, 1, 106)) | ||
>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 0, 29)) | ||
>text : Symbol(text, Decl(overloadUnusedTypeParameters.ts, 0, 32)) | ||
|
||
export function tryParseJson<T>(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; | ||
>tryParseJson : Symbol(tryParseJson, Decl(overloadUnusedTypeParameters.ts, 0, 0), Decl(overloadUnusedTypeParameters.ts, 0, 55), Decl(overloadUnusedTypeParameters.ts, 1, 106)) | ||
>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 1, 29)) | ||
>text : Symbol(text, Decl(overloadUnusedTypeParameters.ts, 1, 32)) | ||
>predicate : Symbol(predicate, Decl(overloadUnusedTypeParameters.ts, 1, 45)) | ||
>parsed : Symbol(parsed, Decl(overloadUnusedTypeParameters.ts, 1, 58)) | ||
>parsed : Symbol(parsed, Decl(overloadUnusedTypeParameters.ts, 1, 58)) | ||
>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 1, 29)) | ||
>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 1, 29)) | ||
|
||
export function tryParseJson<T>() { | ||
>tryParseJson : Symbol(tryParseJson, Decl(overloadUnusedTypeParameters.ts, 0, 0), Decl(overloadUnusedTypeParameters.ts, 0, 55), Decl(overloadUnusedTypeParameters.ts, 1, 106)) | ||
>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 2, 29)) | ||
|
||
throw new Error("noop") | ||
>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2022.error.d.ts, --, --)) | ||
} | ||
|
||
export function tryParseJson2<T>(text: string): unknown; | ||
>tryParseJson2 : Symbol(tryParseJson2, Decl(overloadUnusedTypeParameters.ts, 4, 1), Decl(overloadUnusedTypeParameters.ts, 6, 56), Decl(overloadUnusedTypeParameters.ts, 7, 107)) | ||
>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 6, 30)) | ||
>text : Symbol(text, Decl(overloadUnusedTypeParameters.ts, 6, 33)) | ||
|
||
export function tryParseJson2<T>(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; | ||
>tryParseJson2 : Symbol(tryParseJson2, Decl(overloadUnusedTypeParameters.ts, 4, 1), Decl(overloadUnusedTypeParameters.ts, 6, 56), Decl(overloadUnusedTypeParameters.ts, 7, 107)) | ||
>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 7, 30)) | ||
>text : Symbol(text, Decl(overloadUnusedTypeParameters.ts, 7, 33)) | ||
>predicate : Symbol(predicate, Decl(overloadUnusedTypeParameters.ts, 7, 46)) | ||
>parsed : Symbol(parsed, Decl(overloadUnusedTypeParameters.ts, 7, 59)) | ||
>parsed : Symbol(parsed, Decl(overloadUnusedTypeParameters.ts, 7, 59)) | ||
>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 7, 30)) | ||
>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 7, 30)) | ||
|
||
export function tryParseJson2() { | ||
>tryParseJson2 : Symbol(tryParseJson2, Decl(overloadUnusedTypeParameters.ts, 4, 1), Decl(overloadUnusedTypeParameters.ts, 6, 56), Decl(overloadUnusedTypeParameters.ts, 7, 107)) | ||
|
||
throw new Error("noop") | ||
>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2022.error.d.ts, --, --)) | ||
} | ||
|
||
export function tryParseJson3<T>(_text: string): unknown { | ||
>tryParseJson3 : Symbol(tryParseJson3, Decl(overloadUnusedTypeParameters.ts, 10, 1)) | ||
>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 12, 30)) | ||
>_text : Symbol(_text, Decl(overloadUnusedTypeParameters.ts, 12, 33)) | ||
|
||
throw new Error("noop") | ||
>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2022.error.d.ts, --, --)) | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
//// [tests/cases/compiler/overloadUnusedTypeParameters.ts] //// | ||
|
||
=== overloadUnusedTypeParameters.ts === | ||
export function tryParseJson<T>(text: string): unknown; | ||
>tryParseJson : { <T>(text: string): unknown; <T>(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; } | ||
>text : string | ||
|
||
export function tryParseJson<T>(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; | ||
>tryParseJson : { <T>(text: string): unknown; <T>(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; } | ||
>text : string | ||
>predicate : (parsed: unknown) => parsed is T | ||
>parsed : unknown | ||
|
||
export function tryParseJson<T>() { | ||
>tryParseJson : { <T>(text: string): unknown; <T>(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; } | ||
|
||
throw new Error("noop") | ||
>new Error("noop") : Error | ||
>Error : ErrorConstructor | ||
>"noop" : "noop" | ||
} | ||
|
||
export function tryParseJson2<T>(text: string): unknown; | ||
>tryParseJson2 : { <T>(text: string): unknown; <T>(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; } | ||
>text : string | ||
|
||
export function tryParseJson2<T>(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; | ||
>tryParseJson2 : { <T>(text: string): unknown; <T>(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; } | ||
>text : string | ||
>predicate : (parsed: unknown) => parsed is T | ||
>parsed : unknown | ||
|
||
export function tryParseJson2() { | ||
>tryParseJson2 : { <T>(text: string): unknown; <T>(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; } | ||
|
||
throw new Error("noop") | ||
>new Error("noop") : Error | ||
>Error : ErrorConstructor | ||
>"noop" : "noop" | ||
} | ||
|
||
export function tryParseJson3<T>(_text: string): unknown { | ||
>tryParseJson3 : <T>(_text: string) => unknown | ||
>_text : string | ||
|
||
throw new Error("noop") | ||
>new Error("noop") : Error | ||
>Error : ErrorConstructor | ||
>"noop" : "noop" | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
// @strict: true | ||
// @noUnusedLocals: true | ||
// @noUnusedParameters: true | ||
// @target: esnext | ||
|
||
export function tryParseJson<T>(text: string): unknown; | ||
export function tryParseJson<T>(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; | ||
export function tryParseJson<T>() { | ||
throw new Error("noop") | ||
} | ||
|
||
export function tryParseJson2<T>(text: string): unknown; | ||
export function tryParseJson2<T>(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; | ||
export function tryParseJson2() { | ||
throw new Error("noop") | ||
} | ||
|
||
export function tryParseJson3<T>(_text: string): unknown { | ||
throw new Error("noop") | ||
} |
Uh oh!
There was an error while loading. Please reload this page.