diff --git a/src/vs/platform/files/browser/indexedDBFileSystemProvider.ts b/src/vs/platform/files/browser/indexedDBFileSystemProvider.ts index c3c62689805..c302162a78e 100644 --- a/src/vs/platform/files/browser/indexedDBFileSystemProvider.ts +++ b/src/vs/platform/files/browser/indexedDBFileSystemProvider.ts @@ -304,10 +304,10 @@ export class IndexedDBFileSystemProvider extends Disposable implements IFileSyst const toEntry = fileTree.read(to.path); if (toEntry) { if (!opts.overwrite) { - throw new FileSystemProviderError('file exists already', FileSystemProviderErrorCode.FileExists); + throw createFileSystemProviderError('file exists already', FileSystemProviderErrorCode.FileExists); } if (toEntry.type !== fromEntry.type) { - throw new FileSystemProviderError('Cannot rename files with different types', FileSystemProviderErrorCode.Unknown); + throw createFileSystemProviderError('Cannot rename files with different types', FileSystemProviderErrorCode.Unknown); } // delete the target file if exists await this.delete(to, { recursive: true, useTrash: false }); diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 926f5a001cf..3f93b8b8a07 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -625,16 +625,20 @@ export interface IFileSystemProviderError extends Error { export class FileSystemProviderError extends Error implements IFileSystemProviderError { - constructor(message: string, readonly code: FileSystemProviderErrorCode) { + static create(error: Error | string, code: FileSystemProviderErrorCode): FileSystemProviderError { + const providerError = new FileSystemProviderError(error.toString(), code); + markAsFileSystemProviderError(providerError, code); + + return providerError; + } + + private constructor(message: string, readonly code: FileSystemProviderErrorCode) { super(message); } } export function createFileSystemProviderError(error: Error | string, code: FileSystemProviderErrorCode): FileSystemProviderError { - const providerError = new FileSystemProviderError(error.toString(), code); - markAsFileSystemProviderError(providerError, code); - - return providerError; + return FileSystemProviderError.create(error, code); } export function ensureFileSystemProviderError(error?: Error): Error { diff --git a/src/vs/platform/files/common/inMemoryFilesystemProvider.ts b/src/vs/platform/files/common/inMemoryFilesystemProvider.ts index 37490880549..9402533647e 100644 --- a/src/vs/platform/files/common/inMemoryFilesystemProvider.ts +++ b/src/vs/platform/files/common/inMemoryFilesystemProvider.ts @@ -7,7 +7,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import * as resources from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; -import { FileChangeType, IFileDeleteOptions, IFileOverwriteOptions, FileSystemProviderCapabilities, FileSystemProviderError, FileSystemProviderErrorCode, FileType, IFileWriteOptions, IFileChange, IFileSystemProviderWithFileReadWriteCapability, IStat, IWatchOptions } from 'vs/platform/files/common/files'; +import { FileChangeType, IFileDeleteOptions, IFileOverwriteOptions, FileSystemProviderCapabilities, FileSystemProviderErrorCode, FileType, IFileWriteOptions, IFileChange, IFileSystemProviderWithFileReadWriteCapability, IStat, IWatchOptions, createFileSystemProviderError } from 'vs/platform/files/common/files'; class File implements IStat { @@ -89,7 +89,7 @@ export class InMemoryFileSystemProvider extends Disposable implements IFileSyste if (data) { return data; } - throw new FileSystemProviderError('file not found', FileSystemProviderErrorCode.FileNotFound); + throw createFileSystemProviderError('file not found', FileSystemProviderErrorCode.FileNotFound); } async writeFile(resource: URI, content: Uint8Array, opts: IFileWriteOptions): Promise { @@ -97,13 +97,13 @@ export class InMemoryFileSystemProvider extends Disposable implements IFileSyste const parent = this._lookupParentDirectory(resource); let entry = parent.entries.get(basename); if (entry instanceof Directory) { - throw new FileSystemProviderError('file is directory', FileSystemProviderErrorCode.FileIsADirectory); + throw createFileSystemProviderError('file is directory', FileSystemProviderErrorCode.FileIsADirectory); } if (!entry && !opts.create) { - throw new FileSystemProviderError('file not found', FileSystemProviderErrorCode.FileNotFound); + throw createFileSystemProviderError('file not found', FileSystemProviderErrorCode.FileNotFound); } if (entry && opts.create && !opts.overwrite) { - throw new FileSystemProviderError('file exists already', FileSystemProviderErrorCode.FileExists); + throw createFileSystemProviderError('file exists already', FileSystemProviderErrorCode.FileExists); } if (!entry) { entry = new File(basename); @@ -121,7 +121,7 @@ export class InMemoryFileSystemProvider extends Disposable implements IFileSyste async rename(from: URI, to: URI, opts: IFileOverwriteOptions): Promise { if (!opts.overwrite && this._lookup(to, true)) { - throw new FileSystemProviderError('file exists already', FileSystemProviderErrorCode.FileExists); + throw createFileSystemProviderError('file exists already', FileSystemProviderErrorCode.FileExists); } const entry = this._lookup(from, false); @@ -154,7 +154,7 @@ export class InMemoryFileSystemProvider extends Disposable implements IFileSyste async mkdir(resource: URI): Promise { if (this._lookup(resource, true)) { - throw new FileSystemProviderError('file exists already', FileSystemProviderErrorCode.FileExists); + throw createFileSystemProviderError('file exists already', FileSystemProviderErrorCode.FileExists); } const basename = resources.basename(resource); @@ -185,7 +185,7 @@ export class InMemoryFileSystemProvider extends Disposable implements IFileSyste } if (!child) { if (!silent) { - throw new FileSystemProviderError('file not found', FileSystemProviderErrorCode.FileNotFound); + throw createFileSystemProviderError('file not found', FileSystemProviderErrorCode.FileNotFound); } else { return undefined; } @@ -200,7 +200,7 @@ export class InMemoryFileSystemProvider extends Disposable implements IFileSyste if (entry instanceof Directory) { return entry; } - throw new FileSystemProviderError('file not a directory', FileSystemProviderErrorCode.FileNotADirectory); + throw createFileSystemProviderError('file not a directory', FileSystemProviderErrorCode.FileNotADirectory); } private _lookupAsFile(uri: URI, silent: boolean): File { @@ -208,7 +208,7 @@ export class InMemoryFileSystemProvider extends Disposable implements IFileSyste if (entry instanceof File) { return entry; } - throw new FileSystemProviderError('file is a directory', FileSystemProviderErrorCode.FileIsADirectory); + throw createFileSystemProviderError('file is a directory', FileSystemProviderErrorCode.FileIsADirectory); } private _lookupParentDirectory(uri: URI): Directory { diff --git a/src/vs/workbench/contrib/debug/browser/debugMemory.ts b/src/vs/workbench/contrib/debug/browser/debugMemory.ts index b869672f5e7..a9dd5c267ce 100644 --- a/src/vs/workbench/contrib/debug/browser/debugMemory.ts +++ b/src/vs/workbench/contrib/debug/browser/debugMemory.ts @@ -9,7 +9,7 @@ import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecy import { clamp } from 'vs/base/common/numbers'; import { assertNever } from 'vs/base/common/assert'; import { URI } from 'vs/base/common/uri'; -import { FileChangeType, IFileOpenOptions, FilePermission, FileSystemProviderCapabilities, FileSystemProviderError, FileSystemProviderErrorCode, FileType, IFileChange, IFileSystemProvider, IStat, IWatchOptions } from 'vs/platform/files/common/files'; +import { FileChangeType, IFileOpenOptions, FilePermission, FileSystemProviderCapabilities, FileSystemProviderErrorCode, FileType, IFileChange, IFileSystemProvider, IStat, IWatchOptions, createFileSystemProviderError } from 'vs/platform/files/common/files'; import { DEBUG_MEMORY_SCHEME, IDebugService, IDebugSession, IMemoryInvalidationEvent, IMemoryRegion, MemoryRange, MemoryRangeType, State } from 'vs/workbench/contrib/debug/common/debug'; const rangeRe = /range=([0-9]+):([0-9]+)/; @@ -83,22 +83,22 @@ export class DebugMemoryFileSystemProvider implements IFileSystemProvider { /** @inheritdoc */ public mkdir(): never { - throw new FileSystemProviderError(`Not allowed`, FileSystemProviderErrorCode.NoPermissions); + throw createFileSystemProviderError(`Not allowed`, FileSystemProviderErrorCode.NoPermissions); } /** @inheritdoc */ public readdir(): never { - throw new FileSystemProviderError(`Not allowed`, FileSystemProviderErrorCode.NoPermissions); + throw createFileSystemProviderError(`Not allowed`, FileSystemProviderErrorCode.NoPermissions); } /** @inheritdoc */ public delete(): never { - throw new FileSystemProviderError(`Not allowed`, FileSystemProviderErrorCode.NoPermissions); + throw createFileSystemProviderError(`Not allowed`, FileSystemProviderErrorCode.NoPermissions); } /** @inheritdoc */ public rename(): never { - throw new FileSystemProviderError(`Not allowed`, FileSystemProviderErrorCode.NoPermissions); + throw createFileSystemProviderError(`Not allowed`, FileSystemProviderErrorCode.NoPermissions); } /** @inheritdoc */ @@ -125,7 +125,7 @@ export class DebugMemoryFileSystemProvider implements IFileSystemProvider { public async writeFile(resource: URI, content: Uint8Array) { const { offset } = this.parseUri(resource); if (!offset) { - throw new FileSystemProviderError(`Range must be present to read a file`, FileSystemProviderErrorCode.FileNotFound); + throw createFileSystemProviderError(`Range must be present to read a file`, FileSystemProviderErrorCode.FileNotFound); } const fd = await this.open(resource, { create: false }); @@ -141,7 +141,7 @@ export class DebugMemoryFileSystemProvider implements IFileSystemProvider { public async readFile(resource: URI) { const { offset } = this.parseUri(resource); if (!offset) { - throw new FileSystemProviderError(`Range must be present to read a file`, FileSystemProviderErrorCode.FileNotFound); + throw createFileSystemProviderError(`Range must be present to read a file`, FileSystemProviderErrorCode.FileNotFound); } const data = new Uint8Array(offset.toOffset - offset.fromOffset); @@ -159,7 +159,7 @@ export class DebugMemoryFileSystemProvider implements IFileSystemProvider { public async read(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise { const memory = this.fdMemory.get(fd); if (!memory) { - throw new FileSystemProviderError(`No file with that descriptor open`, FileSystemProviderErrorCode.Unavailable); + throw createFileSystemProviderError(`No file with that descriptor open`, FileSystemProviderErrorCode.Unavailable); } const ranges = await memory.region.read(pos, length); @@ -172,7 +172,7 @@ export class DebugMemoryFileSystemProvider implements IFileSystemProvider { if (readSoFar > 0) { return readSoFar; } else { - throw new FileSystemProviderError(range.error, FileSystemProviderErrorCode.Unknown); + throw createFileSystemProviderError(range.error, FileSystemProviderErrorCode.Unknown); } case MemoryRangeType.Valid: { const start = Math.max(0, pos - range.offset); @@ -193,7 +193,7 @@ export class DebugMemoryFileSystemProvider implements IFileSystemProvider { public write(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise { const memory = this.fdMemory.get(fd); if (!memory) { - throw new FileSystemProviderError(`No file with that descriptor open`, FileSystemProviderErrorCode.Unavailable); + throw createFileSystemProviderError(`No file with that descriptor open`, FileSystemProviderErrorCode.Unavailable); } return memory.region.write(pos, VSBuffer.wrap(data).slice(offset, offset + length)); @@ -201,12 +201,12 @@ export class DebugMemoryFileSystemProvider implements IFileSystemProvider { protected parseUri(uri: URI) { if (uri.scheme !== DEBUG_MEMORY_SCHEME) { - throw new FileSystemProviderError(`Cannot open file with scheme ${uri.scheme}`, FileSystemProviderErrorCode.FileNotFound); + throw createFileSystemProviderError(`Cannot open file with scheme ${uri.scheme}`, FileSystemProviderErrorCode.FileNotFound); } const session = this.debugService.getModel().getSession(uri.authority); if (!session) { - throw new FileSystemProviderError(`Debug session not found`, FileSystemProviderErrorCode.FileNotFound); + throw createFileSystemProviderError(`Debug session not found`, FileSystemProviderErrorCode.FileNotFound); } let offset: { fromOffset: number; toOffset: number } | undefined; diff --git a/src/vs/workbench/services/extensions/browser/webWorkerFileSystemProvider.ts b/src/vs/workbench/services/extensions/browser/webWorkerFileSystemProvider.ts index 1cdb2ea88dd..9fce0ac6ce8 100644 --- a/src/vs/workbench/services/extensions/browser/webWorkerFileSystemProvider.ts +++ b/src/vs/workbench/services/extensions/browser/webWorkerFileSystemProvider.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { FileSystemProviderCapabilities, IStat, FileType, IFileDeleteOptions, IFileOverwriteOptions, IFileWriteOptions, FileSystemProviderError, FileSystemProviderErrorCode, IFileSystemProviderWithFileReadWriteCapability } from 'vs/platform/files/common/files'; +import { FileSystemProviderCapabilities, IStat, FileType, IFileDeleteOptions, IFileOverwriteOptions, IFileWriteOptions, FileSystemProviderErrorCode, IFileSystemProviderWithFileReadWriteCapability, createFileSystemProviderError } from 'vs/platform/files/common/files'; import { Event } from 'vs/base/common/event'; import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; @@ -22,9 +22,9 @@ export class FetchFileSystemProvider implements IFileSystemProviderWithFileReadW if (res.status === 200) { return new Uint8Array(await res.arrayBuffer()); } - throw new FileSystemProviderError(res.statusText, FileSystemProviderErrorCode.Unknown); + throw createFileSystemProviderError(res.statusText, FileSystemProviderErrorCode.Unknown); } catch (err) { - throw new FileSystemProviderError(err, FileSystemProviderErrorCode.Unknown); + throw createFileSystemProviderError(err, FileSystemProviderErrorCode.Unknown); } }