mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-25 19:18:59 +01:00
first cut of explict watch, #47475
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user