From b0ede6c91bd6786c8589f062310a2dec9222fa48 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 20 Apr 2018 09:45:41 +0200 Subject: [PATCH] allow file system providers to express that they are case-sensitive --- src/vs/platform/files/common/files.ts | 8 +++++--- src/vs/vscode.proposed.d.ts | 5 +++-- src/vs/workbench/api/node/extHost.api.impl.ts | 3 +++ src/vs/workbench/api/node/extHostFileSystem.ts | 15 +++++++++------ 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 57e66accfa5c2..1841a20af7ec6 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -175,9 +175,11 @@ export interface IWatchOptions { } export enum FileSystemProviderCapabilities { - FileReadWrite = 0b1, - FileOpenReadWriteClose = 0b10, - FileFolderCopy = 0b100 + FileReadWrite = 1 << 1, + FileOpenReadWriteClose = 1 << 2, + FileFolderCopy = 1 << 3, + + PathCaseSensitive = 1 << 10 } export interface IFileSystemProvider { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 3420fc070a6d5..e38fba7ff9a61 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -92,6 +92,7 @@ declare module 'vscode' { export namespace workspace { export function registerDeprecatedFileSystemProvider(scheme: string, provider: DeprecatedFileSystemProvider): Disposable; + export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, newProvider?: FileSystemProvider2): Disposable; } //#endregion @@ -146,7 +147,7 @@ declare module 'vscode' { */ export interface FileSystemProvider2 { - _version: 8; + _version: 9; /** * An event to signal that a resource has been created, changed, or deleted. This @@ -237,7 +238,7 @@ declare module 'vscode' { } export namespace workspace { - export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, newProvider?: FileSystemProvider2): Disposable; + export function registerFileSystemProvider2(scheme: string, provider: FileSystemProvider2, options: { isCaseSensitive?: boolean }): Disposable; } //#endregion diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 0d4cec6a261e4..30019fca14a98 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -546,6 +546,9 @@ export function createApiFactory( registerFileSystemProvider: proposedApiFunction(extension, (scheme, provider, newProvider?) => { return extHostFileSystem.registerFileSystemProvider(scheme, provider, newProvider); }), + registerFileSystemProvider2: proposedApiFunction(extension, (scheme, provider, options) => { + return extHostFileSystem.registerFileSystemProvider2(scheme, provider, options); + }), registerDeprecatedFileSystemProvider: proposedApiFunction(extension, (scheme, provider) => { return extHostFileSystem.registerDeprecatedFileSystemProvider(scheme, provider); }), diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 18b53fc96875e..282c72ba611fa 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -59,7 +59,7 @@ class FsLinkProvider implements vscode.DocumentLinkProvider { class FileSystemProviderShim implements vscode.FileSystemProvider2 { - _version: 8 = 8; + _version: 9 = 9; onDidChangeFile: vscode.Event; @@ -185,20 +185,20 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } registerDeprecatedFileSystemProvider(scheme: string, provider: vscode.DeprecatedFileSystemProvider) { - return this._doRegisterFileSystemProvider(scheme, new FileSystemProviderShim(provider)); + return this.registerFileSystemProvider2(scheme, new FileSystemProviderShim(provider), { isCaseSensitive: false }); } registerFileSystemProvider(scheme: string, provider: vscode.DeprecatedFileSystemProvider, newProvider: vscode.FileSystemProvider2) { - if (newProvider && newProvider._version === 8) { - return this._doRegisterFileSystemProvider(scheme, newProvider); + if (newProvider && newProvider._version === 9) { + return this.registerFileSystemProvider2(scheme, newProvider, { isCaseSensitive: false }); } else if (provider) { - return this._doRegisterFileSystemProvider(scheme, new FileSystemProviderShim(provider)); + return this.registerFileSystemProvider2(scheme, new FileSystemProviderShim(provider), { isCaseSensitive: false }); } else { throw new Error('FAILED to register file system provider, the new provider does not meet the version-constraint and there is no old provider'); } } - private _doRegisterFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider2) { + registerFileSystemProvider2(scheme: string, provider: vscode.FileSystemProvider2, options: { isCaseSensitive?: boolean }) { if (this._usedSchemes.has(scheme)) { throw new Error(`a provider for the scheme '${scheme}' is already registered`); @@ -210,6 +210,9 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { this._fsProvider.set(handle, provider); let capabilites = files.FileSystemProviderCapabilities.FileReadWrite; + if (options.isCaseSensitive) { + capabilites += files.FileSystemProviderCapabilities.PathCaseSensitive; + } if (typeof provider.copy === 'function') { capabilites += files.FileSystemProviderCapabilities.FileFolderCopy; }