@@ -13,7 +13,6 @@ import { EditMode, IInteractiveEditorSessionProvider, IInteractiveEditorSession,
1313import { IRange , Range } from 'vs/editor/common/core/range' ;
1414import { IActiveCodeEditor , ICodeEditor } from 'vs/editor/browser/editorBrowser' ;
1515import { createDecorator } from 'vs/platform/instantiation/common/instantiation' ;
16- import { ResourceMap } from 'vs/base/common/map' ;
1716import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry' ;
1817import { IModelService } from 'vs/editor/common/services/model' ;
1918import { ITextModelService } from 'vs/editor/common/services/resolverService' ;
@@ -266,6 +265,10 @@ export class EditResponse {
266265 }
267266}
268267
268+ export interface ISessionKeyComputer {
269+ getComparisonKey ( editor : ICodeEditor , uri : URI ) : string ;
270+ }
271+
269272export const IInteractiveEditorSessionService = createDecorator < IInteractiveEditorSessionService > ( 'IInteractiveEditorSessionService' ) ;
270273
271274export interface IInteractiveEditorSessionService {
@@ -277,6 +280,8 @@ export interface IInteractiveEditorSessionService {
277280
278281 releaseSession ( session : Session ) : void ;
279282
283+ registerSessionKeyComputer ( scheme : string , value : ISessionKeyComputer ) : IDisposable ;
284+
280285 //
281286
282287 recordings ( ) : readonly Recording [ ] ;
@@ -291,7 +296,8 @@ export class InteractiveEditorSessionService implements IInteractiveEditorSessio
291296
292297 declare _serviceBrand : undefined ;
293298
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 > ( ) ;
295301 private _recordings : Recording [ ] = [ ] ;
296302
297303 constructor (
@@ -360,37 +366,27 @@ export class InteractiveEditorSessionService implements IInteractiveEditorSessio
360366
361367 const session = new Session ( options . editMode , editor , textModel0 , textModel , provider , raw , wholeRangeDecorationId ) ;
362368
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 } ` ) ;
368374 }
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 } ) ;
373376 return session ;
374377 }
375378
376379 releaseSession ( session : Session ) : void {
377380
378- const { editor, textModelN } = session ;
381+ const { editor } = session ;
379382
380383 // 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 ;
394390 }
395391 }
396392
@@ -405,7 +401,21 @@ export class InteractiveEditorSessionService implements IInteractiveEditorSessio
405401 }
406402
407403 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 ) ) ;
409419 }
410420
411421 // --- debug
0 commit comments