@@ -30,11 +30,50 @@ import { IExtensionPointUser } from 'vs/workbench/services/extensions/common/ext
3030import { generateUuid } from 'vs/base/common/uuid' ;
3131import { flatten } from 'vs/base/common/arrays' ;
3232import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation' ;
33+ import { NotebookKernelProviderAssociationRegistry , updateNotebookKernelProvideAssociationSchema , NotebookViewTypesExtensionRegistry } from 'vs/workbench/contrib/notebook/browser/notebookKernelAssociation' ;
3334
3435function MODEL_ID ( resource : URI ) : string {
3536 return resource . toString ( ) ;
3637}
3738
39+ export class NotebookKernelProviderInfoStore extends Disposable {
40+ private readonly _notebookKernelProviders : INotebookKernelProvider [ ] = [ ] ;
41+
42+ constructor ( ) {
43+ super ( ) ;
44+ }
45+
46+ add ( provider : INotebookKernelProvider ) {
47+ this . _notebookKernelProviders . push ( provider ) ;
48+ this . _updateProviderExtensionsInfo ( ) ;
49+
50+ return toDisposable ( ( ) => {
51+ let idx = this . _notebookKernelProviders . indexOf ( provider ) ;
52+ if ( idx >= 0 ) {
53+ this . _notebookKernelProviders . splice ( idx , 1 ) ;
54+ }
55+
56+ this . _updateProviderExtensionsInfo ( ) ;
57+ } ) ;
58+ }
59+
60+ get ( viewType : string , resource : URI ) {
61+ return this . _notebookKernelProviders . filter ( provider => notebookDocumentFilterMatch ( provider . selector , viewType , resource ) ) ;
62+ }
63+
64+ private _updateProviderExtensionsInfo ( ) {
65+ NotebookKernelProviderAssociationRegistry . extensionIds . length = 0 ;
66+ NotebookKernelProviderAssociationRegistry . extensionDescriptions . length = 0 ;
67+
68+ this . _notebookKernelProviders . forEach ( provider => {
69+ NotebookKernelProviderAssociationRegistry . extensionIds . push ( provider . providerExtensionId ) ;
70+ NotebookKernelProviderAssociationRegistry . extensionDescriptions . push ( provider . providerDescription || '' ) ;
71+ } ) ;
72+
73+ updateNotebookKernelProvideAssociationSchema ( ) ;
74+ }
75+ }
76+
3877export class NotebookProviderInfoStore extends Disposable {
3978 private static readonly CUSTOM_EDITORS_STORAGE_ID = 'notebookEditors' ;
4079 private static readonly CUSTOM_EDITORS_ENTRY_ID = 'editors' ;
@@ -54,13 +93,17 @@ export class NotebookProviderInfoStore extends Disposable {
5493 this . add ( new NotebookProviderInfo ( info ) ) ;
5594 }
5695
96+ this . _updateProviderExtensionsInfo ( ) ;
97+
5798 this . _register ( extensionService . onDidRegisterExtensions ( ( ) => {
5899 if ( ! this . _handled ) {
59100 // there is no extension point registered for notebook content provider
60101 // clear the memento and cache
61102 this . clear ( ) ;
62103 mementoObject [ NotebookProviderInfoStore . CUSTOM_EDITORS_ENTRY_ID ] = [ ] ;
63104 this . _memento . saveMemento ( ) ;
105+
106+ this . _updateProviderExtensionsInfo ( ) ;
64107 }
65108 } ) ) ;
66109 }
@@ -76,7 +119,8 @@ export class NotebookProviderInfoStore extends Disposable {
76119 displayName : notebookContribution . displayName ,
77120 selector : notebookContribution . selector || [ ] ,
78121 priority : this . _convertPriority ( notebookContribution . priority ) ,
79- providerId : extension . description . identifier . value ,
122+ providerExtensionId : extension . description . identifier . value ,
123+ providerDescription : extension . description . description ,
80124 providerDisplayName : extension . description . isBuiltin ? nls . localize ( 'builtinProviderDisplayName' , "Built-in" ) : extension . description . displayName || extension . description . identifier . value ,
81125 providerExtensionLocation : extension . description . extensionLocation
82126 } ) ) ;
@@ -86,6 +130,22 @@ export class NotebookProviderInfoStore extends Disposable {
86130 const mementoObject = this . _memento . getMemento ( StorageScope . GLOBAL ) ;
87131 mementoObject [ NotebookProviderInfoStore . CUSTOM_EDITORS_ENTRY_ID ] = Array . from ( this . _contributedEditors . values ( ) ) ;
88132 this . _memento . saveMemento ( ) ;
133+
134+ this . _updateProviderExtensionsInfo ( ) ;
135+ }
136+
137+ private _updateProviderExtensionsInfo ( ) {
138+ NotebookViewTypesExtensionRegistry . viewTypes . length = 0 ;
139+ NotebookViewTypesExtensionRegistry . viewTypeDescriptions . length = 0 ;
140+
141+ for ( const contribute of this . _contributedEditors ) {
142+ if ( contribute [ 1 ] . providerExtensionId ) {
143+ NotebookViewTypesExtensionRegistry . viewTypes . push ( contribute [ 1 ] . id ) ;
144+ NotebookViewTypesExtensionRegistry . viewTypeDescriptions . push ( `${ contribute [ 1 ] . displayName } ` ) ;
145+ }
146+ }
147+
148+ updateNotebookKernelProvideAssociationSchema ( ) ;
89149 }
90150
91151 private _convertPriority ( priority ?: string ) {
@@ -173,6 +233,7 @@ export class NotebookService extends Disposable implements INotebookService, ICu
173233 private readonly _notebookKernels = new Map < string , INotebookKernelInfo > ( ) ;
174234 notebookProviderInfoStore : NotebookProviderInfoStore ;
175235 notebookRenderersInfoStore : NotebookOutputRendererInfoStore = new NotebookOutputRendererInfoStore ( ) ;
236+ notebookKernelProviderInfoStore : NotebookKernelProviderInfoStore = new NotebookKernelProviderInfoStore ( ) ;
176237 private readonly _models = new Map < string , ModelData > ( ) ;
177238 private _onDidChangeActiveEditor = new Emitter < string | null > ( ) ;
178239 onDidChangeActiveEditor : Event < string | null > = this . _onDidChangeActiveEditor . event ;
@@ -200,7 +261,6 @@ export class NotebookService extends Disposable implements INotebookService, ICu
200261 private _lastClipboardIsCopy : boolean = true ;
201262
202263 private _displayOrder : { userOrder : string [ ] , defaultOrder : string [ ] } = Object . create ( null ) ;
203- private readonly _notebookKernelProviders : INotebookKernelProvider [ ] = [ ] ;
204264
205265 constructor (
206266 @IExtensionService private readonly _extensionService : IExtensionService ,
@@ -307,21 +367,18 @@ export class NotebookService extends Disposable implements INotebookService, ICu
307367 }
308368
309369 registerNotebookKernelProvider ( provider : INotebookKernelProvider ) : IDisposable {
310- this . _notebookKernelProviders . push ( provider ) ;
370+ const d = this . notebookKernelProviderInfoStore . add ( provider ) ;
311371 const kernelChangeEventListener = provider . onDidChangeKernels ( ( ) => {
312372 this . _onDidChangeKernels . fire ( ) ;
313373 } ) ;
314374 return toDisposable ( ( ) => {
315375 kernelChangeEventListener . dispose ( ) ;
316- let idx = this . _notebookKernelProviders . indexOf ( provider ) ;
317- if ( idx >= 0 ) {
318- this . _notebookKernelProviders . splice ( idx , 1 ) ;
319- }
376+ d . dispose ( ) ;
320377 } ) ;
321378 }
322379
323380 async getContributedNotebookKernels2 ( viewType : string , resource : URI , token : CancellationToken ) : Promise < INotebookKernelInfo2 [ ] > {
324- const filteredProvider = this . _notebookKernelProviders . filter ( provider => notebookDocumentFilterMatch ( provider . selector , viewType , resource ) ) ;
381+ const filteredProvider = this . notebookKernelProviderInfoStore . get ( viewType , resource ) ;
325382 const result = new Array < INotebookKernelInfo2 [ ] > ( filteredProvider . length ) ;
326383
327384 const promises = filteredProvider . map ( async ( provider , index ) => {
0 commit comments