first cut of explict watch, #47475

This commit is contained in:
Johannes Rieken
2018-04-18 12:01:52 +02:00
parent c72b5532e2
commit 034b377306
7 changed files with 177 additions and 38 deletions

View File

@@ -42,7 +42,7 @@ import { ITreeItem } from 'vs/workbench/common/views';
import { ThemeColor } from 'vs/platform/theme/common/themeService';
import { IDisposable } from 'vs/base/common/lifecycle';
import { SerializedError } from 'vs/base/common/errors';
import { IStat, FileChangeType, FileOpenFlags } from 'vs/platform/files/common/files';
import { IStat, FileChangeType, FileOpenFlags, IWatchOptions } from 'vs/platform/files/common/files';
import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry';
import { CommentRule, CharacterPair, EnterAction } from 'vs/editor/common/modes/languageConfiguration';
import { ISingleEditOperation } from 'vs/editor/common/model';
@@ -569,15 +569,14 @@ export interface ExtHostWorkspaceShape {
export interface ExtHostFileSystemShape {
$stat(handle: number, resource: UriComponents): TPromise<IStat>;
$readFile(handle: number, resource: UriComponents, flags: FileOpenFlags): TPromise<string>;
$writeFile(handle: number, resource: UriComponents, base64Encoded: string, flags: FileOpenFlags): TPromise<void>;
$rename(handle: number, resource: UriComponents, target: UriComponents, flags: FileOpenFlags): TPromise<IStat>;
$mkdir(handle: number, resource: UriComponents): TPromise<IStat>;
$readdir(handle: number, resource: UriComponents): TPromise<[string, IStat][]>;
$delete(handle: number, resource: UriComponents): TPromise<void>;
$watch(handle: number, session: number, resource: UriComponents, opts: IWatchOptions): void;
$unwatch(handle: number, session: number): void;
}
export interface ExtHostSearchShape {

View File

@@ -58,18 +58,24 @@ class FsLinkProvider implements vscode.DocumentLinkProvider {
class FileSystemProviderShim implements vscode.FileSystemProvider2 {
_version: 6;
_version: 7 = 7;
onDidChange: vscode.Event<vscode.FileChange2[]>;
onDidChangeFile: vscode.Event<vscode.FileChange2[]>;
constructor(private readonly _delegate: vscode.FileSystemProvider) {
if (!this._delegate.onDidChange) {
this.onDidChange = Event.None;
this.onDidChangeFile = Event.None;
} else {
this.onDidChange = mapEvent(this._delegate.onDidChange, old => old.map(FileSystemProviderShim._modernizeFileChange));
this.onDidChangeFile = mapEvent(this._delegate.onDidChange, old => old.map(FileSystemProviderShim._modernizeFileChange));
}
}
watch(uri: vscode.Uri, options: {}): vscode.Disposable {
// does nothing because in the old API there was no notion of
// watch and provider decide what file events to generate...
return { dispose() { } };
}
stat(resource: vscode.Uri): Thenable<vscode.FileStat2> {
return this._delegate.stat(resource).then(stat => FileSystemProviderShim._modernizeFileStat(stat));
}
@@ -157,6 +163,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape {
private readonly _proxy: MainThreadFileSystemShape;
private readonly _fsProvider = new Map<number, vscode.FileSystemProvider2>();
private readonly _linkProvider = new FsLinkProvider();
private readonly _watches = new Map<number, IDisposable>();
private _handlePool: number = 0;
@@ -170,12 +177,12 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape {
}
registerFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider, newProvider: vscode.FileSystemProvider2) {
if (newProvider && newProvider._version === 6) {
if (newProvider && newProvider._version === 7) {
return this._doRegisterFileSystemProvider(scheme, newProvider);
} else if (provider) {
return this._doRegisterFileSystemProvider(scheme, new FileSystemProviderShim(provider));
} else {
throw new Error('IGNORED both provider');
throw new Error('FAILED to register file system provider, the new provider does not meet the version-constraint and there is no fallback, old provider');
}
}
@@ -185,8 +192,8 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape {
this._fsProvider.set(handle, provider);
this._proxy.$registerFileSystemProvider(handle, scheme);
let reg: IDisposable;
if (provider.onDidChange) {
reg = provider.onDidChange(event => {
if (provider.onDidChangeFile) {
reg = provider.onDidChangeFile(event => {
let newEvent = event.map(e => {
let { uri: resource, type } = e;
let newType: files.FileChangeType;
@@ -243,4 +250,17 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape {
$mkdir(handle: number, resource: UriComponents): TPromise<files.IStat, any> {
return asWinJsPromise(token => this._fsProvider.get(handle).createDirectory(URI.revive(resource), token));
}
$watch(handle: number, session: number, resource: UriComponents, opts: files.IWatchOptions): void {
asWinJsPromise(token => {
let subscription = this._fsProvider.get(handle).watch(URI.revive(resource), opts);
this._watches.set(session, subscription);
});
}
$unwatch(handle: number, session: number): void {
let subscription = this._watches.get(session);
if (subscription) {
subscription.dispose();
this._watches.delete(session);
}
}
}