From f06f809c75bb6ea0f1e1830c78453358e48186cc Mon Sep 17 00:00:00 2001 From: "M.Yoshimura" Date: Fri, 13 Mar 2020 07:41:40 +0900 Subject: [PATCH] Treat write-only-access to a class member with setter as a reference. (#35922) * Treat write-only-access to a class member with setter as a reference. * Add test case for unused private members, special-casing the member with a setter. --- src/compiler/checker.ts | 2 +- .../reference/unusedPrivateMembers.errors.txt | 70 +++++++++++++++++++ .../reference/unusedPrivateMembers.js | 37 ++++++++++ .../reference/unusedPrivateMembers.symbols | 37 ++++++++++ .../reference/unusedPrivateMembers.types | 42 +++++++++++ tests/cases/compiler/unusedPrivateMembers.ts | 16 +++++ 6 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/unusedPrivateMembers.errors.txt diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 0d23b69f4d4..b5042f64c06 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -24067,7 +24067,7 @@ namespace ts { if (!hasPrivateModifier && !hasPrivateIdentifier) { return; } - if (nodeForCheckWriteOnly && isWriteOnlyAccess(nodeForCheckWriteOnly) && !(prop.flags & SymbolFlags.SetAccessor && !(prop.flags & SymbolFlags.GetAccessor))) { + if (nodeForCheckWriteOnly && isWriteOnlyAccess(nodeForCheckWriteOnly) && !(prop.flags & SymbolFlags.SetAccessor)) { return; } diff --git a/tests/baselines/reference/unusedPrivateMembers.errors.txt b/tests/baselines/reference/unusedPrivateMembers.errors.txt new file mode 100644 index 00000000000..3c8798d5ebe --- /dev/null +++ b/tests/baselines/reference/unusedPrivateMembers.errors.txt @@ -0,0 +1,70 @@ +tests/cases/compiler/unusedPrivateMembers.ts(56,13): error TS6133: 'b' is declared but its value is never read. + + +==== tests/cases/compiler/unusedPrivateMembers.ts (1 errors) ==== + class Test1 { + private initializeInternal() { + } + + public test() { + var x = new Test1(); + x.initializeInternal(); + } + } + + class Test2 { + private p = 0; + public test() { + var x = new Test2(); + x.p; + } + } + + class Test3 { + private get x () { + return 0; + } + + public test() { + var x = new Test3(); + x.x; + } + } + + class Test4 { + private set x(v) { + v; + } + + public test() { + var x = new Test4(); + x.x; + } + } + + class Test5 { + private p: T; + public test() { + var x = new Test5(); + x.p; + } + } + + class Test6 { + private get a() { + return 0; + } + private set a(v) { + v; + } + private b = 0; + ~ +!!! error TS6133: 'b' is declared but its value is never read. + + public test() { + var x = new Test6(); + x.a++; + x.b++; + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/unusedPrivateMembers.js b/tests/baselines/reference/unusedPrivateMembers.js index ddca733ec09..e1a60fddcf4 100644 --- a/tests/baselines/reference/unusedPrivateMembers.js +++ b/tests/baselines/reference/unusedPrivateMembers.js @@ -46,6 +46,22 @@ class Test5 { x.p; } } + +class Test6 { + private get a() { + return 0; + } + private set a(v) { + v; + } + private b = 0; + + public test() { + var x = new Test6(); + x.a++; + x.b++; + } +} //// [unusedPrivateMembers.js] @@ -111,3 +127,24 @@ var Test5 = /** @class */ (function () { }; return Test5; }()); +var Test6 = /** @class */ (function () { + function Test6() { + this.b = 0; + } + Object.defineProperty(Test6.prototype, "a", { + get: function () { + return 0; + }, + set: function (v) { + v; + }, + enumerable: true, + configurable: true + }); + Test6.prototype.test = function () { + var x = new Test6(); + x.a++; + x.b++; + }; + return Test6; +}()); diff --git a/tests/baselines/reference/unusedPrivateMembers.symbols b/tests/baselines/reference/unusedPrivateMembers.symbols index bdd26c14f83..5bd2d8246a7 100644 --- a/tests/baselines/reference/unusedPrivateMembers.symbols +++ b/tests/baselines/reference/unusedPrivateMembers.symbols @@ -110,3 +110,40 @@ class Test5 { } } +class Test6 { +>Test6 : Symbol(Test6, Decl(unusedPrivateMembers.ts, 46, 1)) + + private get a() { +>a : Symbol(Test6.a, Decl(unusedPrivateMembers.ts, 48, 13), Decl(unusedPrivateMembers.ts, 51, 5)) + + return 0; + } + private set a(v) { +>a : Symbol(Test6.a, Decl(unusedPrivateMembers.ts, 48, 13), Decl(unusedPrivateMembers.ts, 51, 5)) +>v : Symbol(v, Decl(unusedPrivateMembers.ts, 52, 18)) + + v; +>v : Symbol(v, Decl(unusedPrivateMembers.ts, 52, 18)) + } + private b = 0; +>b : Symbol(Test6.b, Decl(unusedPrivateMembers.ts, 54, 5)) + + public test() { +>test : Symbol(Test6.test, Decl(unusedPrivateMembers.ts, 55, 18)) + + var x = new Test6(); +>x : Symbol(x, Decl(unusedPrivateMembers.ts, 58, 11)) +>Test6 : Symbol(Test6, Decl(unusedPrivateMembers.ts, 46, 1)) + + x.a++; +>x.a : Symbol(Test6.a, Decl(unusedPrivateMembers.ts, 48, 13), Decl(unusedPrivateMembers.ts, 51, 5)) +>x : Symbol(x, Decl(unusedPrivateMembers.ts, 58, 11)) +>a : Symbol(Test6.a, Decl(unusedPrivateMembers.ts, 48, 13), Decl(unusedPrivateMembers.ts, 51, 5)) + + x.b++; +>x.b : Symbol(Test6.b, Decl(unusedPrivateMembers.ts, 54, 5)) +>x : Symbol(x, Decl(unusedPrivateMembers.ts, 58, 11)) +>b : Symbol(Test6.b, Decl(unusedPrivateMembers.ts, 54, 5)) + } +} + diff --git a/tests/baselines/reference/unusedPrivateMembers.types b/tests/baselines/reference/unusedPrivateMembers.types index e64711250c3..2446eb20ee4 100644 --- a/tests/baselines/reference/unusedPrivateMembers.types +++ b/tests/baselines/reference/unusedPrivateMembers.types @@ -116,3 +116,45 @@ class Test5 { } } +class Test6 { +>Test6 : Test6 + + private get a() { +>a : number + + return 0; +>0 : 0 + } + private set a(v) { +>a : number +>v : number + + v; +>v : number + } + private b = 0; +>b : number +>0 : 0 + + public test() { +>test : () => void + + var x = new Test6(); +>x : Test6 +>new Test6() : Test6 +>Test6 : typeof Test6 + + x.a++; +>x.a++ : number +>x.a : number +>x : Test6 +>a : number + + x.b++; +>x.b++ : number +>x.b : number +>x : Test6 +>b : number + } +} + diff --git a/tests/cases/compiler/unusedPrivateMembers.ts b/tests/cases/compiler/unusedPrivateMembers.ts index ab4e5ba9bca..72d84d55605 100644 --- a/tests/cases/compiler/unusedPrivateMembers.ts +++ b/tests/cases/compiler/unusedPrivateMembers.ts @@ -49,3 +49,19 @@ class Test5 { x.p; } } + +class Test6 { + private get a() { + return 0; + } + private set a(v) { + v; + } + private b = 0; + + public test() { + var x = new Test6(); + x.a++; + x.b++; + } +}