@@ -200,20 +200,31 @@ export class Controller {
200200 const add = (
201201 parent : vscode . TestItem ,
202202 node : IParsedNode ,
203+ id : string ,
203204 start : vscode . Location ,
204205 end : vscode . Location ,
205206 ) : vscode . TestItem => {
206- let item = parent . children . get ( node . name ) ;
207+ let item = parent . children . get ( id ) ;
207208 if ( ! item ) {
208- item = this . ctrl . createTestItem ( node . name , node . name , start . uri ) ;
209+ item = this . ctrl . createTestItem ( id , node . name , start . uri ) ;
209210 testMetadata . set ( item , { type : ItemType . Test } ) ;
210211 parent . children . add ( item ) ;
211212 }
212213 item . range = new vscode . Range ( start . range . start , end . range . end ) ;
213214
214215 const seen = new Map < string , vscode . TestItem > ( ) ;
216+ const level2Dupes = new Map < string , vscode . TestItem > ( ) ;
217+ for ( const [ , sibling ] of parent . children ) {
218+ if ( sibling . id == item . id || sibling . label !== node . name ) {
219+ continue ;
220+ }
221+
222+ for ( const [ , cousin ] of sibling . children ) {
223+ level2Dupes . set ( cousin . label , cousin ) ;
224+ }
225+ }
215226 for ( const child of node . children ) {
216- const existing = seen . get ( child . name ) ;
227+ const existing = seen . get ( child . name ) || level2Dupes . get ( child . name ) ;
217228 const start = sourceMap . originalPositionFor (
218229 child . location . start . line ,
219230 child . location . start . column ,
@@ -227,7 +238,7 @@ export class Controller {
227238 continue ;
228239 }
229240
230- seen . set ( child . name , add ( item , child , start , end ) ) ;
241+ seen . set ( child . name , add ( item , child , child . name , start , end ) ) ;
231242 }
232243
233244 for ( const [ id ] of item . children ) {
@@ -243,6 +254,7 @@ export class Controller {
243254 // source file. This is probably a good assumption. Likewise we assume that a single
244255 // a single describe/test is not split between different files.
245256 const newTestsInFile = new Map < string , vscode . TestItem > ( ) ;
257+ let nId : number = 0 ;
246258 for ( const node of tree ) {
247259 const start = sourceMap . originalPositionFor (
248260 node . location . start . line ,
@@ -251,7 +263,14 @@ export class Controller {
251263 const end = sourceMap . originalPositionFor ( node . location . end . line , node . location . end . column ) ;
252264 const file = last ( this . getContainingItemsForFile ( start . uri , { compiledFile : uri } ) ) ! . item ! ;
253265 diagnosticCollection . delete ( start . uri ) ;
254- newTestsInFile . set ( node . name , add ( file , node , start , end ) ) ;
266+ if ( newTestsInFile . has ( node . name ) && [ "describe" , "suite" ] . includes ( node . fn ) ) {
267+ const id = `${ node . name } #${ nId ++ } ` ;
268+ newTestsInFile . set ( id , add ( file , node , id , start , end ) ) ;
269+ }
270+ else {
271+ nId = 0 ;
272+ newTestsInFile . set ( node . name , add ( file , node , node . name , start , end ) ) ;
273+ }
255274 }
256275
257276 if ( previous ) {
0 commit comments