@@ -33,14 +33,15 @@ describe('UnusedMembersMetric', () => {
3333 }
3434 ` ;
3535 const { sourceFile, classNode, program, checker } = buildContext ( code ) ;
36- const count = metric . analyze ( {
36+ const result = metric . analyze ( {
3737 sourceFile,
3838 program,
3939 checker,
4040 sourceCode : code ,
4141 scopeNode : classNode ,
4242 } ) ;
43- expect ( count ) . toBe ( 5 ) ;
43+ expect ( result . unusedMembers ) . toBe ( 5 ) ;
44+ expect ( result . unusedMemberNames ?. length ) . toBe ( 5 ) ;
4445 } ) ;
4546
4647 it ( 'detects unused members with usage patterns' , ( ) => {
@@ -61,14 +62,17 @@ describe('UnusedMembersMetric', () => {
6162 }
6263 ` ;
6364 const { sourceFile, classNode, program, checker } = buildContext ( code ) ;
64- const count = metric . analyze ( {
65+ const result = metric . analyze ( {
6566 sourceFile,
6667 program,
6768 checker,
6869 sourceCode : code ,
6970 scopeNode : classNode ,
7071 } ) ;
71- expect ( count ) . toBe ( 3 ) ;
72+ expect ( result . unusedMembers ) . toBe ( 3 ) ;
73+ expect ( result . unusedMemberNames ) . toEqual (
74+ expect . arrayContaining ( [ 'unused1' , 'unused2' , '#unusedSuper' ] )
75+ ) ;
7276 } ) ;
7377
7478 it ( 'detects unused constructor parameter properties' , ( ) => {
@@ -78,14 +82,15 @@ describe('UnusedMembersMetric', () => {
7882 }
7983 ` ;
8084 const { sourceFile, classNode, program, checker } = buildContext ( code ) ;
81- const count = metric . analyze ( {
85+ const result = metric . analyze ( {
8286 sourceFile,
8387 program,
8488 checker,
8589 sourceCode : code ,
8690 scopeNode : classNode ,
8791 } ) ;
88- expect ( count ) . toBe ( 1 ) ;
92+ expect ( result . unusedMembers ) . toBe ( 1 ) ;
93+ expect ( result . unusedMemberNames ) . toEqual ( [ 'unused' ] ) ;
8994 } ) ;
9095
9196 it ( 'finds no unused members when all are used or public' , ( ) => {
@@ -110,13 +115,43 @@ describe('UnusedMembersMetric', () => {
110115 }
111116 ` ;
112117 const { sourceFile, classNode, program, checker } = buildContext ( code ) ;
113- const count = metric . analyze ( {
118+ const result = metric . analyze ( {
119+ sourceFile,
120+ program,
121+ checker,
122+ sourceCode : code ,
123+ scopeNode : classNode ,
124+ } ) ;
125+ expect ( result . unusedMembers ) . toBe ( 0 ) ;
126+ expect ( result . unusedMemberNames ) . toEqual ( [ ] ) ;
127+ } ) ;
128+
129+ it ( 'does not flag private static members used via ClassName access' , ( ) => {
130+ const code = `
131+ class Example {
132+ private static readonly CONST = new Set(['a']);
133+ private static helper() { return 'ok'; }
134+ private value = 'v';
135+
136+ method() {
137+ if (Example.CONST.has('a')) {
138+ (Example as any).helper();
139+ }
140+ // also ensure element access is handled
141+ const c = (Example as any)['CONST'];
142+ this.value = 'x';
143+ }
144+ }
145+ ` ;
146+ const { sourceFile, classNode, program, checker } = buildContext ( code ) ;
147+ const result = metric . analyze ( {
114148 sourceFile,
115149 program,
116150 checker,
117151 sourceCode : code ,
118152 scopeNode : classNode ,
119153 } ) ;
120- expect ( count ) . toBe ( 0 ) ;
154+ expect ( result . unusedMembers ) . toBe ( 0 ) ;
155+ expect ( result . unusedMemberNames ) . toEqual ( [ ] ) ;
121156 } ) ;
122157} ) ;
0 commit comments