From 2dd5dfb9875f444bbf2e01d8aa357317fcb2ba68 Mon Sep 17 00:00:00 2001 From: Masataka Yoshimura Date: Tue, 31 Dec 2019 04:56:31 +0900 Subject: [PATCH 1/2] Treat write-only-access to a class member with setter as a reference. --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7df196699f8fe..4ffcd203a0753 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -23535,7 +23535,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; } From e31e4e8f967dd28b52a894f867ea5bf8d63a2224 Mon Sep 17 00:00:00 2001 From: Masataka Yoshimura Date: Tue, 31 Dec 2019 04:58:12 +0900 Subject: [PATCH 2/2] Add test case for unused private members, special-casing the member with a setter. --- .../reference/unusedPrivateMembers.errors.txt | 70 +++++++++++++++++++ .../reference/unusedPrivateMembers.js | 37 ++++++++++ .../reference/unusedPrivateMembers.symbols | 37 ++++++++++ .../reference/unusedPrivateMembers.types | 42 +++++++++++ tests/cases/compiler/unusedPrivateMembers.ts | 16 +++++ 5 files changed, 202 insertions(+) create mode 100644 tests/baselines/reference/unusedPrivateMembers.errors.txt diff --git a/tests/baselines/reference/unusedPrivateMembers.errors.txt b/tests/baselines/reference/unusedPrivateMembers.errors.txt new file mode 100644 index 0000000000000..3c8798d5ebe29 --- /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 05c55c1ecc49d..3f77cc9357754 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 bdd26c14f8300..5bd2d8246a767 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 e64711250c38e..2446eb20ee41f 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 ab4e5ba9bca33..72d84d55605d1 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++; + } +}