@@ -15,8 +15,8 @@ import { IWorkbenchExtensionEnablementService, IWorkbenchExtensionManagementServ
15
15
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation' ;
16
16
import { INotificationService , Severity } from 'vs/platform/notification/common/notification' ;
17
17
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry' ;
18
- import { ActivationTimes , ExtensionPointContribution , IExtensionService , IExtensionsStatus , IMessage , IWillActivateEvent , IResponsiveStateChangeEvent , toExtension , IExtensionHost , ActivationKind , ExtensionHostKind , ExtensionRunningLocation , extensionHostKindToString , ExtensionActivationReason , IInternalExtensionService , RemoteRunningLocation , LocalProcessRunningLocation , LocalWebWorkerRunningLocation } from 'vs/workbench/services/extensions/common/extensions' ;
19
- import { ExtensionMessageCollector , ExtensionPoint , ExtensionsRegistry , IExtensionPoint , IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry' ;
18
+ import { ActivationTimes , ExtensionPointContribution , IExtensionService , IExtensionsStatus , IMessage , IWillActivateEvent , IResponsiveStateChangeEvent , toExtension , IExtensionHost , ActivationKind , ExtensionHostKind , ExtensionRunningLocation , extensionHostKindToString , ExtensionActivationReason , IInternalExtensionService , RemoteRunningLocation , LocalProcessRunningLocation , LocalWebWorkerRunningLocation , IImplicitActivationEvents } from 'vs/workbench/services/extensions/common/extensions' ;
19
+ import { ExtensionActivationEventsCollector , ExtensionMessageCollector , ExtensionPoint , ExtensionsRegistry , IExtensionPoint , IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry' ;
20
20
import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry' ;
21
21
import { ResponsiveState } from 'vs/workbench/services/extensions/common/rpcProtocol' ;
22
22
import { createExtensionHostManager , IExtensionHostManager } from 'vs/workbench/services/extensions/common/extensionHostManager' ;
@@ -153,6 +153,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx
153
153
private readonly _installedExtensionsReady : Barrier ;
154
154
private readonly _isDev : boolean ;
155
155
private readonly _extensionsMessages : Map < string , IMessage [ ] > ;
156
+ private readonly _extensionsImplicitActivationEvents : Map < string , Set < string > > ;
156
157
private readonly _allRequestedActivateEvents = new Set < string > ( ) ;
157
158
private readonly _proposedApiController : ProposedApiController ;
158
159
private readonly _isExtensionDevHost : boolean ;
@@ -206,6 +207,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx
206
207
this . _installedExtensionsReady = new Barrier ( ) ;
207
208
this . _isDev = ! this . _environmentService . isBuilt || this . _environmentService . isExtensionDevelopment ;
208
209
this . _extensionsMessages = new Map < string , IMessage [ ] > ( ) ;
210
+ this . _extensionsImplicitActivationEvents = new Map < string , Set < string > > ( ) ;
209
211
this . _proposedApiController = _instantiationService . createInstance ( ProposedApiController ) ;
210
212
211
213
this . _extensionHostManagers = [ ] ;
@@ -1211,19 +1213,48 @@ export abstract class AbstractExtensionService extends Disposable implements IEx
1211
1213
}
1212
1214
1213
1215
const messageHandler = ( msg : IMessage ) => this . _handleExtensionPointMessage ( msg ) ;
1216
+ const implicitActivationEventsHandler = ( info : IImplicitActivationEvents ) => this . _handleImplicitExtensionActivationEvents ( info ) ;
1214
1217
const availableExtensions = this . _registry . getAllExtensionDescriptions ( ) ;
1215
1218
const extensionPoints = ExtensionsRegistry . getExtensionPoints ( ) ;
1216
1219
perf . mark ( 'code/willHandleExtensionPoints' ) ;
1217
1220
for ( const extensionPoint of extensionPoints ) {
1218
1221
if ( affectedExtensionPoints [ extensionPoint . name ] ) {
1219
1222
perf . mark ( `code/willHandleExtensionPoint/${ extensionPoint . name } ` ) ;
1220
- AbstractExtensionService . _handleExtensionPoint ( extensionPoint , availableExtensions , messageHandler ) ;
1223
+ AbstractExtensionService . _handleExtensionPoint ( extensionPoint , availableExtensions , messageHandler , implicitActivationEventsHandler ) ;
1221
1224
perf . mark ( `code/didHandleExtensionPoint/${ extensionPoint . name } ` ) ;
1222
1225
}
1223
1226
}
1227
+ this . _combineImplicitExtensionActivationEvents ( ) ;
1224
1228
perf . mark ( 'code/didHandleExtensionPoints' ) ;
1225
1229
}
1226
1230
1231
+ private _combineImplicitExtensionActivationEvents ( ) {
1232
+ for ( const [ extensionKey , implicitActivationEvents ] of this . _extensionsImplicitActivationEvents . entries ( ) ) {
1233
+ const extensionDescription = this . _registry . getExtensionDescription ( extensionKey ) ;
1234
+ if ( ! extensionDescription ) {
1235
+ continue ;
1236
+ }
1237
+
1238
+ for ( const activationEvents of ( extensionDescription ?. activationEvents ?? [ ] ) ) {
1239
+ implicitActivationEvents . add ( activationEvents ) ;
1240
+ }
1241
+ extensionDescription . activationEvents = Array . from ( implicitActivationEvents ) ;
1242
+ }
1243
+ }
1244
+
1245
+ private _handleImplicitExtensionActivationEvents ( extensionActivationEventsInfo : IImplicitActivationEvents ) {
1246
+ const extensionKey = ExtensionIdentifier . toKey ( extensionActivationEventsInfo . extensionId ) ;
1247
+
1248
+ if ( ! this . _extensionsImplicitActivationEvents . has ( extensionKey ) ) {
1249
+ this . _extensionsImplicitActivationEvents . set ( extensionKey , new Set ( ) ) ;
1250
+ }
1251
+ const implicitActivationEvents = this . _extensionsImplicitActivationEvents . get ( extensionKey ) ;
1252
+
1253
+ for ( const activationEvent of extensionActivationEventsInfo . implicitActivationEvents ) {
1254
+ implicitActivationEvents ?. add ( activationEvent ) ;
1255
+ }
1256
+ }
1257
+
1227
1258
private _handleExtensionPointMessage ( msg : IMessage ) {
1228
1259
const extensionKey = ExtensionIdentifier . toKey ( msg . extensionId ) ;
1229
1260
@@ -1273,14 +1304,15 @@ export abstract class AbstractExtensionService extends Disposable implements IEx
1273
1304
}
1274
1305
}
1275
1306
1276
- private static _handleExtensionPoint < T extends IExtensionContributions [ keyof IExtensionContributions ] > ( extensionPoint : ExtensionPoint < T > , availableExtensions : IExtensionDescription [ ] , messageHandler : ( msg : IMessage ) => void ) : void {
1307
+ private static _handleExtensionPoint < T extends IExtensionContributions [ keyof IExtensionContributions ] > ( extensionPoint : ExtensionPoint < T > , availableExtensions : IExtensionDescription [ ] , messageHandler : ( msg : IMessage ) => void , implicitActivationEventsHandler : ( info : IImplicitActivationEvents ) => void ) : void {
1277
1308
const users : IExtensionPointUser < T > [ ] = [ ] ;
1278
1309
for ( const desc of availableExtensions ) {
1279
1310
if ( desc . contributes && hasOwnProperty . call ( desc . contributes , extensionPoint . name ) ) {
1280
1311
users . push ( {
1281
1312
description : desc ,
1282
1313
value : desc . contributes [ extensionPoint . name as keyof typeof desc . contributes ] as T ,
1283
- collector : new ExtensionMessageCollector ( messageHandler , desc , extensionPoint . name )
1314
+ collector : new ExtensionMessageCollector ( messageHandler , desc , extensionPoint . name ) ,
1315
+ implicitActivationEventsCollector : new ExtensionActivationEventsCollector ( implicitActivationEventsHandler , desc ) ,
1284
1316
} ) ;
1285
1317
}
1286
1318
}
0 commit comments