From c1c670f8f6d78f5ed6b02efeeef07e27ba619c5d Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 24 Oct 2016 11:12:15 -0700 Subject: [PATCH] Report error on unused destructured parameters Fixes #11795 --- src/compiler/checker.ts | 10 ++++---- .../unusedDestructuringParameters.errors.txt | 15 ++++++++++++ .../unusedDestructuringParameters.js | 8 ++++++- .../unusedDestructuringParameters.symbols | 16 ------------- .../unusedDestructuringParameters.types | 24 ------------------- .../unusedParametersWithUnderscore.errors.txt | 14 +---------- .../compiler/unusedDestructuringParameters.ts | 4 +++- 7 files changed, 31 insertions(+), 60 deletions(-) create mode 100644 tests/baselines/reference/unusedDestructuringParameters.errors.txt delete mode 100644 tests/baselines/reference/unusedDestructuringParameters.symbols delete mode 100644 tests/baselines/reference/unusedDestructuringParameters.types diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5b85a932c05..de807600066 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15832,12 +15832,12 @@ namespace ts { for (const key in node.locals) { const local = node.locals[key]; if (!local.isReferenced) { - if (local.valueDeclaration && local.valueDeclaration.kind === SyntaxKind.Parameter) { - const parameter = local.valueDeclaration; + if (local.valueDeclaration && getRootDeclaration(local.valueDeclaration).kind === SyntaxKind.Parameter) { + const parameter = getRootDeclaration(local.valueDeclaration); if (compilerOptions.noUnusedParameters && !isParameterPropertyDeclaration(parameter) && !parameterIsThisKeyword(parameter) && - !parameterNameStartsWithUnderscore(parameter)) { + !parameterNameStartsWithUnderscore(local.valueDeclaration.name)) { error(local.valueDeclaration.name, Diagnostics._0_is_declared_but_never_used, local.name); } } @@ -15861,8 +15861,8 @@ namespace ts { error(node, Diagnostics._0_is_declared_but_never_used, name); } - function parameterNameStartsWithUnderscore(parameter: ParameterDeclaration) { - return parameter.name && isIdentifierThatStartsWithUnderScore(parameter.name); + function parameterNameStartsWithUnderscore(parameterName: DeclarationName) { + return parameterName && isIdentifierThatStartsWithUnderScore(parameterName); } function isIdentifierThatStartsWithUnderScore(node: Node) { diff --git a/tests/baselines/reference/unusedDestructuringParameters.errors.txt b/tests/baselines/reference/unusedDestructuringParameters.errors.txt new file mode 100644 index 00000000000..b6814df6b7a --- /dev/null +++ b/tests/baselines/reference/unusedDestructuringParameters.errors.txt @@ -0,0 +1,15 @@ +tests/cases/compiler/unusedDestructuringParameters.ts(1,13): error TS6133: 'a' is declared but never used. +tests/cases/compiler/unusedDestructuringParameters.ts(3,14): error TS6133: 'a' is declared but never used. + + +==== tests/cases/compiler/unusedDestructuringParameters.ts (2 errors) ==== + const f = ([a]) => { }; + ~ +!!! error TS6133: 'a' is declared but never used. + f([1]); + const f2 = ({a}) => { }; + ~ +!!! error TS6133: 'a' is declared but never used. + f2({ a: 10 }); + const f3 = ([_]) => { }; + f3([10]); \ No newline at end of file diff --git a/tests/baselines/reference/unusedDestructuringParameters.js b/tests/baselines/reference/unusedDestructuringParameters.js index 9d47f6f9f1b..ca0ab80b86e 100644 --- a/tests/baselines/reference/unusedDestructuringParameters.js +++ b/tests/baselines/reference/unusedDestructuringParameters.js @@ -2,7 +2,9 @@ const f = ([a]) => { }; f([1]); const f2 = ({a}) => { }; -f2({ a: 10 }); +f2({ a: 10 }); +const f3 = ([_]) => { }; +f3([10]); //// [unusedDestructuringParameters.js] var f = function (_a) { @@ -13,3 +15,7 @@ var f2 = function (_a) { var a = _a.a; }; f2({ a: 10 }); +var f3 = function (_a) { + var _ = _a[0]; +}; +f3([10]); diff --git a/tests/baselines/reference/unusedDestructuringParameters.symbols b/tests/baselines/reference/unusedDestructuringParameters.symbols deleted file mode 100644 index d40d54f3fce..00000000000 --- a/tests/baselines/reference/unusedDestructuringParameters.symbols +++ /dev/null @@ -1,16 +0,0 @@ -=== tests/cases/compiler/unusedDestructuringParameters.ts === -const f = ([a]) => { }; ->f : Symbol(f, Decl(unusedDestructuringParameters.ts, 0, 5)) ->a : Symbol(a, Decl(unusedDestructuringParameters.ts, 0, 12)) - -f([1]); ->f : Symbol(f, Decl(unusedDestructuringParameters.ts, 0, 5)) - -const f2 = ({a}) => { }; ->f2 : Symbol(f2, Decl(unusedDestructuringParameters.ts, 2, 5)) ->a : Symbol(a, Decl(unusedDestructuringParameters.ts, 2, 13)) - -f2({ a: 10 }); ->f2 : Symbol(f2, Decl(unusedDestructuringParameters.ts, 2, 5)) ->a : Symbol(a, Decl(unusedDestructuringParameters.ts, 3, 4)) - diff --git a/tests/baselines/reference/unusedDestructuringParameters.types b/tests/baselines/reference/unusedDestructuringParameters.types deleted file mode 100644 index ebbe1efbc30..00000000000 --- a/tests/baselines/reference/unusedDestructuringParameters.types +++ /dev/null @@ -1,24 +0,0 @@ -=== tests/cases/compiler/unusedDestructuringParameters.ts === -const f = ([a]) => { }; ->f : ([a]: [any]) => void ->([a]) => { } : ([a]: [any]) => void ->a : any - -f([1]); ->f([1]) : void ->f : ([a]: [any]) => void ->[1] : [number] ->1 : 1 - -const f2 = ({a}) => { }; ->f2 : ({a}: { a: any; }) => void ->({a}) => { } : ({a}: { a: any; }) => void ->a : any - -f2({ a: 10 }); ->f2({ a: 10 }) : void ->f2 : ({a}: { a: any; }) => void ->{ a: 10 } : { a: number; } ->a : number ->10 : 10 - diff --git a/tests/baselines/reference/unusedParametersWithUnderscore.errors.txt b/tests/baselines/reference/unusedParametersWithUnderscore.errors.txt index adfe7bb9bc1..5e9ffa993b0 100644 --- a/tests/baselines/reference/unusedParametersWithUnderscore.errors.txt +++ b/tests/baselines/reference/unusedParametersWithUnderscore.errors.txt @@ -2,15 +2,11 @@ tests/cases/compiler/unusedParametersWithUnderscore.ts(2,12): error TS6133: 'a' tests/cases/compiler/unusedParametersWithUnderscore.ts(2,19): error TS6133: 'c' is declared but never used. tests/cases/compiler/unusedParametersWithUnderscore.ts(2,27): error TS6133: 'd' is declared but never used. tests/cases/compiler/unusedParametersWithUnderscore.ts(2,29): error TS6133: 'e___' is declared but never used. -tests/cases/compiler/unusedParametersWithUnderscore.ts(6,14): error TS6133: '_a' is declared but never used. -tests/cases/compiler/unusedParametersWithUnderscore.ts(6,18): error TS6133: '___b' is declared but never used. -tests/cases/compiler/unusedParametersWithUnderscore.ts(9,14): error TS6133: '_a' is declared but never used. -tests/cases/compiler/unusedParametersWithUnderscore.ts(9,19): error TS6133: '___b' is declared but never used. tests/cases/compiler/unusedParametersWithUnderscore.ts(12,16): error TS6133: 'arg' is declared but never used. tests/cases/compiler/unusedParametersWithUnderscore.ts(18,13): error TS6133: 'arg' is declared but never used. -==== tests/cases/compiler/unusedParametersWithUnderscore.ts (10 errors) ==== +==== tests/cases/compiler/unusedParametersWithUnderscore.ts (6 errors) ==== function f(a, _b, c, ___, d,e___, _f) { ~ @@ -25,17 +21,9 @@ tests/cases/compiler/unusedParametersWithUnderscore.ts(18,13): error TS6133: 'ar function f2({_a, __b}) { - ~~ -!!! error TS6133: '_a' is declared but never used. - ~~~ -!!! error TS6133: '___b' is declared but never used. } function f3([_a, ,__b]) { - ~~ -!!! error TS6133: '_a' is declared but never used. - ~~~ -!!! error TS6133: '___b' is declared but never used. } function f4(...arg) { diff --git a/tests/cases/compiler/unusedDestructuringParameters.ts b/tests/cases/compiler/unusedDestructuringParameters.ts index 748c9ea83fe..7c042351049 100644 --- a/tests/cases/compiler/unusedDestructuringParameters.ts +++ b/tests/cases/compiler/unusedDestructuringParameters.ts @@ -2,4 +2,6 @@ const f = ([a]) => { }; f([1]); const f2 = ({a}) => { }; -f2({ a: 10 }); \ No newline at end of file +f2({ a: 10 }); +const f3 = ([_]) => { }; +f3([10]); \ No newline at end of file