@@ -13,7 +13,6 @@ import { EditMode, IInteractiveEditorSessionProvider, IInteractiveEditorSession,
13
13
import { IRange , Range } from 'vs/editor/common/core/range' ;
14
14
import { IActiveCodeEditor , ICodeEditor } from 'vs/editor/browser/editorBrowser' ;
15
15
import { createDecorator } from 'vs/platform/instantiation/common/instantiation' ;
16
- import { ResourceMap } from 'vs/base/common/map' ;
17
16
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry' ;
18
17
import { IModelService } from 'vs/editor/common/services/model' ;
19
18
import { ITextModelService } from 'vs/editor/common/services/resolverService' ;
@@ -266,6 +265,10 @@ export class EditResponse {
266
265
}
267
266
}
268
267
268
+ export interface ISessionKeyComputer {
269
+ getComparisonKey ( editor : ICodeEditor , uri : URI ) : string ;
270
+ }
271
+
269
272
export const IInteractiveEditorSessionService = createDecorator < IInteractiveEditorSessionService > ( 'IInteractiveEditorSessionService' ) ;
270
273
271
274
export interface IInteractiveEditorSessionService {
@@ -277,6 +280,8 @@ export interface IInteractiveEditorSessionService {
277
280
278
281
releaseSession ( session : Session ) : void ;
279
282
283
+ registerSessionKeyComputer ( scheme : string , value : ISessionKeyComputer ) : IDisposable ;
284
+
280
285
//
281
286
282
287
recordings ( ) : readonly Recording [ ] ;
@@ -291,7 +296,8 @@ export class InteractiveEditorSessionService implements IInteractiveEditorSessio
291
296
292
297
declare _serviceBrand : undefined ;
293
298
294
- private readonly _sessions = new Map < ICodeEditor , ResourceMap < SessionData > > ( ) ;
299
+ private readonly _sessions = new Map < string , SessionData > ( ) ;
300
+ private readonly _keyComputers = new Map < string , ISessionKeyComputer > ( ) ;
295
301
private _recordings : Recording [ ] = [ ] ;
296
302
297
303
constructor (
@@ -360,37 +366,27 @@ export class InteractiveEditorSessionService implements IInteractiveEditorSessio
360
366
361
367
const session = new Session ( options . editMode , editor , textModel0 , textModel , provider , raw , wholeRangeDecorationId ) ;
362
368
363
- // store: editor -> uri -> session
364
- let map = this . _sessions . get ( editor ) ;
365
- if ( ! map ) {
366
- map = new ResourceMap < SessionData > ( ) ;
367
- this . _sessions . set ( editor , map ) ;
369
+ // store: key -> session
370
+ const key = this . _key ( editor , textModel . uri ) ;
371
+ if ( this . _sessions . has ( key ) ) {
372
+ store . dispose ( ) ;
373
+ throw new Error ( `Session already stored for ${ key } ` ) ;
368
374
}
369
- if ( map . has ( textModel . uri ) ) {
370
- throw new Error ( `Session already stored for ${ textModel . uri } ` ) ;
371
- }
372
- map . set ( textModel . uri , { session, store } ) ;
375
+ this . _sessions . set ( key , { session, store } ) ;
373
376
return session ;
374
377
}
375
378
376
379
releaseSession ( session : Session ) : void {
377
380
378
- const { editor, textModelN } = session ;
381
+ const { editor } = session ;
379
382
380
383
// cleanup
381
- const map = this . _sessions . get ( editor ) ;
382
- if ( map ) {
383
- const data = map . get ( textModelN . uri ) ;
384
- if ( data ) {
385
- data . store . dispose ( ) ;
386
- data . session . session . dispose ?.( ) ;
387
-
388
- map . delete ( textModelN . uri ) ;
389
- this . _logService . trace ( `[IE] did RELEASE session for ${ editor . getId ( ) } , ${ session . provider . debugName } ` ) ;
390
-
391
- }
392
- if ( map . size === 0 ) {
393
- this . _sessions . delete ( editor ) ;
384
+ for ( const [ key , value ] of this . _sessions ) {
385
+ if ( value . session === session ) {
386
+ value . store . dispose ( ) ;
387
+ this . _sessions . delete ( key ) ;
388
+ this . _logService . trace ( `[IE] did RELEASED session for ${ editor . getId ( ) } , ${ session . provider . debugName } ` ) ;
389
+ break ;
394
390
}
395
391
}
396
392
@@ -405,7 +401,21 @@ export class InteractiveEditorSessionService implements IInteractiveEditorSessio
405
401
}
406
402
407
403
getSession ( editor : ICodeEditor , uri : URI ) : Session | undefined {
408
- return this . _sessions . get ( editor ) ?. get ( uri ) ?. session ;
404
+ const key = this . _key ( editor , uri ) ;
405
+ return this . _sessions . get ( key ) ?. session ;
406
+ }
407
+
408
+ private _key ( editor : ICodeEditor , uri : URI ) : string {
409
+ const item = this . _keyComputers . get ( uri . scheme ) ;
410
+ return item
411
+ ? item . getComparisonKey ( editor , uri )
412
+ : `${ editor . getId ( ) } @${ uri . toString ( ) } ` ;
413
+
414
+ }
415
+
416
+ registerSessionKeyComputer ( scheme : string , value : ISessionKeyComputer ) : IDisposable {
417
+ this . _keyComputers . set ( scheme , value ) ;
418
+ return toDisposable ( ( ) => this . _keyComputers . delete ( scheme ) ) ;
409
419
}
410
420
411
421
// --- debug
0 commit comments