Merge pull request #12778 from Microsoft/unusedLocalsAndObjectSpread

Do not report unused local error on locals that are intended for removing properties with object spread
This commit is contained in:
Sheetal Nandi
2016-12-09 09:28:54 -08:00
committed by GitHub
4 changed files with 150 additions and 1 deletions

View File

@@ -16702,6 +16702,14 @@ namespace ts {
}
}
function isRemovedPropertyFromObjectSpread(node: Node) {
if (isBindingElement(node) && isObjectBindingPattern(node.parent)) {
const lastElement = lastOrUndefined(node.parent.elements);
return lastElement !== node && !!lastElement.dotDotDotToken;
}
return false;
}
function errorUnusedLocal(node: Node, name: string) {
if (isIdentifierThatStartsWithUnderScore(node)) {
const declaration = getRootDeclaration(node.parent);
@@ -16711,7 +16719,10 @@ namespace ts {
return;
}
}
error(node, Diagnostics._0_is_declared_but_never_used, name);
if (!isRemovedPropertyFromObjectSpread(node.kind === SyntaxKind.Identifier ? node.parent : node)) {
error(node, Diagnostics._0_is_declared_but_never_used, name);
}
}
function parameterNameStartsWithUnderscore(parameterName: DeclarationName) {

View File

@@ -0,0 +1,40 @@
tests/cases/compiler/unusedLocalsAndObjectSpread.ts(21,18): error TS6133: 'bar' is declared but never used.
tests/cases/compiler/unusedLocalsAndObjectSpread.ts(28,21): error TS6133: 'bar' is declared but never used.
==== tests/cases/compiler/unusedLocalsAndObjectSpread.ts (2 errors) ====
declare var console: { log(a: any): void };
function one() {
const foo = { a: 1, b: 2 };
// 'a' is declared but never used
const {a, ...bar} = foo;
console.log(bar);
}
function two() {
const foo = { a: 1, b: 2 };
// '_' is declared but never used
const {a: _, ...bar} = foo;
console.log(bar);
}
function three() {
const foo = { a: 1, b: 2 };
// 'a' is declared but never used
const {a, ...bar} = foo; // bar should be unused
~~~
!!! error TS6133: 'bar' is declared but never used.
//console.log(bar);
}
function four() {
const foo = { a: 1, b: 2 };
// '_' is declared but never used
const {a: _, ...bar} = foo; // bar should be unused
~~~
!!! error TS6133: 'bar' is declared but never used.
//console.log(bar);
}

View File

@@ -0,0 +1,67 @@
//// [unusedLocalsAndObjectSpread.ts]
declare var console: { log(a: any): void };
function one() {
const foo = { a: 1, b: 2 };
// 'a' is declared but never used
const {a, ...bar} = foo;
console.log(bar);
}
function two() {
const foo = { a: 1, b: 2 };
// '_' is declared but never used
const {a: _, ...bar} = foo;
console.log(bar);
}
function three() {
const foo = { a: 1, b: 2 };
// 'a' is declared but never used
const {a, ...bar} = foo; // bar should be unused
//console.log(bar);
}
function four() {
const foo = { a: 1, b: 2 };
// '_' is declared but never used
const {a: _, ...bar} = foo; // bar should be unused
//console.log(bar);
}
//// [unusedLocalsAndObjectSpread.js]
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
t[p[i]] = s[p[i]];
return t;
};
function one() {
var foo = { a: 1, b: 2 };
// 'a' is declared but never used
var a = foo.a, bar = __rest(foo, ["a"]);
console.log(bar);
}
function two() {
var foo = { a: 1, b: 2 };
// '_' is declared but never used
var _ = foo.a, bar = __rest(foo, ["a"]);
console.log(bar);
}
function three() {
var foo = { a: 1, b: 2 };
// 'a' is declared but never used
var a = foo.a, bar = __rest(foo, ["a"]); // bar should be unused
//console.log(bar);
}
function four() {
var foo = { a: 1, b: 2 };
// '_' is declared but never used
var _ = foo.a, bar = __rest(foo, ["a"]); // bar should be unused
//console.log(bar);
}

View File

@@ -0,0 +1,31 @@
//@noUnusedLocals:true
declare var console: { log(a: any): void };
function one() {
const foo = { a: 1, b: 2 };
// 'a' is declared but never used
const {a, ...bar} = foo;
console.log(bar);
}
function two() {
const foo = { a: 1, b: 2 };
// '_' is declared but never used
const {a: _, ...bar} = foo;
console.log(bar);
}
function three() {
const foo = { a: 1, b: 2 };
// 'a' is declared but never used
const {a, ...bar} = foo; // bar should be unused
//console.log(bar);
}
function four() {
const foo = { a: 1, b: 2 };
// '_' is declared but never used
const {a: _, ...bar} = foo; // bar should be unused
//console.log(bar);
}