move find-file logic into fsprovider, wire things up end to end

This commit is contained in:
Johannes Rieken
2017-08-17 12:36:30 +02:00
parent af195c9638
commit 52f98f46ef
5 changed files with 69 additions and 73 deletions

View File

@@ -6,7 +6,7 @@
import { isPromiseCanceledError } from 'vs/base/common/errors';
import URI from 'vs/base/common/uri';
import { ISearchService, QueryType, ISearchQuery } from 'vs/platform/search/common/search';
import { ISearchService, QueryType, ISearchQuery, ISearchProgressItem, ISearchComplete } from 'vs/platform/search/common/search';
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
@@ -16,8 +16,8 @@ import { TPromise, PPromise } from 'vs/base/common/winjs.base';
import { MainThreadWorkspaceShape, ExtHostWorkspaceShape, ExtHostContext, MainContext, IExtHostContext } from '../node/extHost.protocol';
import { ITextModelService } from 'vs/editor/common/services/resolverService';
import { IFileService } from 'vs/platform/files/common/files';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { RemoteFileService, IRemoteFileSystemProvider } from 'vs/workbench/services/files/electron-browser/remoteFileService';
import { IDisposable, dispose, combinedDisposable } from 'vs/base/common/lifecycle';
import { RemoteFileService } from 'vs/workbench/services/files/electron-browser/remoteFileService';
import { Emitter } from 'vs/base/common/event';
import { extHostNamedCustomer } from "vs/workbench/api/electron-browser/extHostCustomers";
@@ -101,53 +101,6 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape {
// --- save & edit resources ---
private readonly _searchProvider = new Map<number, IDisposable>();
private readonly _searchSession = new Map<number, { resolve: Function, reject: Function, progress: Function }>();
private _searchSessionIdPool: number = 0;
$registerSearchProvider(handle: number, type: number): void {
this._searchProvider.set(handle, this._searchService.registerSearchResultProvider({
search: (query) => {
if (query.type !== type) {
return null;
}
const session = ++this._searchSessionIdPool;
return new PPromise<any, any>((resolve, reject, progress) => {
this._searchSession.set(session, { resolve, reject, progress });
this._proxy.$startSearch(handle, session, query);
}, () => {
this._proxy.$cancelSearch(handle, session);
});
}
}));
}
$unregisterSearchProvider(handle: number): void {
const registration = this._searchProvider.get(handle);
if (registration) {
registration.dispose();
this._searchProvider.delete(handle);
}
}
$updateSearchSession(session: number, data): void {
if (this._searchSession.has(session)) {
this._searchSession.get(session).progress(data);
}
}
$finishSearchSession(session: number, err?: any): void {
if (this._searchSession.has(session)) {
const { resolve, reject } = this._searchSession.get(session);
this._searchSession.delete(session);
if (err) {
reject(err);
} else {
resolve();
}
}
}
$saveAll(includeUntitled?: boolean): Thenable<boolean> {
return this._textFileService.saveAll(includeUntitled).then(result => {
return result.results.every(each => each.success === true);
@@ -171,7 +124,9 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape {
// --- EXPERIMENT: workspace provider
private _provider = new Map<number, [IRemoteFileSystemProvider, Emitter<URI>]>();
private _idPool: number = 0;
private readonly _provider = new Map<number, [IDisposable, Emitter<URI>]>();
private readonly _searchSessions = new Map<number, { resolve: (result: ISearchComplete) => void, reject: Function, progress: (item: ISearchProgressItem) => void, matches: URI[] }>();
$registerFileSystemProvider(handle: number, authority: string): void {
if (!(this._fileService instanceof RemoteFileService)) {
@@ -187,13 +142,60 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape {
return this._proxy.$storeFile(handle, resource, value);
}
};
this._provider.set(handle, [provider, emitter]);
this._fileService.registerProvider(authority, provider);
const searchProvider = {
search: (query) => {
if (query.type !== QueryType.File) {
return undefined;
}
const session = ++this._idPool;
return new PPromise<any, any>((resolve, reject, progress) => {
this._searchSessions.set(session, { resolve, reject, progress, matches: [] });
this._proxy.$startSearch(handle, session, query.filePattern);
}, () => {
this._proxy.$cancelSearch(handle, session);
});
}
};
const registrations = combinedDisposable([
this._fileService.registerProvider(authority, provider),
this._searchService.registerSearchResultProvider(searchProvider),
]);
this._provider.set(handle, [registrations, emitter]);
}
$unregisterFileSystemProvider(handle: number): void {
if (this._provider.has(handle)) {
dispose(this._provider.get(handle)[0]);
this._provider.delete(handle);
}
}
$onFileSystemChange(handle: number, resource: URI) {
const [, emitter] = this._provider.get(handle);
emitter.fire(resource);
};
$updateSearchSession(session: number, data: URI): void {
if (this._searchSessions.has(session)) {
this._searchSessions.get(session).progress({ resource: data });
this._searchSessions.get(session).matches.push(data);
}
}
$finishSearchSession(session: number, err?: any): void {
if (this._searchSessions.has(session)) {
const { matches, resolve, reject } = this._searchSessions.get(session);
this._searchSessions.delete(session);
if (err) {
reject(err);
} else {
resolve({
limitHit: false,
stats: undefined,
results: matches.map(resource => ({ resource }))
});
}
}
}
}