Skip to content

Commit 27c0793

Browse files
committed
Have a startup flag in the extensions activation times
1 parent 227c103 commit 27c0793

10 files changed

Lines changed: 53 additions & 39 deletions

File tree

src/vs/platform/actions/test/common/menuService.test.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { NullCommandService } from 'vs/platform/commands/common/commands';
1212
import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService';
1313
import { IExtensionPoint } from 'vs/platform/extensions/common/extensionsRegistry';
1414
import { TPromise } from 'vs/base/common/winjs.base';
15-
import { ExtensionPointContribution, IExtensionDescription, IExtensionsStatus, IExtensionService } from 'vs/platform/extensions/common/extensions';
15+
import { ExtensionPointContribution, IExtensionDescription, IExtensionsStatus, IExtensionService, ActivationTimes } from 'vs/platform/extensions/common/extensions';
1616

1717
// --- service instances
1818

@@ -35,7 +35,11 @@ class MockExtensionService implements IExtensionService {
3535
throw new Error('Not implemented');
3636
}
3737

38-
public getExtensionsStatus(): { [id: string]: IExtensionsStatus } {
38+
public getExtensionsStatus(): { [id: string]: IExtensionsStatus; } {
39+
throw new Error('Not implemented');
40+
}
41+
42+
public getExtensionsActivationTimes(): { [id: string]: ActivationTimes; } {
3943
throw new Error('Not implemented');
4044
}
4145

src/vs/platform/commands/test/commandService.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ class SimpleExtensionService implements IExtensionService {
2727
getExtensionsStatus() {
2828
return undefined;
2929
}
30+
getExtensionsActivationTimes() {
31+
return undefined;
32+
}
3033
getExtensions(): TPromise<IExtensionDescription[]> {
3134
return TPromise.wrap([]);
3235
}

src/vs/platform/extensions/common/extensions.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,13 @@ export interface IExtensionsStatus {
4141
}
4242

4343
export class ActivationTimes {
44+
public readonly startup: boolean;
4445
public readonly codeLoadingTime: number;
4546
public readonly activateCallTime: number;
4647
public readonly activateResolvedTime: number;
4748

48-
constructor(codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number) {
49+
constructor(startup: boolean, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number) {
50+
this.startup = startup;
4951
this.codeLoadingTime = codeLoadingTime;
5052
this.activateCallTime = activateCallTime;
5153
this.activateResolvedTime = activateResolvedTime;

src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ export class MainThreadExtensionService implements MainThreadExtensionServiceSha
3030
$localShowMessage(severity: Severity, msg: string): void {
3131
this._extensionService._logOrShowMessage(severity, msg);
3232
}
33-
$onExtensionActivated(extensionId: string, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number): void {
34-
this._extensionService._onExtensionActivated(extensionId, codeLoadingTime, activateCallTime, activateResolvedTime);
33+
$onExtensionActivated(extensionId: string, startup: boolean, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number): void {
34+
this._extensionService._onExtensionActivated(extensionId, startup, codeLoadingTime, activateCallTime, activateResolvedTime);
3535
}
3636
$onExtensionActivationFailed(extensionId: string): void {
3737
}

src/vs/workbench/api/node/extHost.api.impl.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ class Extension<T> implements vscode.Extension<T> {
619619
}
620620

621621
activate(): Thenable<T> {
622-
return this._extensionService.activateById(this.id).then(() => this.exports);
622+
return this._extensionService.activateById(this.id, false).then(() => this.exports);
623623
}
624624
}
625625

src/vs/workbench/api/node/extHost.protocol.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ export interface MainThreadTaskShape extends IDisposable {
306306

307307
export interface MainThreadExtensionServiceShape extends IDisposable {
308308
$localShowMessage(severity: Severity, msg: string): void;
309-
$onExtensionActivated(extensionId: string, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number): void;
309+
$onExtensionActivated(extensionId: string, startup: boolean, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number): void;
310310
$onExtensionActivationFailed(extensionId: string): void;
311311
}
312312

src/vs/workbench/api/node/extHostExtensionActivator.ts

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,15 @@ export interface IExtensionAPI {
4545

4646
export class ExtensionActivationTimes {
4747

48-
public static NONE = new ExtensionActivationTimes(-1, -1, -1);
48+
public static NONE = new ExtensionActivationTimes(false, -1, -1, -1);
4949

50+
public readonly startup: boolean;
5051
public readonly codeLoadingTime: number;
5152
public readonly activateCallTime: number;
5253
public readonly activateResolvedTime: number;
5354

54-
constructor(codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number) {
55+
constructor(startup: boolean, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number) {
56+
this.startup = startup;
5557
this.codeLoadingTime = codeLoadingTime;
5658
this.activateCallTime = activateCallTime;
5759
this.activateResolvedTime = activateResolvedTime;
@@ -60,14 +62,16 @@ export class ExtensionActivationTimes {
6062

6163
export class ExtensionActivationTimesBuilder {
6264

65+
private readonly _startup: boolean;
6366
private _codeLoadingStart: number;
6467
private _codeLoadingStop: number;
6568
private _activateCallStart: number;
6669
private _activateCallStop: number;
6770
private _activateResolveStart: number;
6871
private _activateResolveStop: number;
6972

70-
constructor() {
73+
constructor(startup: boolean) {
74+
this._startup = startup;
7175
this._codeLoadingStart = -1;
7276
this._codeLoadingStop = -1;
7377
this._activateCallStart = -1;
@@ -85,6 +89,7 @@ export class ExtensionActivationTimesBuilder {
8589

8690
public build(): ExtensionActivationTimes {
8791
return new ExtensionActivationTimes(
92+
this._startup,
8893
this._delta(this._codeLoadingStart, this._codeLoadingStop),
8994
this._delta(this._activateCallStart, this._activateCallStop),
9095
this._delta(this._activateResolveStart, this._activateResolveStop)
@@ -154,7 +159,7 @@ export class FailedExtension extends ActivatedExtension {
154159
export interface IExtensionsActivatorHost {
155160
showMessage(severity: Severity, message: string): void;
156161

157-
actualActivateExtension(extensionDescription: IExtensionDescription): TPromise<ActivatedExtension>;
162+
actualActivateExtension(extensionDescription: IExtensionDescription, startup: boolean): TPromise<ActivatedExtension>;
158163
}
159164

160165
export class ExtensionsActivator {
@@ -187,23 +192,23 @@ export class ExtensionsActivator {
187192
return this._activatedExtensions[extensionId];
188193
}
189194

190-
public activateByEvent(activationEvent: string): TPromise<void> {
195+
public activateByEvent(activationEvent: string, startup: boolean): TPromise<void> {
191196
if (this._alreadyActivatedEvents[activationEvent]) {
192197
return NO_OP_VOID_PROMISE;
193198
}
194199
let activateExtensions = this._registry.getExtensionDescriptionsForActivationEvent(activationEvent);
195-
return this._activateExtensions(activateExtensions, 0).then(() => {
200+
return this._activateExtensions(activateExtensions, startup, 0).then(() => {
196201
this._alreadyActivatedEvents[activationEvent] = true;
197202
});
198203
}
199204

200-
public activateById(extensionId: string): TPromise<void> {
205+
public activateById(extensionId: string, startup: boolean): TPromise<void> {
201206
let desc = this._registry.getExtensionDescription(extensionId);
202207
if (!desc) {
203208
throw new Error('Extension `' + extensionId + '` is not known');
204209
}
205210

206-
return this._activateExtensions([desc], 0);
211+
return this._activateExtensions([desc], startup, 0);
207212
}
208213

209214
/**
@@ -247,7 +252,7 @@ export class ExtensionsActivator {
247252
}
248253
}
249254

250-
private _activateExtensions(extensionDescriptions: IExtensionDescription[], recursionLevel: number): TPromise<void> {
255+
private _activateExtensions(extensionDescriptions: IExtensionDescription[], startup: boolean, recursionLevel: number): TPromise<void> {
251256
// console.log(recursionLevel, '_activateExtensions: ', extensionDescriptions.map(p => p.id));
252257
if (extensionDescriptions.length === 0) {
253258
return TPromise.as(void 0);
@@ -289,15 +294,15 @@ export class ExtensionsActivator {
289294

290295
if (red.length === 0) {
291296
// Finally reached only leafs!
292-
return TPromise.join(green.map((p) => this._activateExtension(p))).then(_ => void 0);
297+
return TPromise.join(green.map((p) => this._activateExtension(p, startup))).then(_ => void 0);
293298
}
294299

295-
return this._activateExtensions(green, recursionLevel + 1).then(_ => {
296-
return this._activateExtensions(red, recursionLevel + 1);
300+
return this._activateExtensions(green, startup, recursionLevel + 1).then(_ => {
301+
return this._activateExtensions(red, startup, recursionLevel + 1);
297302
});
298303
}
299304

300-
private _activateExtension(extensionDescription: IExtensionDescription): TPromise<void> {
305+
private _activateExtension(extensionDescription: IExtensionDescription, startup: boolean): TPromise<void> {
301306
if (hasOwnProperty.call(this._activatedExtensions, extensionDescription.id)) {
302307
return TPromise.as(void 0);
303308
}
@@ -306,7 +311,7 @@ export class ExtensionsActivator {
306311
return this._activatingExtensions[extensionDescription.id];
307312
}
308313

309-
this._activatingExtensions[extensionDescription.id] = this._host.actualActivateExtension(extensionDescription).then(null, (err) => {
314+
this._activatingExtensions[extensionDescription.id] = this._host.actualActivateExtension(extensionDescription, startup).then(null, (err) => {
310315
this._host.showMessage(Severity.Error, nls.localize('activationError', "Activating extension `{0}` failed: {1}.", extensionDescription.id, err.message));
311316
console.error('Activating extension `' + extensionDescription.id + '` failed: ', err.message);
312317
console.log('Here is the error stack: ', err.stack);

src/vs/workbench/api/node/extHostExtensionService.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
151151
}
152152
},
153153

154-
actualActivateExtension: (extensionDescription: IExtensionDescription): TPromise<ActivatedExtension> => {
155-
return this._activateExtension(extensionDescription);
154+
actualActivateExtension: (extensionDescription: IExtensionDescription, startup: boolean): TPromise<ActivatedExtension> => {
155+
return this._activateExtension(extensionDescription, startup);
156156
}
157157
});
158158

@@ -171,19 +171,19 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
171171
return false;
172172
}
173173

174-
public activateByEvent(activationEvent: string): TPromise<void> {
174+
public activateByEvent(activationEvent: string, startup: boolean): TPromise<void> {
175175
if (this._barrier.isOpen()) {
176-
return this._activator.activateByEvent(activationEvent);
176+
return this._activator.activateByEvent(activationEvent, startup);
177177
} else {
178-
return this._barrier.wait().then(() => this._activator.activateByEvent(activationEvent));
178+
return this._barrier.wait().then(() => this._activator.activateByEvent(activationEvent, startup));
179179
}
180180
}
181181

182-
public activateById(extensionId: string): TPromise<void> {
182+
public activateById(extensionId: string, startup: boolean): TPromise<void> {
183183
if (this._barrier.isOpen()) {
184-
return this._activator.activateById(extensionId);
184+
return this._activator.activateById(extensionId, startup);
185185
} else {
186-
return this._barrier.wait().then(() => this._activator.activateById(extensionId));
186+
return this._barrier.wait().then(() => this._activator.activateById(extensionId, startup));
187187
}
188188
}
189189

@@ -268,26 +268,26 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
268268

269269
// --- impl
270270

271-
private _activateExtension(extensionDescription: IExtensionDescription): TPromise<ActivatedExtension> {
272-
return this._doActivateExtension(extensionDescription).then((activatedExtension) => {
271+
private _activateExtension(extensionDescription: IExtensionDescription, startup: boolean): TPromise<ActivatedExtension> {
272+
return this._doActivateExtension(extensionDescription, startup).then((activatedExtension) => {
273273
const activationTimes = activatedExtension.activationTimes;
274-
this._proxy.$onExtensionActivated(extensionDescription.id, activationTimes.codeLoadingTime, activationTimes.activateCallTime, activationTimes.activateResolvedTime);
274+
this._proxy.$onExtensionActivated(extensionDescription.id, activationTimes.startup, activationTimes.codeLoadingTime, activationTimes.activateCallTime, activationTimes.activateResolvedTime);
275275
return activatedExtension;
276276
}, (err) => {
277277
this._proxy.$onExtensionActivationFailed(extensionDescription.id);
278278
throw err;
279279
});
280280
}
281281

282-
private _doActivateExtension(extensionDescription: IExtensionDescription): TPromise<ActivatedExtension> {
282+
private _doActivateExtension(extensionDescription: IExtensionDescription, startup: boolean): TPromise<ActivatedExtension> {
283283
let event = getTelemetryActivationEvent(extensionDescription);
284284
this._mainThreadTelemetry.$publicLog('activatePlugin', event);
285285
if (!extensionDescription.main) {
286286
// Treat the extension as being empty => NOT AN ERROR CASE
287287
return TPromise.as(new EmptyExtension(ExtensionActivationTimes.NONE));
288288
}
289289

290-
const activationTimesBuilder = new ExtensionActivationTimesBuilder();
290+
const activationTimesBuilder = new ExtensionActivationTimesBuilder(startup);
291291
return TPromise.join<any>([
292292
loadCommonJSModule(extensionDescription.main, activationTimesBuilder),
293293
this._loadExtensionContext(extensionDescription)
@@ -362,7 +362,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
362362
// -- called by main thread
363363

364364
public $activateByEvent(activationEvent: string): TPromise<void> {
365-
return this.activateByEvent(activationEvent);
365+
return this.activateByEvent(activationEvent, false);
366366
}
367367
}
368368

src/vs/workbench/node/extensionHostMain.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ export class ExtensionHostMain {
115115

116116
// Handle "eager" activation extensions
117117
private handleEagerExtensions(): TPromise<void> {
118-
this._extensionService.activateByEvent('*').then(null, (err) => {
118+
this._extensionService.activateByEvent('*', true).then(null, (err) => {
119119
console.error(err);
120120
});
121121
return this.handleWorkspaceContainsEagerExtensions();
@@ -181,7 +181,7 @@ export class ExtensionHostMain {
181181
.forEach(p => {
182182
const activationEvent = `workspaceContains:${p}`;
183183

184-
this._extensionService.activateByEvent(activationEvent)
184+
this._extensionService.activateByEvent(activationEvent, true)
185185
.done(null, err => console.error(err));
186186
});
187187
});

src/vs/workbench/services/extensions/electron-browser/extensionService.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -419,8 +419,8 @@ export class ExtensionService implements IExtensionService {
419419
}
420420
}
421421

422-
public _onExtensionActivated(extensionId: string, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number): void {
423-
this._extensionHostProcessActivationTimes[extensionId] = new ActivationTimes(codeLoadingTime, activateCallTime, activateResolvedTime);
422+
public _onExtensionActivated(extensionId: string, startup: boolean, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number): void {
423+
this._extensionHostProcessActivationTimes[extensionId] = new ActivationTimes(startup, codeLoadingTime, activateCallTime, activateResolvedTime);
424424
}
425425
}
426426

0 commit comments

Comments
 (0)