Skip to content

Commit d027e97

Browse files
committedOct 17, 2023
Add support for class get/set accessors (resolves #297)
1 parent 3e29758 commit d027e97

File tree

4 files changed

+36
-6
lines changed

4 files changed

+36
-6
lines changed
 

‎fixtures/members/members.ts

+20-1
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,29 @@ export class MyClass {
3838
};
3939

4040
dUnusedMember() {}
41-
dUsedExternal() {}
41+
dUsedExternal() {
42+
const value = this.usedGetter;
43+
this.usedSetter = value;
44+
}
4245

4346
static eUnusedStatic = 1;
4447
static eUsedExternal = 1;
48+
49+
public get usedGetter(): string {
50+
return 'usedGetter';
51+
}
52+
53+
public set usedSetter(value: string) {
54+
console.log(value);
55+
}
56+
57+
public get unusedGetter(): string {
58+
return 'unusedGetter';
59+
}
60+
61+
public set unusedSetter(value: string) {
62+
console.log(value);
63+
}
4564
}
4665

4766
MyClass.displayName = 'My Class';

‎src/typescript/ast-helpers.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ export function isValidImportTypeNode(node: ts.Node): node is ValidImportTypeNod
88
return ts.isImportTypeNode(node);
99
}
1010

11-
export function isPrivateMember(node: ts.MethodDeclaration | ts.PropertyDeclaration): boolean {
11+
export function isGetOrSetAccessorDeclaration(node: ts.Node): node is ts.AccessorDeclaration {
12+
return node.kind === ts.SyntaxKind.SetAccessor || node.kind === ts.SyntaxKind.GetAccessor;
13+
}
14+
15+
export function isPrivateMember(
16+
node: ts.MethodDeclaration | ts.PropertyDeclaration | ts.SetAccessorDeclaration | ts.GetAccessorDeclaration
17+
): boolean {
1218
return node.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.PrivateKeyword) ?? false;
1319
}
1420

‎src/typescript/visitors/exports/exportKeyword.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import ts from 'typescript';
22
import { SymbolType } from '../../../types/issues.js';
33
import { compact } from '../../../util/array.js';
4-
import { isPrivateMember, stripQuotes } from '../../ast-helpers.js';
4+
import { isGetOrSetAccessorDeclaration, isPrivateMember, stripQuotes } from '../../ast-helpers.js';
55
import { exportVisitor as visit } from '../index.js';
66

77
export default visit(
@@ -62,7 +62,10 @@ export default visit(
6262
const members = node.members
6363
.filter(
6464
(member): member is ts.MethodDeclaration | ts.PropertyDeclaration =>
65-
(ts.isPropertyDeclaration(member) || ts.isMethodDeclaration(member)) && !isPrivateMember(member)
65+
(ts.isPropertyDeclaration(member) ||
66+
ts.isMethodDeclaration(member) ||
67+
isGetOrSetAccessorDeclaration(member)) &&
68+
!isPrivateMember(member)
6669
)
6770
.map(member => ({
6871
node: member,

‎test/members.test.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,18 @@ test('Find unused enum and class members', async () => {
1717
assert(issues.enumMembers['members.ts']['B_Unused']);
1818
assert(issues.enumMembers['members.ts']['D_Key']);
1919

20-
assert.equal(Object.keys(issues.classMembers['members.ts']).length, 4);
20+
assert.equal(Object.keys(issues.classMembers['members.ts']).length, 6);
2121
assert(issues.classMembers['members.ts']['bUnusedPublic']);
2222
assert(issues.classMembers['members.ts']['cUnusedProp']);
2323
assert(issues.classMembers['members.ts']['dUnusedMember']);
2424
assert(issues.classMembers['members.ts']['eUnusedStatic']);
25+
assert(issues.classMembers['members.ts']['unusedGetter']);
26+
assert(issues.classMembers['members.ts']['unusedSetter']);
2527

2628
assert.deepEqual(counters, {
2729
...baseCounters,
2830
enumMembers: 2,
29-
classMembers: 4,
31+
classMembers: 6,
3032
processed: 2,
3133
total: 2,
3234
});

0 commit comments

Comments
 (0)
Please sign in to comment.