提交 34d245ed 编写于 作者: S Sandeep Somavarapu

trigger workspace contains activation event on new folders

上级 2f0700ce
...@@ -179,10 +179,9 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { ...@@ -179,10 +179,9 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape {
return search; return search;
} }
$checkExists(includes: string[], token: CancellationToken): Promise<boolean> { $checkExists(folders: UriComponents[], includes: string[], token: CancellationToken): Promise<boolean> {
const queryBuilder = this._instantiationService.createInstance(QueryBuilder); const queryBuilder = this._instantiationService.createInstance(QueryBuilder);
const folders = this._contextService.getWorkspace().folders.map(folder => folder.uri); const query = queryBuilder.file(folders.map(folder => URI.revive(folder)), {
const query = queryBuilder.file(folders, {
_reason: 'checkExists', _reason: 'checkExists',
includePattern: includes.join(', '), includePattern: includes.join(', '),
expandPatterns: true, expandPatterns: true,
......
...@@ -578,7 +578,7 @@ export interface ITextSearchComplete { ...@@ -578,7 +578,7 @@ export interface ITextSearchComplete {
export interface MainThreadWorkspaceShape extends IDisposable { export interface MainThreadWorkspaceShape extends IDisposable {
$startFileSearch(includePattern: string | undefined, includeFolder: UriComponents | undefined, excludePatternOrDisregardExcludes: string | false | undefined, maxResults: number | undefined, token: CancellationToken): Promise<UriComponents[] | undefined>; $startFileSearch(includePattern: string | undefined, includeFolder: UriComponents | undefined, excludePatternOrDisregardExcludes: string | false | undefined, maxResults: number | undefined, token: CancellationToken): Promise<UriComponents[] | undefined>;
$startTextSearch(query: search.IPatternInfo, options: ITextQueryBuilderOptions, requestId: number, token: CancellationToken): Promise<ITextSearchComplete>; $startTextSearch(query: search.IPatternInfo, options: ITextQueryBuilderOptions, requestId: number, token: CancellationToken): Promise<ITextSearchComplete>;
$checkExists(includes: string[], token: CancellationToken): Promise<boolean>; $checkExists(folders: UriComponents[], includes: string[], token: CancellationToken): Promise<boolean>;
$saveAll(includeUntitled?: boolean): Promise<boolean>; $saveAll(includeUntitled?: boolean): Promise<boolean>;
$updateWorkspaceFolders(extensionName: string, index: number, deleteCount: number, workspaceFoldersToAdd: { uri: UriComponents, name?: string }[]): Promise<void>; $updateWorkspaceFolders(extensionName: string, index: number, deleteCount: number, workspaceFoldersToAdd: { uri: UriComponents, name?: string }[]): Promise<void>;
$resolveProxy(url: string): Promise<string | undefined>; $resolveProxy(url: string): Promise<string | undefined>;
......
...@@ -7,7 +7,7 @@ import * as nls from 'vs/nls'; ...@@ -7,7 +7,7 @@ import * as nls from 'vs/nls';
import * as path from 'vs/base/common/path'; import * as path from 'vs/base/common/path';
import { originalFSPath } from 'vs/base/common/resources'; import { originalFSPath } from 'vs/base/common/resources';
import { Barrier } from 'vs/base/common/async'; import { Barrier } from 'vs/base/common/async';
import { dispose, toDisposable } from 'vs/base/common/lifecycle'; import { dispose, toDisposable, DisposableStore } from 'vs/base/common/lifecycle';
import { TernarySearchTree } from 'vs/base/common/map'; import { TernarySearchTree } from 'vs/base/common/map';
import { URI } from 'vs/base/common/uri'; import { URI } from 'vs/base/common/uri';
import { ILogService } from 'vs/platform/log/common/log'; import { ILogService } from 'vs/platform/log/common/log';
...@@ -26,7 +26,6 @@ import { CancellationTokenSource } from 'vs/base/common/cancellation'; ...@@ -26,7 +26,6 @@ import { CancellationTokenSource } from 'vs/base/common/cancellation';
import * as errors from 'vs/base/common/errors'; import * as errors from 'vs/base/common/errors';
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions';
import { IWorkspace } from 'vs/platform/workspace/common/workspace';
import { Schemas } from 'vs/base/common/network'; import { Schemas } from 'vs/base/common/network';
import { withNullAsUndefined } from 'vs/base/common/types'; import { withNullAsUndefined } from 'vs/base/common/types';
import { VSBuffer } from 'vs/base/common/buffer'; import { VSBuffer } from 'vs/base/common/buffer';
...@@ -81,6 +80,8 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { ...@@ -81,6 +80,8 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
private _started: boolean; private _started: boolean;
private readonly _disposables: DisposableStore;
constructor( constructor(
hostUtils: IHostUtils, hostUtils: IHostUtils,
initData: IInitData, initData: IInitData,
...@@ -98,6 +99,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { ...@@ -98,6 +99,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
this._extHostConfiguration = extHostConfiguration; this._extHostConfiguration = extHostConfiguration;
this._environment = environment; this._environment = environment;
this._extHostLogService = extHostLogService; this._extHostLogService = extHostLogService;
this._disposables = new DisposableStore();
this._mainThreadWorkspaceProxy = this._extHostContext.getProxy(MainContext.MainThreadWorkspace); this._mainThreadWorkspaceProxy = this._extHostContext.getProxy(MainContext.MainThreadWorkspace);
this._mainThreadTelemetryProxy = this._extHostContext.getProxy(MainContext.MainThreadTelemetry); this._mainThreadTelemetryProxy = this._extHostContext.getProxy(MainContext.MainThreadTelemetry);
...@@ -414,27 +416,32 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { ...@@ -414,27 +416,32 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
console.error(err); console.error(err);
}); });
return this._handleWorkspaceContainsEagerExtensions(this._extHostWorkspace.workspace); this._extHostWorkspace.onDidChangeWorkspace(({ added }) => this._handleWorkspaceContainsEagerExtensions(added), this, this._disposables);
const folders = this._extHostWorkspace.workspace ? this._extHostWorkspace.workspace.folders : [];
return this._handleWorkspaceContainsEagerExtensions(folders);
} }
private _handleWorkspaceContainsEagerExtensions(workspace: IWorkspace | undefined): Promise<void> { private _handleWorkspaceContainsEagerExtensions(folders: ReadonlyArray<vscode.WorkspaceFolder>): Promise<void> {
if (!workspace || workspace.folders.length === 0) { if (folders.length === 0) {
return Promise.resolve(undefined); return Promise.resolve(undefined);
} }
return Promise.all( return Promise.all(
this._registry.getAllExtensionDescriptions().map((desc) => { this._registry.getAllExtensionDescriptions().map((desc) => {
return this._handleWorkspaceContainsEagerExtension(workspace, desc); return this._handleWorkspaceContainsEagerExtension(folders, desc);
}) })
).then(() => { }); ).then(() => { });
} }
private _handleWorkspaceContainsEagerExtension(workspace: IWorkspace, desc: IExtensionDescription): Promise<void> { private _handleWorkspaceContainsEagerExtension(folders: ReadonlyArray<vscode.WorkspaceFolder>, desc: IExtensionDescription): Promise<void> {
const activationEvents = desc.activationEvents; const activationEvents = desc.activationEvents;
if (!activationEvents) { if (!activationEvents) {
return Promise.resolve(undefined); return Promise.resolve(undefined);
} }
if (this.isActivated(desc.identifier)) {
return Promise.resolve(undefined);
}
const fileNames: string[] = []; const fileNames: string[] = [];
const globPatterns: string[] = []; const globPatterns: string[] = [];
...@@ -453,16 +460,16 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { ...@@ -453,16 +460,16 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
return Promise.resolve(undefined); return Promise.resolve(undefined);
} }
const fileNamePromise = Promise.all(fileNames.map((fileName) => this._activateIfFileName(workspace, desc.identifier, fileName))).then(() => { }); const fileNamePromise = Promise.all(fileNames.map((fileName) => this._activateIfFileName(folders, desc.identifier, fileName))).then(() => { });
const globPatternPromise = this._activateIfGlobPatterns(desc.identifier, globPatterns); const globPatternPromise = this._activateIfGlobPatterns(desc.identifier, folders, globPatterns);
return Promise.all([fileNamePromise, globPatternPromise]).then(() => { }); return Promise.all([fileNamePromise, globPatternPromise]).then(() => { });
} }
private async _activateIfFileName(workspace: IWorkspace, extensionId: ExtensionIdentifier, fileName: string): Promise<void> { private async _activateIfFileName(folders: ReadonlyArray<vscode.WorkspaceFolder>, extensionId: ExtensionIdentifier, fileName: string): Promise<void> {
// find exact path // find exact path
for (const { uri } of workspace.folders) { for (const { uri } of folders) {
if (await this._hostUtils.exists(path.join(URI.revive(uri).fsPath, fileName))) { if (await this._hostUtils.exists(path.join(URI.revive(uri).fsPath, fileName))) {
// the file was found // the file was found
return ( return (
...@@ -475,7 +482,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { ...@@ -475,7 +482,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
return undefined; return undefined;
} }
private async _activateIfGlobPatterns(extensionId: ExtensionIdentifier, globPatterns: string[]): Promise<void> { private async _activateIfGlobPatterns(extensionId: ExtensionIdentifier, folders: ReadonlyArray<vscode.WorkspaceFolder>, globPatterns: string[]): Promise<void> {
this._extHostLogService.trace(`extensionHostMain#activateIfGlobPatterns: fileSearch, extension: ${extensionId.value}, entryPoint: workspaceContains`); this._extHostLogService.trace(`extensionHostMain#activateIfGlobPatterns: fileSearch, extension: ${extensionId.value}, entryPoint: workspaceContains`);
if (globPatterns.length === 0) { if (globPatterns.length === 0) {
...@@ -483,7 +490,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { ...@@ -483,7 +490,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
} }
const tokenSource = new CancellationTokenSource(); const tokenSource = new CancellationTokenSource();
const searchP = this._mainThreadWorkspaceProxy.$checkExists(globPatterns, tokenSource.token); const searchP = this._mainThreadWorkspaceProxy.$checkExists(folders.map(folder => folder.uri), globPatterns, tokenSource.token);
const timer = setTimeout(async () => { const timer = setTimeout(async () => {
tokenSource.cancel(); tokenSource.cancel();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册