diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index e9f5c6e78d64397cb574395a7745e99005c9c94f..256d1e8e8992da85d7f0784e46a98da75ea9b96b 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -185,9 +185,9 @@ export interface FileOptions { } export interface IStat { - isFile: boolean; - isDirectory: boolean; - isSymbolicLink: boolean; + isFile?: boolean; + isDirectory?: boolean; + isSymbolicLink?: boolean; mtime: number; size: number; } diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index d385d7cb0755e9cea82736dec72ee526aefc7232..4015a72c944a4b43a5d09c05404019219638df29 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -13,86 +13,40 @@ declare module 'vscode' { //#region Joh: file system provider (OLD) - export enum FileChangeType { + export enum DeprecatedFileChangeType { Updated = 0, Added = 1, Deleted = 2 } - - export interface FileChange { - type: FileChangeType; + export interface DeprecatedFileChange { + type: DeprecatedFileChangeType; resource: Uri; } - - export enum FileType { + export enum DeprecatedFileType { File = 0, Dir = 1, Symlink = 2 } - - export interface FileStat { + export interface DeprecatedFileStat { id: number | string; mtime: number; - // atime: number; size: number; - type: FileType; + type: DeprecatedFileType; } - - // todo@joh discover files etc - // todo@joh CancellationToken everywhere - // todo@joh add open/close calls? - export interface FileSystemProvider { - - readonly onDidChange?: Event; - - // more... - // @deprecated - will go away - utimes(resource: Uri, mtime: number, atime: number): Thenable; - - stat(resource: Uri): Thenable; - + export interface DeprecatedFileSystemProvider { + readonly onDidChange?: Event; + utimes(resource: Uri, mtime: number, atime: number): Thenable; + stat(resource: Uri): Thenable; read(resource: Uri, offset: number, length: number, progress: Progress): Thenable; - - // todo@joh - have an option to create iff not exist - // todo@remote - // offset - byte offset to start - // count - number of bytes to write - // Thenable - number of bytes actually written write(resource: Uri, content: Uint8Array): Thenable; - - // todo@remote - // Thenable - move(resource: Uri, target: Uri): Thenable; - - // todo@remote - // helps with performance bigly - // copy?(from: Uri, to: Uri): Thenable; - - // todo@remote - // Thenable - mkdir(resource: Uri): Thenable; - - readdir(resource: Uri): Thenable<[Uri, FileStat][]>; - - // todo@remote - // ? merge both - // ? recursive del + move(resource: Uri, target: Uri): Thenable; + mkdir(resource: Uri): Thenable; + readdir(resource: Uri): Thenable<[Uri, DeprecatedFileStat][]>; rmdir(resource: Uri): Thenable; unlink(resource: Uri): Thenable; - - // todo@remote - // create(resource: Uri): Thenable; } - - export type DeprecatedFileChangeType = FileChangeType; - export type DeprecatedFileType = FileType; - export type DeprecatedFileChange = FileChange; - export type DeprecatedFileStat = FileStat; - export type DeprecatedFileSystemProvider = FileSystemProvider; - export namespace workspace { export function registerDeprecatedFileSystemProvider(scheme: string, provider: DeprecatedFileSystemProvider): Disposable; - export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, newProvider?: FileSystemProvider2): Disposable; } //#endregion @@ -103,7 +57,7 @@ declare module 'vscode' { * A type that filesystem providers should use to signal errors. * * This class has factory methods for common error-cases, like `EntryNotFound` when - * a file or folder doesn't exist. Use them like so `throw vscode.FileSystemError.EntryNotFound(uri);` + * a file or folder doesn't exist, use them like so: `throw vscode.FileSystemError.EntryNotFound(someUri);` */ export class FileSystemError extends Error { @@ -140,9 +94,24 @@ declare module 'vscode' { constructor(messageOrUri?: string | Uri); } - export enum FileChangeType2 { + /** + * Enumeration of file change types. + */ + export enum FileChangeType { + + /** + * The contents or metadata of a file have changed. + */ Changed = 1, + + /** + * A file has been created. + */ Created = 2, + + /** + * A file has been deleted. + */ Deleted = 3, } @@ -152,9 +121,9 @@ declare module 'vscode' { export interface FileChangeEvent { /** - * + * The type of change. */ - type: FileChangeType2; + type: FileChangeType; /** * The uri of the file that has changed. @@ -165,21 +134,21 @@ declare module 'vscode' { /** * The `FileStat`-type represents metadata about a file. */ - export interface FileStat2 { + export interface FileStat { /** * The file is a regular file. */ - isFile: boolean; + isFile?: boolean; /** * The file is a directory. */ - isDirectory: boolean; + isDirectory?: boolean; /** * The file is symbolic link to another file. */ - isSymbolicLink: boolean; + isSymbolicLink?: boolean; /** * The modification timestamp in milliseconds. @@ -226,9 +195,7 @@ declare module 'vscode' { * -use posix-path-math * -etc... */ - export interface FileSystemProvider2 { - - _version: 9; + export interface FileSystemProvider { /** * An event to signal that a resource has been created, changed, or deleted. This @@ -252,7 +219,7 @@ declare module 'vscode' { * @param token A cancellation token. * @return The file metadata about the file. */ - stat(uri: Uri, options: { /*future: followSymlinks*/ }, token: CancellationToken): FileStat2 | Thenable; + stat(uri: Uri, options: { /*future: followSymlinks*/ }, token: CancellationToken): FileStat | Thenable; /** * Retrieve the meta data of all entries of a [directory](#FileType2.Directory) @@ -261,7 +228,7 @@ declare module 'vscode' { * @param token A cancellation token. * @return A thenable that resolves to an array of tuples of file names and files stats. */ - readDirectory(uri: Uri, options: { /*future: onlyType?*/ }, token: CancellationToken): [string, FileStat2][] | Thenable<[string, FileStat2][]>; + readDirectory(uri: Uri, options: { /*future: onlyType?*/ }, token: CancellationToken): [string, FileStat][] | Thenable<[string, FileStat][]>; /** * Create a new directory. *Note* that new files are created via `write`-calls. @@ -269,7 +236,7 @@ declare module 'vscode' { * @param uri The uri of the *new* folder. * @param token A cancellation token. */ - createDirectory(uri: Uri, options: { /*future: permissions?*/ }, token: CancellationToken): FileStat2 | Thenable; + createDirectory(uri: Uri, options: { /*future: permissions?*/ }, token: CancellationToken): FileStat | Thenable; /** * Read the entire contents of a file. @@ -305,7 +272,7 @@ declare module 'vscode' { * @param newUri The target location. * @param token A cancellation token. */ - rename(oldUri: Uri, newUri: Uri, options: FileOptions, token: CancellationToken): FileStat2 | Thenable; + rename(oldUri: Uri, newUri: Uri, options: FileOptions, token: CancellationToken): FileStat | Thenable; /** * Copy files or folders. Implementing this function is optional but it will speedup @@ -315,11 +282,11 @@ declare module 'vscode' { * @param target The target location. * @param token A cancellation token. */ - copy?(uri: Uri, target: Uri, options: FileOptions, token: CancellationToken): FileStat2 | Thenable; + copy?(uri: Uri, target: Uri, options: FileOptions, token: CancellationToken): FileStat | Thenable; } export namespace workspace { - export function registerFileSystemProvider2(scheme: string, provider: FileSystemProvider2, options: { isCaseSensitive?: boolean }): Disposable; + export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, 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 c3205e53724af49e75d63de4ba9c0af06895a029..62407e69d9d8e933e240ab1f135686e1d4ea5be6 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -550,11 +550,8 @@ export function createApiFactory( onDidEndTask: (listeners, thisArgs?, disposables?) => { return extHostTask.onDidEndTask(listeners, thisArgs, disposables); }, - registerFileSystemProvider: proposedApiFunction(extension, (scheme, provider, newProvider?) => { - return extHostFileSystem.registerFileSystemProvider(scheme, provider, newProvider); - }), - registerFileSystemProvider2: proposedApiFunction(extension, (scheme, provider, options) => { - return extHostFileSystem.registerFileSystemProvider2(scheme, provider, options); + registerFileSystemProvider: proposedApiFunction(extension, (scheme, provider, options) => { + return extHostFileSystem.registerFileSystemProvider(scheme, provider, options); }), registerDeprecatedFileSystemProvider: proposedApiFunction(extension, (scheme, provider) => { return extHostFileSystem.registerDeprecatedFileSystemProvider(scheme, provider); @@ -701,11 +698,9 @@ export function createApiFactory( ConfigurationTarget: extHostTypes.ConfigurationTarget, RelativePattern: extHostTypes.RelativePattern, + DeprecatedFileChangeType: extHostTypes.DeprecatedFileChangeType, + DeprecatedFileType: extHostTypes.DeprecatedFileType, FileChangeType: extHostTypes.FileChangeType, - FileType: extHostTypes.FileType, - DeprecatedFileChangeType: extHostTypes.FileChangeType, - DeprecatedFileType: extHostTypes.FileType, - FileChangeType2: extHostTypes.FileChangeType2, FileSystemError: extHostTypes.FileSystemError, FoldingRange: extHostTypes.FoldingRange, FoldingRangeKind: extHostTypes.FoldingRangeKind diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 603fe1e1ee6d42c313d6bb90aefbb5c8eabfdeec..1c7356f967b4a707c504994eed6365b3f211d1a1 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -14,7 +14,7 @@ import * as path from 'path'; import { IDisposable } from 'vs/base/common/lifecycle'; import { asWinJsPromise } from 'vs/base/common/async'; import { values } from 'vs/base/common/map'; -import { Range, FileType, FileChangeType, FileChangeType2 } from 'vs/workbench/api/node/extHostTypes'; +import { Range, DeprecatedFileType, DeprecatedFileChangeType, FileChangeType } from 'vs/workbench/api/node/extHostTypes'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/node/extHostLanguageFeatures'; import { Schemas } from 'vs/base/common/network'; @@ -57,9 +57,7 @@ class FsLinkProvider implements vscode.DocumentLinkProvider { } } -class FileSystemProviderShim implements vscode.FileSystemProvider2 { - - _version: 9 = 9; +class FileSystemProviderShim implements vscode.FileSystemProvider { onDidChangeFile: vscode.Event; @@ -77,19 +75,19 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { return { dispose() { } }; } - stat(resource: vscode.Uri): Thenable { + stat(resource: vscode.Uri): Thenable { return this._delegate.stat(resource).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); } - rename(oldUri: vscode.Uri, newUri: vscode.Uri): Thenable { + rename(oldUri: vscode.Uri, newUri: vscode.Uri): Thenable { return this._delegate.move(oldUri, newUri).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); } - readDirectory(resource: vscode.Uri): Thenable<[string, vscode.FileStat2][]> { + readDirectory(resource: vscode.Uri): Thenable<[string, vscode.FileStat][]> { return this._delegate.readdir(resource).then(tuples => { - return tuples.map(tuple => <[string, vscode.FileStat2]>[path.posix.basename(tuple[0].path), FileSystemProviderShim._modernizeFileStat(tuple[1])]); + return tuples.map(tuple => <[string, vscode.FileStat]>[path.posix.basename(tuple[0].path), FileSystemProviderShim._modernizeFileStat(tuple[1])]); }); } - private static _modernizeFileStat(stat: vscode.DeprecatedFileStat): vscode.FileStat2 { + private static _modernizeFileStat(stat: vscode.DeprecatedFileStat): vscode.FileStat { let { mtime, size, type } = stat; let isFile = false; let isDirectory = false; @@ -97,13 +95,13 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { // no support for bitmask, effectively no support for symlinks switch (type) { - case FileType.Dir: + case DeprecatedFileType.Dir: isDirectory = true; break; - case FileType.File: + case DeprecatedFileType.File: isFile = true; break; - case FileType.Symlink: + case DeprecatedFileType.Symlink: isSymbolicLink = true; break; } @@ -112,16 +110,16 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { private static _modernizeFileChange(e: vscode.DeprecatedFileChange): vscode.FileChangeEvent { let { resource, type } = e; - let newType: vscode.FileChangeType2; + let newType: vscode.FileChangeType; switch (type) { - case FileChangeType.Updated: - newType = FileChangeType2.Changed; + case DeprecatedFileChangeType.Updated: + newType = FileChangeType.Changed; break; - case FileChangeType.Added: - newType = FileChangeType2.Created; + case DeprecatedFileChangeType.Added: + newType = FileChangeType.Created; break; - case FileChangeType.Deleted: - newType = FileChangeType2.Deleted; + case DeprecatedFileChangeType.Deleted: + newType = FileChangeType.Deleted; break; } @@ -132,14 +130,14 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { delete(resource: vscode.Uri): Thenable { return this._delegate.stat(resource).then(stat => { - if (stat.type === FileType.Dir) { + if (stat.type === DeprecatedFileType.Dir) { return this._delegate.rmdir(resource); } else { return this._delegate.unlink(resource); } }); } - createDirectory(resource: vscode.Uri): Thenable { + createDirectory(resource: vscode.Uri): Thenable { return this._delegate.mkdir(resource).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); } @@ -165,7 +163,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { private readonly _proxy: MainThreadFileSystemShape; private readonly _linkProvider = new FsLinkProvider(); - private readonly _fsProvider = new Map(); + private readonly _fsProvider = new Map(); private readonly _usedSchemes = new Set(); private readonly _watches = new Map(); @@ -187,20 +185,10 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } registerDeprecatedFileSystemProvider(scheme: string, provider: vscode.DeprecatedFileSystemProvider) { - return this.registerFileSystemProvider2(scheme, new FileSystemProviderShim(provider), { isCaseSensitive: false }); - } - - registerFileSystemProvider(scheme: string, provider: vscode.DeprecatedFileSystemProvider, newProvider: vscode.FileSystemProvider2) { - if (newProvider && newProvider._version === 9) { - return this.registerFileSystemProvider2(scheme, newProvider, { isCaseSensitive: false }); - } else if (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'); - } + return this.registerFileSystemProvider(scheme, new FileSystemProviderShim(provider), { isCaseSensitive: false }); } - registerFileSystemProvider2(scheme: string, provider: vscode.FileSystemProvider2, options: { isCaseSensitive?: boolean }) { + registerFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider, options: { isCaseSensitive?: boolean }) { if (this._usedSchemes.has(scheme)) { throw new Error(`a provider for the scheme '${scheme}' is already registered`); @@ -231,13 +219,13 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } let newType: files.FileChangeType; switch (type) { - case FileChangeType2.Changed: + case FileChangeType.Changed: newType = files.FileChangeType.UPDATED; break; - case FileChangeType2.Created: + case FileChangeType.Created: newType = files.FileChangeType.ADDED; break; - case FileChangeType2.Deleted: + case FileChangeType.Deleted: newType = files.FileChangeType.DELETED; break; } diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index 32a94c5d0baa69630fea66020887c4c033777ba1..731189500ed7f63594c189e6303e87ca48f4853e 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1846,19 +1846,19 @@ export enum LogLevel { //#region file api // todo@remote -export enum FileChangeType { +export enum DeprecatedFileChangeType { Updated = 0, Added = 1, Deleted = 2 } -export enum FileChangeType2 { +export enum FileChangeType { Changed = 1, Created = 2, Deleted = 3, } -export enum FileType { +export enum DeprecatedFileType { File = 0, Dir = 1, Symlink = 2