提交 3500eb87 编写于 作者: J Johannes Rieken

back to FileError, #47475

上级 57a92cb3
...@@ -156,24 +156,6 @@ export enum FileType2 { ...@@ -156,24 +156,6 @@ export enum FileType2 {
SymbolicLink = 4, SymbolicLink = 4,
} }
export class FileError extends Error {
static readonly EntryExists = new FileError('EEXIST');
static readonly EntryNotFound = new FileError('ENOENT');
static readonly EntryNotADirectory = new FileError('ENOTDIR');
static readonly EntryIsADirectory = new FileError('EISDIR');
constructor(readonly code: string, message?: string) {
super(message || code);
}
is(err: any): err is FileError {
if (!err || typeof err !== 'object') {
return false;
}
return err.code === this.code;
}
}
export enum FileOpenFlags { export enum FileOpenFlags {
Read = 0b0001, Read = 0b0001,
Write = 0b0010, Write = 0b0010,
......
...@@ -84,32 +84,18 @@ declare module 'vscode' { ...@@ -84,32 +84,18 @@ declare module 'vscode' {
// create(resource: Uri): Thenable<FileStat>; // create(resource: Uri): Thenable<FileStat>;
} }
// export class FileError extends Error { /**
*
// /** */
// * Entry already exists, e.g. when creating a file or folder. export class FileError extends Error {
// */
// static readonly EntryExists: FileError;
// /**
// * Entry does not exist.
// */
// static readonly EntryNotFound: FileError;
// /**
// * Entry is not a directory.
// */
// static readonly EntryNotADirectory: FileError;
// /**
// * Entry is a directory.
// */
// static readonly EntryIsADirectory: FileError;
// readonly code: string; static EntryExists(message?: string): FileError;
static EntryNotFound(message?: string): FileError;
static EntryNotADirectory(message?: string): FileError;
static EntryIsADirectory(message?: string): FileError;
// constructor(code: string, message?: string); constructor(message?: string);
// } }
export enum FileChangeType2 { export enum FileChangeType2 {
Changed = 1, Changed = 1,
......
...@@ -8,7 +8,7 @@ import { Emitter, Event } from 'vs/base/common/event'; ...@@ -8,7 +8,7 @@ import { Emitter, Event } from 'vs/base/common/event';
import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import URI from 'vs/base/common/uri'; import URI from 'vs/base/common/uri';
import { TPromise } from 'vs/base/common/winjs.base'; import { TPromise } from 'vs/base/common/winjs.base';
import { FileOpenFlags, IFileChange, IFileService, IStat, IWatchOptions, FileError, FileSystemProviderCapabilities, IFileSystemProvider } from 'vs/platform/files/common/files'; import { FileOpenFlags, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions } from 'vs/platform/files/common/files';
import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers';
import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../node/extHost.protocol'; import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../node/extHost.protocol';
...@@ -88,7 +88,7 @@ class RemoteFileSystemProvider implements IFileSystemProvider { ...@@ -88,7 +88,7 @@ class RemoteFileSystemProvider implements IFileSystemProvider {
// --- forwarding calls // --- forwarding calls
stat(resource: URI): TPromise<IStat, FileError> { stat(resource: URI): TPromise<IStat> {
return this._proxy.$stat(this._handle, resource).then(undefined, err => { return this._proxy.$stat(this._handle, resource).then(undefined, err => {
throw err; throw err;
}); });
......
...@@ -713,7 +713,7 @@ export function createApiFactory( ...@@ -713,7 +713,7 @@ export function createApiFactory(
FileChangeType2: extHostTypes.FileChangeType2, FileChangeType2: extHostTypes.FileChangeType2,
FileType2: extHostTypes.FileType2, FileType2: extHostTypes.FileType2,
FileOpenFlags: files.FileOpenFlags, FileOpenFlags: files.FileOpenFlags,
FileError: files.FileError, FileError: extHostTypes.FileError,
FoldingRange: extHostTypes.FoldingRange, FoldingRange: extHostTypes.FoldingRange,
FoldingRangeKind: extHostTypes.FoldingRangeKind FoldingRangeKind: extHostTypes.FoldingRangeKind
}; };
......
...@@ -1838,6 +1838,32 @@ export enum FileType2 { ...@@ -1838,6 +1838,32 @@ export enum FileType2 {
SymbolicLink = 4, SymbolicLink = 4,
} }
export class FileError extends Error {
static EntryExists(message?: string): FileError {
return new FileError(message, 'EntryExists', FileError.EntryExists);
}
static EntryNotFound(message?: string): FileError {
return new FileError(message, 'EntryNotFound', FileError.EntryNotFound);
}
static EntryNotADirectory(message?: string): FileError {
return new FileError(message, 'EntryNotADirectory', FileError.EntryNotADirectory);
}
static EntryIsADirectory(message?: string): FileError {
return new FileError(message, 'EntryIsADirectory', FileError.EntryIsADirectory);
}
constructor(message?: string, code?: string, hide?: Function) {
super(message);
this.name = code ? `FileError/${code}` : `FileError`;
if (typeof Error.captureStackTrace === 'function' && typeof hide === 'function') {
// nice stack traces
Error.captureStackTrace(this, hide);
}
}
}
//#endregion //#endregion
//#region folding api //#region folding api
......
...@@ -16,7 +16,7 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/res ...@@ -16,7 +16,7 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/res
import { localize } from 'vs/nls'; import { localize } from 'vs/nls';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { FileChangesEvent, FileError, FileOpenFlags, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileType2, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; import { FileChangesEvent, FileOpenFlags, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileType2, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, FileSystemProviderCapabilities } from 'vs/platform/files/common/files';
import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle';
import { INotificationService } from 'vs/platform/notification/common/notification'; import { INotificationService } from 'vs/platform/notification/common/notification';
import { IStorageService } from 'vs/platform/storage/common/storage'; import { IStorageService } from 'vs/platform/storage/common/storage';
...@@ -200,6 +200,32 @@ export class RemoteFileService extends FileService { ...@@ -200,6 +200,32 @@ export class RemoteFileService extends FileService {
|| this._supportedSchemes.indexOf(resource.scheme) >= 0; || this._supportedSchemes.indexOf(resource.scheme) >= 0;
} }
private _tryParseFileOperationResult(err: any): FileOperationResult {
if (!(err instanceof Error)) {
return undefined;
}
let match = /FileError\/(.+)$/.exec(err.name);
if (!match) {
return undefined;
}
let res: FileOperationResult;
switch (match[1]) {
case 'EntryNotFound':
res = FileOperationResult.FILE_NOT_FOUND;
break;
case 'EntryIsADirectory':
res = FileOperationResult.FILE_IS_DIRECTORY;
break;
case 'EntryExists':
case 'EntryNotADirectory':
default:
// todo
res = undefined;
break;
}
return res;
}
// --- stat // --- stat
private _withProvider(resource: URI): TPromise<IFileSystemProvider> { private _withProvider(resource: URI): TPromise<IFileSystemProvider> {
...@@ -229,7 +255,10 @@ export class RemoteFileService extends FileService { ...@@ -229,7 +255,10 @@ export class RemoteFileService extends FileService {
} else { } else {
return this._doResolveFiles([{ resource, options }]).then(data => { return this._doResolveFiles([{ resource, options }]).then(data => {
if (data.length !== 1 || !data[0].success) { if (data.length !== 1 || !data[0].success) {
throw new Error(`ENOENT, ${resource}`); throw new FileOperationError(
localize('fileNotFoundError', "File not found ({0})", resource.toString(true)),
FileOperationResult.FILE_NOT_FOUND
);
} else { } else {
return data[0].stat; return data[0].stat;
} }
...@@ -369,10 +398,9 @@ export class RemoteFileService extends FileService { ...@@ -369,10 +398,9 @@ export class RemoteFileService extends FileService {
this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, fileStat)); this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, fileStat));
return fileStat; return fileStat;
}, err => { }, err => {
if (FileError.EntryExists.is(err)) { const message = localize('err.create', "Failed to create file {0}", resource.toString(false));
return TPromise.wrapError(new FileOperationError(err.code, FileOperationResult.FILE_MODIFIED_SINCE, options)); const result = this._tryParseFileOperationResult(err);
} throw new FileOperationError(message, result, options);
throw err;
}); });
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册