From 116c87819a737c9c31d97989d1982444e2885727 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Wed, 2 Nov 2016 11:07:33 -0700 Subject: [PATCH 1/2] Test case for property used in destructuring variable declaration --- .../reference/unusedLocalProperty.errors.txt | 18 +++++++++++++ .../reference/unusedLocalProperty.js | 25 +++++++++++++++++++ tests/cases/compiler/unusedLocalProperty.ts | 12 +++++++++ 3 files changed, 55 insertions(+) create mode 100644 tests/baselines/reference/unusedLocalProperty.errors.txt create mode 100644 tests/baselines/reference/unusedLocalProperty.js create mode 100644 tests/cases/compiler/unusedLocalProperty.ts diff --git a/tests/baselines/reference/unusedLocalProperty.errors.txt b/tests/baselines/reference/unusedLocalProperty.errors.txt new file mode 100644 index 0000000000000..c9a4b3cb6d9ad --- /dev/null +++ b/tests/baselines/reference/unusedLocalProperty.errors.txt @@ -0,0 +1,18 @@ +tests/cases/compiler/unusedLocalProperty.ts(3,25): error TS6138: Property 'species' is declared but never used. + + +==== tests/cases/compiler/unusedLocalProperty.ts (1 errors) ==== + declare var console: { log(msg: any): void; } + class Animal { + constructor(private species: string) { + ~~~~~~~ +!!! error TS6138: Property 'species' is declared but never used. + } + + printSpecies() { + let { species } = this; + console.log(species); + } + } + + \ No newline at end of file diff --git a/tests/baselines/reference/unusedLocalProperty.js b/tests/baselines/reference/unusedLocalProperty.js new file mode 100644 index 0000000000000..a124b752125d7 --- /dev/null +++ b/tests/baselines/reference/unusedLocalProperty.js @@ -0,0 +1,25 @@ +//// [unusedLocalProperty.ts] +declare var console: { log(msg: any): void; } +class Animal { + constructor(private species: string) { + } + + printSpecies() { + let { species } = this; + console.log(species); + } +} + + + +//// [unusedLocalProperty.js] +var Animal = (function () { + function Animal(species) { + this.species = species; + } + Animal.prototype.printSpecies = function () { + var species = this.species; + console.log(species); + }; + return Animal; +}()); diff --git a/tests/cases/compiler/unusedLocalProperty.ts b/tests/cases/compiler/unusedLocalProperty.ts new file mode 100644 index 0000000000000..fdd33116135fc --- /dev/null +++ b/tests/cases/compiler/unusedLocalProperty.ts @@ -0,0 +1,12 @@ +//@noUnusedLocals:true +declare var console: { log(msg: any): void; } +class Animal { + constructor(private species: string) { + } + + printSpecies() { + let { species } = this; + console.log(species); + } +} + From 13e8f7fadaa702bc871e98edc592c11a3d2c439a Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Wed, 2 Nov 2016 11:08:34 -0700 Subject: [PATCH 2/2] Mark property referenced in the destructuring as referenced Fixes #11324 --- src/compiler/checker.ts | 28 ++++++++++------- .../reference/unusedLocalProperty.errors.txt | 18 ----------- .../reference/unusedLocalProperty.symbols | 29 ++++++++++++++++++ .../reference/unusedLocalProperty.types | 30 +++++++++++++++++++ 4 files changed, 76 insertions(+), 29 deletions(-) delete mode 100644 tests/baselines/reference/unusedLocalProperty.errors.txt create mode 100644 tests/baselines/reference/unusedLocalProperty.symbols create mode 100644 tests/baselines/reference/unusedLocalProperty.types diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index cf0c048ecbfb8..cfba499921299 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -11504,6 +11504,21 @@ namespace ts { diagnostics.add(createDiagnosticForNodeFromMessageChain(propNode, errorInfo)); } + function markPropertyAsReferenced(prop: Symbol) { + if (prop && + noUnusedIdentifiers && + (prop.flags & SymbolFlags.ClassMember) && + prop.valueDeclaration && (getModifierFlags(prop.valueDeclaration) & ModifierFlags.Private)) { + if (prop.flags & SymbolFlags.Instantiated) { + getSymbolLinks(prop).target.isReferenced = true; + + } + else { + prop.isReferenced = true; + } + } + } + function checkPropertyAccessExpressionOrQualifiedName(node: PropertyAccessExpression | QualifiedName, left: Expression | QualifiedName, right: Identifier) { const type = checkNonNullExpression(left); if (isTypeAny(type) || type === silentNeverType) { @@ -11523,17 +11538,7 @@ namespace ts { return unknownType; } - if (noUnusedIdentifiers && - (prop.flags & SymbolFlags.ClassMember) && - prop.valueDeclaration && (getModifierFlags(prop.valueDeclaration) & ModifierFlags.Private)) { - if (prop.flags & SymbolFlags.Instantiated) { - getSymbolLinks(prop).target.isReferenced = true; - - } - else { - prop.isReferenced = true; - } - } + markPropertyAsReferenced(prop); getNodeLinks(node).resolvedSymbol = prop; @@ -16323,6 +16328,7 @@ namespace ts { const parentType = getTypeForBindingElementParent(parent); const name = node.propertyName || node.name; const property = getPropertyOfType(parentType, getTextOfPropertyName(name)); + markPropertyAsReferenced(property); if (parent.initializer && property && getParentOfSymbol(property)) { checkClassPropertyAccess(parent, parent.initializer, parentType, property); } diff --git a/tests/baselines/reference/unusedLocalProperty.errors.txt b/tests/baselines/reference/unusedLocalProperty.errors.txt deleted file mode 100644 index c9a4b3cb6d9ad..0000000000000 --- a/tests/baselines/reference/unusedLocalProperty.errors.txt +++ /dev/null @@ -1,18 +0,0 @@ -tests/cases/compiler/unusedLocalProperty.ts(3,25): error TS6138: Property 'species' is declared but never used. - - -==== tests/cases/compiler/unusedLocalProperty.ts (1 errors) ==== - declare var console: { log(msg: any): void; } - class Animal { - constructor(private species: string) { - ~~~~~~~ -!!! error TS6138: Property 'species' is declared but never used. - } - - printSpecies() { - let { species } = this; - console.log(species); - } - } - - \ No newline at end of file diff --git a/tests/baselines/reference/unusedLocalProperty.symbols b/tests/baselines/reference/unusedLocalProperty.symbols new file mode 100644 index 0000000000000..6a3343bd5456e --- /dev/null +++ b/tests/baselines/reference/unusedLocalProperty.symbols @@ -0,0 +1,29 @@ +=== tests/cases/compiler/unusedLocalProperty.ts === +declare var console: { log(msg: any): void; } +>console : Symbol(console, Decl(unusedLocalProperty.ts, 0, 11)) +>log : Symbol(log, Decl(unusedLocalProperty.ts, 0, 22)) +>msg : Symbol(msg, Decl(unusedLocalProperty.ts, 0, 27)) + +class Animal { +>Animal : Symbol(Animal, Decl(unusedLocalProperty.ts, 0, 45)) + + constructor(private species: string) { +>species : Symbol(Animal.species, Decl(unusedLocalProperty.ts, 2, 16)) + } + + printSpecies() { +>printSpecies : Symbol(Animal.printSpecies, Decl(unusedLocalProperty.ts, 3, 5)) + + let { species } = this; +>species : Symbol(species, Decl(unusedLocalProperty.ts, 6, 13)) +>this : Symbol(Animal, Decl(unusedLocalProperty.ts, 0, 45)) + + console.log(species); +>console.log : Symbol(log, Decl(unusedLocalProperty.ts, 0, 22)) +>console : Symbol(console, Decl(unusedLocalProperty.ts, 0, 11)) +>log : Symbol(log, Decl(unusedLocalProperty.ts, 0, 22)) +>species : Symbol(species, Decl(unusedLocalProperty.ts, 6, 13)) + } +} + + diff --git a/tests/baselines/reference/unusedLocalProperty.types b/tests/baselines/reference/unusedLocalProperty.types new file mode 100644 index 0000000000000..3cb8747957db5 --- /dev/null +++ b/tests/baselines/reference/unusedLocalProperty.types @@ -0,0 +1,30 @@ +=== tests/cases/compiler/unusedLocalProperty.ts === +declare var console: { log(msg: any): void; } +>console : { log(msg: any): void; } +>log : (msg: any) => void +>msg : any + +class Animal { +>Animal : Animal + + constructor(private species: string) { +>species : string + } + + printSpecies() { +>printSpecies : () => void + + let { species } = this; +>species : string +>this : this + + console.log(species); +>console.log(species) : void +>console.log : (msg: any) => void +>console : { log(msg: any): void; } +>log : (msg: any) => void +>species : string + } +} + +