mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-30 13:31:07 +01:00
Always reject Promises with Error instances
This commit is contained in:
@@ -31,13 +31,13 @@ export class MainThreadDebugService extends MainThreadDebugServiceShape {
|
||||
|
||||
public $createDebugSession(configuration: IConfig): TPromise<DebugSessionUUID> {
|
||||
if (configuration.request !== 'launch' && configuration.request !== 'attach') {
|
||||
return TPromise.wrapError(`only 'launch' or 'attach' allowed for 'request' attribute`);
|
||||
return TPromise.wrapError(new Error(`only 'launch' or 'attach' allowed for 'request' attribute`));
|
||||
}
|
||||
return this.debugService.createProcess(configuration).then(process => {
|
||||
if (process) {
|
||||
return <DebugSessionUUID>process.getId();
|
||||
}
|
||||
return TPromise.wrapError('cannot create debug session');
|
||||
return TPromise.wrapError(new Error('cannot create debug session'));
|
||||
}, err => {
|
||||
return TPromise.wrapError(err && err.message ? err.message : 'cannot create debug session');
|
||||
});
|
||||
@@ -50,11 +50,11 @@ export class MainThreadDebugService extends MainThreadDebugServiceShape {
|
||||
if (response.success) {
|
||||
return response.body;
|
||||
} else {
|
||||
return TPromise.wrapError(response.message);
|
||||
return TPromise.wrapError(new Error(response.message));
|
||||
}
|
||||
});
|
||||
}
|
||||
return TPromise.wrapError('debug session not found');
|
||||
return TPromise.wrapError(new Error('debug session not found'));
|
||||
}
|
||||
|
||||
private _findProcessByUUID(processId: DebugSessionUUID): IProcess | null {
|
||||
|
||||
@@ -190,7 +190,7 @@ export class MainThreadDocuments extends MainThreadDocumentsShape {
|
||||
$tryOpenDocument(uri: URI): TPromise<any> {
|
||||
|
||||
if (!uri.scheme || !(uri.fsPath || uri.authority)) {
|
||||
return TPromise.wrapError(`Invalid uri. Scheme and authority or path must be set.`);
|
||||
return TPromise.wrapError(new Error(`Invalid uri. Scheme and authority or path must be set.`));
|
||||
}
|
||||
|
||||
let promise: TPromise<boolean>;
|
||||
@@ -206,11 +206,11 @@ export class MainThreadDocuments extends MainThreadDocumentsShape {
|
||||
|
||||
return promise.then(success => {
|
||||
if (!success) {
|
||||
return TPromise.wrapError('cannot open ' + uri.toString());
|
||||
return TPromise.wrapError(new Error('cannot open ' + uri.toString()));
|
||||
}
|
||||
return undefined;
|
||||
}, err => {
|
||||
return TPromise.wrapError('cannot open ' + uri.toString() + '. Detail: ' + toErrorMessage(err));
|
||||
return TPromise.wrapError(new Error('cannot open ' + uri.toString() + '. Detail: ' + toErrorMessage(err)));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -230,7 +230,7 @@ export class MainThreadDocuments extends MainThreadDocumentsShape {
|
||||
let asFileUri = uri.with({ scheme: 'file' });
|
||||
return this._fileService.resolveFile(asFileUri).then(stats => {
|
||||
// don't create a new file ontop of an existing file
|
||||
return TPromise.wrapError<boolean>('file already exists on disk');
|
||||
return TPromise.wrapError<boolean>(new Error('file already exists on disk'));
|
||||
}, err => this._doCreateUntitled(asFileUri).then(resource => !!resource));
|
||||
}
|
||||
|
||||
|
||||
@@ -158,7 +158,7 @@ export class MainThreadEditors extends MainThreadEditorsShape {
|
||||
|
||||
$trySetSelections(id: string, selections: ISelection[]): TPromise<any> {
|
||||
if (!this._documentsAndEditors.getEditor(id)) {
|
||||
return TPromise.wrapError('TextEditor disposed');
|
||||
return TPromise.wrapError(new Error('TextEditor disposed'));
|
||||
}
|
||||
this._documentsAndEditors.getEditor(id).setSelections(selections);
|
||||
return TPromise.as(null);
|
||||
@@ -166,7 +166,7 @@ export class MainThreadEditors extends MainThreadEditorsShape {
|
||||
|
||||
$trySetDecorations(id: string, key: string, ranges: IDecorationOptions[]): TPromise<any> {
|
||||
if (!this._documentsAndEditors.getEditor(id)) {
|
||||
return TPromise.wrapError('TextEditor disposed');
|
||||
return TPromise.wrapError(new Error('TextEditor disposed'));
|
||||
}
|
||||
this._documentsAndEditors.getEditor(id).setDecorations(key, ranges);
|
||||
return TPromise.as(null);
|
||||
@@ -174,7 +174,7 @@ export class MainThreadEditors extends MainThreadEditorsShape {
|
||||
|
||||
$tryRevealRange(id: string, range: IRange, revealType: TextEditorRevealType): TPromise<any> {
|
||||
if (!this._documentsAndEditors.getEditor(id)) {
|
||||
return TPromise.wrapError('TextEditor disposed');
|
||||
return TPromise.wrapError(new Error('TextEditor disposed'));
|
||||
}
|
||||
this._documentsAndEditors.getEditor(id).revealRange(range, revealType);
|
||||
return undefined;
|
||||
@@ -182,7 +182,7 @@ export class MainThreadEditors extends MainThreadEditorsShape {
|
||||
|
||||
$trySetOptions(id: string, options: ITextEditorConfigurationUpdate): TPromise<any> {
|
||||
if (!this._documentsAndEditors.getEditor(id)) {
|
||||
return TPromise.wrapError('TextEditor disposed');
|
||||
return TPromise.wrapError(new Error('TextEditor disposed'));
|
||||
}
|
||||
this._documentsAndEditors.getEditor(id).setConfiguration(options);
|
||||
return TPromise.as(null);
|
||||
@@ -190,14 +190,14 @@ export class MainThreadEditors extends MainThreadEditorsShape {
|
||||
|
||||
$tryApplyEdits(id: string, modelVersionId: number, edits: ISingleEditOperation[], opts: IApplyEditsOptions): TPromise<boolean> {
|
||||
if (!this._documentsAndEditors.getEditor(id)) {
|
||||
return TPromise.wrapError<boolean>('TextEditor disposed');
|
||||
return TPromise.wrapError<boolean>(new Error('TextEditor disposed'));
|
||||
}
|
||||
return TPromise.as(this._documentsAndEditors.getEditor(id).applyEdits(modelVersionId, edits, opts));
|
||||
}
|
||||
|
||||
$tryInsertSnippet(id: string, template: string, ranges: IRange[], opts: IUndoStopOptions): TPromise<boolean> {
|
||||
if (!this._documentsAndEditors.getEditor(id)) {
|
||||
return TPromise.wrapError<boolean>('TextEditor disposed');
|
||||
return TPromise.wrapError<boolean>(new Error('TextEditor disposed'));
|
||||
}
|
||||
return TPromise.as(this._documentsAndEditors.getEditor(id).insertSnippet(template, ranges, opts));
|
||||
}
|
||||
@@ -214,7 +214,7 @@ export class MainThreadEditors extends MainThreadEditorsShape {
|
||||
const editor = this._documentsAndEditors.getEditor(id);
|
||||
|
||||
if (!editor) {
|
||||
return TPromise.wrapError<ILineChange[]>('No such TextEditor');
|
||||
return TPromise.wrapError<ILineChange[]>(new Error('No such TextEditor'));
|
||||
}
|
||||
|
||||
const codeEditor = editor.getCodeEditor();
|
||||
|
||||
@@ -210,7 +210,7 @@ class ExtHostSaveParticipant implements INamedSaveParticpant {
|
||||
this._proxy.$participateInSave(editorModel.getResource(), env.reason).then(values => {
|
||||
for (const success of values) {
|
||||
if (!success) {
|
||||
return TPromise.wrapError('listener failed');
|
||||
return TPromise.wrapError(new Error('listener failed'));
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
|
||||
@@ -343,7 +343,7 @@ export class ExtHostApiCommands {
|
||||
return undefined;
|
||||
}
|
||||
if (value.rejectReason) {
|
||||
return TPromise.wrapError<types.WorkspaceEdit>(value.rejectReason);
|
||||
return TPromise.wrapError<types.WorkspaceEdit>(new Error(value.rejectReason));
|
||||
}
|
||||
let workspaceEdit = new types.WorkspaceEdit();
|
||||
for (let edit of value.edits) {
|
||||
|
||||
@@ -104,7 +104,7 @@ export class ExtHostCommands extends ExtHostCommandsShape {
|
||||
$executeContributedCommand<T>(id: string, ...args: any[]): Thenable<T> {
|
||||
let command = this._commands.get(id);
|
||||
if (!command) {
|
||||
return TPromise.wrapError<T>(`Contributed command '${id}' does not exist.`);
|
||||
return TPromise.wrapError<T>(new Error(`Contributed command '${id}' does not exist.`));
|
||||
}
|
||||
|
||||
let { callback, thisArg, description } = command;
|
||||
@@ -114,7 +114,7 @@ export class ExtHostCommands extends ExtHostCommandsShape {
|
||||
try {
|
||||
validateConstraint(args[i], description.args[i].constraint);
|
||||
} catch (err) {
|
||||
return TPromise.wrapError<T>(`Running the contributed command:'${id}' failed. Illegal argument '${description.args[i].name}' - ${description.args[i].description}`);
|
||||
return TPromise.wrapError<T>(new Error(`Running the contributed command:'${id}' failed. Illegal argument '${description.args[i].name}' - ${description.args[i].description}`));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -131,7 +131,7 @@ export class ExtHostCommands extends ExtHostCommandsShape {
|
||||
// } catch (err) {
|
||||
// //
|
||||
// }
|
||||
return TPromise.wrapError<T>(`Running the contributed command:'${id}' failed.`);
|
||||
return TPromise.wrapError<T>(new Error(`Running the contributed command:'${id}' failed.`));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -101,7 +101,7 @@ export class ExtHostDocumentData extends MirrorModel {
|
||||
|
||||
private _save(): TPromise<boolean> {
|
||||
if (this._isDisposed) {
|
||||
return TPromise.wrapError<boolean>('Document has been closed');
|
||||
return TPromise.wrapError<boolean>(new Error('Document has been closed'));
|
||||
}
|
||||
return this._proxy.$trySaveDocument(this._uri);
|
||||
}
|
||||
|
||||
@@ -154,7 +154,7 @@ export class ExtHostDocuments extends ExtHostDocumentsShape {
|
||||
public $provideTextDocumentContent(handle: number, uri: URI): TPromise<string> {
|
||||
const provider = this._documentContentProviders.get(handle);
|
||||
if (!provider) {
|
||||
return TPromise.wrapError<string>(`unsupported uri-scheme: ${uri.scheme}`);
|
||||
return TPromise.wrapError<string>(new Error(`unsupported uri-scheme: ${uri.scheme}`));
|
||||
}
|
||||
return asWinJsPromise(token => provider.provideTextDocumentContent(uri, token));
|
||||
}
|
||||
|
||||
@@ -399,7 +399,7 @@ export class ExtHostTextEditor implements vscode.TextEditor {
|
||||
throw illegalArgument('selection');
|
||||
}
|
||||
this._selections = [value];
|
||||
this._trySetSelection(true);
|
||||
this._trySetSelection();
|
||||
}
|
||||
|
||||
get selections(): Selection[] {
|
||||
@@ -411,7 +411,7 @@ export class ExtHostTextEditor implements vscode.TextEditor {
|
||||
throw illegalArgument('selections');
|
||||
}
|
||||
this._selections = value;
|
||||
this._trySetSelection(true);
|
||||
this._trySetSelection();
|
||||
}
|
||||
|
||||
setDecorations(decorationType: vscode.TextEditorDecorationType, ranges: Range[] | vscode.DecorationOptions[]): void {
|
||||
@@ -420,8 +420,7 @@ export class ExtHostTextEditor implements vscode.TextEditor {
|
||||
this._id,
|
||||
decorationType.key,
|
||||
TypeConverters.fromRangeOrRangeWithMessage(ranges)
|
||||
),
|
||||
true
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -431,14 +430,13 @@ export class ExtHostTextEditor implements vscode.TextEditor {
|
||||
this._id,
|
||||
TypeConverters.fromRange(range),
|
||||
(revealType || TextEditorRevealType.Default)
|
||||
),
|
||||
true
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
private _trySetSelection(silent: boolean): TPromise<vscode.TextEditor> {
|
||||
private _trySetSelection(): TPromise<vscode.TextEditor> {
|
||||
let selection = this._selections.map(TypeConverters.fromSelection);
|
||||
return this._runOnProxy(() => this._proxy.$trySetSelections(this._id, selection), silent);
|
||||
return this._runOnProxy(() => this._proxy.$trySetSelections(this._id, selection));
|
||||
}
|
||||
|
||||
_acceptSelections(selections: Selection[]): void {
|
||||
@@ -450,7 +448,7 @@ export class ExtHostTextEditor implements vscode.TextEditor {
|
||||
|
||||
edit(callback: (edit: TextEditorEdit) => void, options: { undoStopBefore: boolean; undoStopAfter: boolean; } = { undoStopBefore: true, undoStopAfter: true }): Thenable<boolean> {
|
||||
if (this._disposed) {
|
||||
return TPromise.wrapError<boolean>('TextEditor#edit not possible on closed editors');
|
||||
return TPromise.wrapError<boolean>(new Error('TextEditor#edit not possible on closed editors'));
|
||||
}
|
||||
let edit = new TextEditorEdit(this._documentData.document, options);
|
||||
callback(edit);
|
||||
@@ -508,7 +506,7 @@ export class ExtHostTextEditor implements vscode.TextEditor {
|
||||
|
||||
insertSnippet(snippet: SnippetString, where?: Position | Position[] | Range | Range[], options: { undoStopBefore: boolean; undoStopAfter: boolean; } = { undoStopBefore: true, undoStopAfter: true }): Thenable<boolean> {
|
||||
if (this._disposed) {
|
||||
return TPromise.wrapError<boolean>('TextEditor#insertSnippet not possible on closed editors');
|
||||
return TPromise.wrapError<boolean>(new Error('TextEditor#insertSnippet not possible on closed editors'));
|
||||
}
|
||||
let ranges: IRange[];
|
||||
|
||||
@@ -538,19 +536,12 @@ export class ExtHostTextEditor implements vscode.TextEditor {
|
||||
|
||||
// ---- util
|
||||
|
||||
private _runOnProxy(callback: () => TPromise<any>, silent: boolean): TPromise<ExtHostTextEditor> {
|
||||
private _runOnProxy(callback: () => TPromise<any>): TPromise<ExtHostTextEditor> {
|
||||
if (this._disposed) {
|
||||
if (!silent) {
|
||||
return TPromise.wrapError<ExtHostTextEditor>(silent);
|
||||
} else {
|
||||
console.warn('TextEditor is closed/disposed');
|
||||
return TPromise.as(undefined);
|
||||
}
|
||||
console.warn('TextEditor is closed/disposed');
|
||||
return TPromise.as(undefined);
|
||||
}
|
||||
return callback().then(() => this, err => {
|
||||
if (!silent) {
|
||||
return TPromise.wrapError<ExtHostTextEditor>(silent);
|
||||
}
|
||||
console.warn(err);
|
||||
return undefined;
|
||||
});
|
||||
|
||||
@@ -53,7 +53,7 @@ export class ExtHostTreeViews extends ExtHostTreeViewsShape {
|
||||
$getElements(treeViewId: string): TPromise<ITreeItem[]> {
|
||||
const treeView = this.treeViews.get(treeViewId);
|
||||
if (!treeView) {
|
||||
return TPromise.wrapError<ITreeItem[]>(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', treeViewId));
|
||||
return TPromise.wrapError<ITreeItem[]>(new Error(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', treeViewId)));
|
||||
}
|
||||
return treeView.getTreeItems();
|
||||
}
|
||||
@@ -61,7 +61,7 @@ export class ExtHostTreeViews extends ExtHostTreeViewsShape {
|
||||
$getChildren(treeViewId: string, treeItemHandle?: number): TPromise<ITreeItem[]> {
|
||||
const treeView = this.treeViews.get(treeViewId);
|
||||
if (!treeView) {
|
||||
return TPromise.wrapError<ITreeItem[]>(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', treeViewId));
|
||||
return TPromise.wrapError<ITreeItem[]>(new Error(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', treeViewId)));
|
||||
}
|
||||
return treeView.getChildren(treeItemHandle);
|
||||
}
|
||||
@@ -102,7 +102,7 @@ class ExtHostTreeView<T> extends Disposable {
|
||||
if (extElement) {
|
||||
this.clearChildren(extElement);
|
||||
} else {
|
||||
return TPromise.wrapError<ITreeItem[]>(localize('treeItem.notFound', 'No tree item with id \'{0}\' found.', treeItemHandle));
|
||||
return TPromise.wrapError<ITreeItem[]>(new Error(localize('treeItem.notFound', 'No tree item with id \'{0}\' found.', treeItemHandle)));
|
||||
}
|
||||
|
||||
return asWinJsPromise(() => this.dataProvider.getChildren(extElement))
|
||||
@@ -130,7 +130,7 @@ class ExtHostTreeView<T> extends Disposable {
|
||||
elements.filter(element => !!element)
|
||||
.map(element => {
|
||||
if (this.extChildrenElementsMap.has(element)) {
|
||||
return TPromise.wrapError<ITreeItem>(localize('treeView.duplicateElement', 'Element {0} is already registered', element));
|
||||
return TPromise.wrapError<ITreeItem>(new Error(localize('treeView.duplicateElement', 'Element {0} is already registered', element)));
|
||||
}
|
||||
return this.resolveElement(element);
|
||||
}))
|
||||
|
||||
@@ -80,7 +80,7 @@ export abstract class BaseBinaryResourceEditor extends BaseEditor {
|
||||
|
||||
// Assert Model instance
|
||||
if (!(resolvedModel instanceof BinaryEditorModel)) {
|
||||
return TPromise.wrapError<void>('Unable to open file as binary');
|
||||
return TPromise.wrapError<void>(new Error('Unable to open file as binary'));
|
||||
}
|
||||
|
||||
// Assert that the current input is still the one we expect. This prevents a race condition when loading takes long and another input was set meanwhile
|
||||
|
||||
@@ -23,7 +23,7 @@ import { DiffNavigator } from 'vs/editor/browser/widget/diffNavigator';
|
||||
import { DiffEditorWidget } from 'vs/editor/browser/widget/diffEditorWidget';
|
||||
import { TextDiffEditorModel } from 'vs/workbench/common/editor/textDiffEditorModel';
|
||||
import { DelegatingWorkbenchEditorService } from 'vs/workbench/services/editor/browser/editorService';
|
||||
import { IFileOperationResult, FileOperationResult } from 'vs/platform/files/common/files';
|
||||
import { FileOperationError, FileOperationResult } from 'vs/platform/files/common/files';
|
||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { IStorageService } from 'vs/platform/storage/common/storage';
|
||||
import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration';
|
||||
@@ -257,7 +257,7 @@ export class TextDiffEditor extends BaseTextEditor {
|
||||
return errors.some(e => this.isFileBinaryError(e));
|
||||
}
|
||||
|
||||
return (<IFileOperationResult>error).fileOperationResult === FileOperationResult.FILE_IS_BINARY;
|
||||
return (<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_IS_BINARY;
|
||||
}
|
||||
|
||||
public clearInput(): void {
|
||||
|
||||
@@ -80,7 +80,7 @@ export class TextResourceEditor extends BaseTextEditor {
|
||||
|
||||
// Assert Model instance
|
||||
if (!(resolvedModel instanceof BaseTextEditorModel)) {
|
||||
return TPromise.wrapError<void>('Unable to open file as text');
|
||||
return TPromise.wrapError<void>(new Error('Unable to open file as text'));
|
||||
}
|
||||
|
||||
// Assert that the current input is still the one we expect. This prevents a race condition when loading takes long and another input was set meanwhile
|
||||
|
||||
@@ -1002,7 +1002,7 @@ export class QuickOpenController extends Component implements IQuickOpenService
|
||||
return result.then<QuickOpenHandler>(null, (error) => {
|
||||
delete this.mapResolvedHandlersToPrefix[id];
|
||||
|
||||
return TPromise.wrapError('Unable to instantiate quick open handler ' + handler.moduleName + ' - ' + handler.ctorName + ': ' + JSON.stringify(error));
|
||||
return TPromise.wrapError(new Error('Unable to instantiate quick open handler ' + handler.moduleName + ' - ' + handler.ctorName + ': ' + JSON.stringify(error)));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ export class ResourceEditorInput extends EditorInput {
|
||||
if (!(model instanceof ResourceEditorModel)) {
|
||||
ref.dispose();
|
||||
this.modelReference = null;
|
||||
return TPromise.wrapError<ITextEditorModel>(`Unexpected model for ResourceInput: ${this.resource}`); // TODO@Ben eventually also files should be supported, but we guard due to the dangerous dispose of the model in dispose()
|
||||
return TPromise.wrapError<ITextEditorModel>(new Error(`Unexpected model for ResourceInput: ${this.resource}`)); // TODO@Ben eventually also files should be supported, but we guard due to the dangerous dispose of the model in dispose()
|
||||
}
|
||||
|
||||
return model;
|
||||
|
||||
@@ -200,7 +200,7 @@ export class ExtensionHostMain {
|
||||
this.gracefulExit(1 /* ERROR */);
|
||||
}
|
||||
|
||||
return TPromise.wrapError<void>(requireError ? requireError.toString() : nls.localize('extensionTestError', "Path {0} does not point to a valid extension test runner.", this._environment.extensionTestsPath));
|
||||
return TPromise.wrapError<void>(new Error(requireError ? requireError.toString() : nls.localize('extensionTestError', "Path {0} does not point to a valid extension test runner.", this._environment.extensionTestsPath)));
|
||||
}
|
||||
|
||||
private gracefulExit(code: number): void {
|
||||
|
||||
@@ -33,7 +33,7 @@ export class DebugContentProvider implements IWorkbenchContribution, ITextModelC
|
||||
const process = this.debugService.getViewModel().focusedProcess;
|
||||
|
||||
if (!process) {
|
||||
return TPromise.wrapError<IModel>(localize('unable', "Unable to resolve the resource without a debug session"));
|
||||
return TPromise.wrapError<IModel>(new Error(localize('unable', "Unable to resolve the resource without a debug session")));
|
||||
}
|
||||
const source = process.sources.get(resource.toString());
|
||||
let rawSource: DebugProtocol.Source;
|
||||
|
||||
@@ -188,7 +188,7 @@ class Extension implements IExtension {
|
||||
return readFile(uri.fsPath, 'utf8');
|
||||
}
|
||||
|
||||
return TPromise.wrapError<string>('not available');
|
||||
return TPromise.wrapError<string>(new Error('not available'));
|
||||
}
|
||||
|
||||
getChangelog(): TPromise<string> {
|
||||
@@ -199,7 +199,7 @@ class Extension implements IExtension {
|
||||
const changelogUrl = this.local && this.local.changelogUrl;
|
||||
|
||||
if (!changelogUrl) {
|
||||
return TPromise.wrapError<string>('not available');
|
||||
return TPromise.wrapError<string>(new Error('not available'));
|
||||
}
|
||||
|
||||
const uri = URI.parse(changelogUrl);
|
||||
@@ -208,7 +208,7 @@ class Extension implements IExtension {
|
||||
return readFile(uri.fsPath, 'utf8');
|
||||
}
|
||||
|
||||
return TPromise.wrapError<string>('not available');
|
||||
return TPromise.wrapError<string>(new Error('not available'));
|
||||
}
|
||||
|
||||
get dependencies(): string[] {
|
||||
@@ -590,7 +590,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
|
||||
if (!enable) {
|
||||
let dependents = this.getDependentsAfterDisablement(extension, dependencies, this.local, workspace);
|
||||
if (dependents.length) {
|
||||
return TPromise.wrapError<void>(this.getDependentsErrorMessage(extension, dependents));
|
||||
return TPromise.wrapError<void>(new Error(this.getDependentsErrorMessage(extension, dependents)));
|
||||
}
|
||||
}
|
||||
return TPromise.join([extension, ...dependencies].map(e => this.doSetEnablement(e, enable, workspace)));
|
||||
|
||||
@@ -19,7 +19,7 @@ import { BinaryEditorModel } from 'vs/workbench/common/editor/binaryEditorModel'
|
||||
import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput';
|
||||
import { ExplorerViewlet } from 'vs/workbench/parts/files/browser/explorerViewlet';
|
||||
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
|
||||
import { IFileOperationResult, FileOperationResult, FileChangesEvent, IFileService } from 'vs/platform/files/common/files';
|
||||
import { FileOperationError, FileOperationResult, FileChangesEvent, IFileService } from 'vs/platform/files/common/files';
|
||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
|
||||
import { IStorageService } from 'vs/platform/storage/common/storage';
|
||||
@@ -158,17 +158,17 @@ export class TextFileEditor extends BaseTextEditor {
|
||||
// In case we tried to open a file inside the text editor and the response
|
||||
// indicates that this is not a text file, reopen the file through the binary
|
||||
// editor.
|
||||
if ((<IFileOperationResult>error).fileOperationResult === FileOperationResult.FILE_IS_BINARY) {
|
||||
if ((<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_IS_BINARY) {
|
||||
return this.openAsBinary(input, options);
|
||||
}
|
||||
|
||||
// Similar, handle case where we were asked to open a folder in the text editor.
|
||||
if ((<IFileOperationResult>error).fileOperationResult === FileOperationResult.FILE_IS_DIRECTORY && this.openAsFolder(input)) {
|
||||
if ((<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_IS_DIRECTORY && this.openAsFolder(input)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Offer to create a file from the error if we have a file not found and the name is valid
|
||||
if ((<IFileOperationResult>error).fileOperationResult === FileOperationResult.FILE_NOT_FOUND && paths.isValidBasename(paths.basename(input.getResource().fsPath))) {
|
||||
if ((<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_NOT_FOUND && paths.isValidBasename(paths.basename(input.getResource().fsPath))) {
|
||||
return TPromise.wrapError<void>(errors.create(toErrorMessage(error), {
|
||||
actions: [
|
||||
new Action('workbench.files.action.createMissingFile', nls.localize('createFile', "Create File"), null, true, () => {
|
||||
|
||||
@@ -25,7 +25,7 @@ import { dispose, IDisposable } from 'vs/base/common/lifecycle';
|
||||
import { VIEWLET_ID } from 'vs/workbench/parts/files/common/files';
|
||||
import labels = require('vs/base/common/labels');
|
||||
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
|
||||
import { IFileService, IFileStat, IFileOperationResult } from 'vs/platform/files/common/files';
|
||||
import { IFileService, IFileStat } from 'vs/platform/files/common/files';
|
||||
import { toResource, IEditorIdentifier, EditorInput } from 'vs/workbench/common/editor';
|
||||
import { FileStat, Model, NewStatPlaceholder } from 'vs/workbench/parts/files/common/explorerModel';
|
||||
import { ExplorerView } from 'vs/workbench/parts/files/browser/views/explorerView';
|
||||
@@ -76,9 +76,8 @@ export class BaseErrorReportingAction extends Action {
|
||||
}
|
||||
|
||||
protected onError(error: any): void {
|
||||
const fileOperation = error as IFileOperationResult;
|
||||
if (typeof fileOperation.message === 'string') {
|
||||
error = fileOperation.message;
|
||||
if (error.message === 'string') {
|
||||
error = error.message;
|
||||
}
|
||||
|
||||
this._messageService.show(Severity.Error, toErrorMessage(error, false));
|
||||
@@ -172,17 +171,17 @@ export class TriggerRenameFileAction extends BaseFileAction {
|
||||
|
||||
public run(context?: any): TPromise<any> {
|
||||
if (!context) {
|
||||
return TPromise.wrapError('No context provided to BaseEnableFileRenameAction.');
|
||||
return TPromise.wrapError(new Error('No context provided to BaseEnableFileRenameAction.'));
|
||||
}
|
||||
|
||||
const viewletState = <IFileViewletState>context.viewletState;
|
||||
if (!viewletState) {
|
||||
return TPromise.wrapError('Invalid viewlet state provided to BaseEnableFileRenameAction.');
|
||||
return TPromise.wrapError(new Error('Invalid viewlet state provided to BaseEnableFileRenameAction.'));
|
||||
}
|
||||
|
||||
const stat = <IFileStat>context.stat;
|
||||
if (!stat) {
|
||||
return TPromise.wrapError('Invalid stat provided to BaseEnableFileRenameAction.');
|
||||
return TPromise.wrapError(new Error('Invalid stat provided to BaseEnableFileRenameAction.'));
|
||||
}
|
||||
|
||||
viewletState.setEditable(stat, {
|
||||
@@ -235,12 +234,12 @@ export abstract class BaseRenameAction extends BaseFileAction {
|
||||
|
||||
public run(context?: any): TPromise<any> {
|
||||
if (!context) {
|
||||
return TPromise.wrapError('No context provided to BaseRenameFileAction.');
|
||||
return TPromise.wrapError(new Error('No context provided to BaseRenameFileAction.'));
|
||||
}
|
||||
|
||||
let name = <string>context.value;
|
||||
if (!name) {
|
||||
return TPromise.wrapError('No new name provided to BaseRenameFileAction.');
|
||||
return TPromise.wrapError(new Error('No new name provided to BaseRenameFileAction.'));
|
||||
}
|
||||
|
||||
// Automatically trim whitespaces and trailing dots to produce nice file names
|
||||
@@ -369,12 +368,12 @@ export class BaseNewAction extends BaseFileAction {
|
||||
|
||||
public run(context?: any): TPromise<any> {
|
||||
if (!context) {
|
||||
return TPromise.wrapError('No context provided to BaseNewAction.');
|
||||
return TPromise.wrapError(new Error('No context provided to BaseNewAction.'));
|
||||
}
|
||||
|
||||
const viewletState = <IFileViewletState>context.viewletState;
|
||||
if (!viewletState) {
|
||||
return TPromise.wrapError('Invalid viewlet state provided to BaseNewAction.');
|
||||
return TPromise.wrapError(new Error('Invalid viewlet state provided to BaseNewAction.'));
|
||||
}
|
||||
|
||||
let folder = this.presetFolder;
|
||||
@@ -389,7 +388,7 @@ export class BaseNewAction extends BaseFileAction {
|
||||
}
|
||||
|
||||
if (!folder) {
|
||||
return TPromise.wrapError('Invalid parent folder to create.');
|
||||
return TPromise.wrapError(new Error('Invalid parent folder to create.'));
|
||||
}
|
||||
|
||||
return this.tree.reveal(folder, 0.5).then(() => {
|
||||
|
||||
@@ -12,7 +12,7 @@ import paths = require('vs/base/common/paths');
|
||||
import { Action } from 'vs/base/common/actions';
|
||||
import URI from 'vs/base/common/uri';
|
||||
import { SaveFileAsAction, RevertFileAction, SaveFileAction } from 'vs/workbench/parts/files/browser/fileActions';
|
||||
import { IFileOperationResult, FileOperationResult } from 'vs/platform/files/common/files';
|
||||
import { FileOperationError, FileOperationResult } from 'vs/platform/files/common/files';
|
||||
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
|
||||
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { ITextFileService, ISaveErrorHandler, ITextFileEditorModel } from 'vs/workbench/services/textfile/common/textfiles';
|
||||
@@ -116,13 +116,13 @@ export class SaveErrorHandler implements ISaveErrorHandler, IWorkbenchContributi
|
||||
const resource = model.getResource();
|
||||
|
||||
// Dirty write prevention
|
||||
if ((<IFileOperationResult>error).fileOperationResult === FileOperationResult.FILE_MODIFIED_SINCE) {
|
||||
if ((<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_MODIFIED_SINCE) {
|
||||
message = this.instantiationService.createInstance(ResolveSaveConflictMessage, model, null);
|
||||
}
|
||||
|
||||
// Any other save error
|
||||
else {
|
||||
const isReadonly = (<IFileOperationResult>error).fileOperationResult === FileOperationResult.FILE_READ_ONLY;
|
||||
const isReadonly = (<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_READ_ONLY;
|
||||
const actions: Action[] = [];
|
||||
|
||||
// Save As
|
||||
|
||||
@@ -25,7 +25,7 @@ import { IDisposable } from 'vs/base/common/lifecycle';
|
||||
import { ContributableActionProvider } from 'vs/workbench/browser/actions';
|
||||
import { IFilesConfiguration } from 'vs/workbench/parts/files/common/files';
|
||||
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
|
||||
import { IFileOperationResult, FileOperationResult, IFileService } from 'vs/platform/files/common/files';
|
||||
import { FileOperationError, FileOperationResult, IFileService } from 'vs/platform/files/common/files';
|
||||
import { ResourceMap } from 'vs/base/common/map';
|
||||
import { DuplicateFileAction, ImportFileAction, IEditableData, IFileViewletState } from 'vs/workbench/parts/files/browser/fileActions';
|
||||
import { IDataSource, ITree, IAccessibilityProvider, IRenderer, ContextMenuEvent, ISorter, IFilter, IDragAndDrop, IDragAndDropData, IDragOverReaction, DRAG_OVER_ACCEPT_BUBBLE_DOWN, DRAG_OVER_ACCEPT_BUBBLE_DOWN_COPY, DRAG_OVER_ACCEPT_BUBBLE_UP, DRAG_OVER_ACCEPT_BUBBLE_UP_COPY, DRAG_OVER_REJECT } from 'vs/base/parts/tree/browser/tree';
|
||||
@@ -823,7 +823,7 @@ export class FileDragAndDrop implements IDragAndDrop {
|
||||
return this.fileService.moveFile(source.resource, targetResource).then(null, error => {
|
||||
|
||||
// Conflict
|
||||
if ((<IFileOperationResult>error).fileOperationResult === FileOperationResult.FILE_MOVE_CONFLICT) {
|
||||
if ((<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_MOVE_CONFLICT) {
|
||||
didHandleConflict = true;
|
||||
|
||||
const confirm: IConfirmation = {
|
||||
|
||||
@@ -12,7 +12,7 @@ import URI from 'vs/base/common/uri';
|
||||
import { EncodingMode, ConfirmResult, EditorInput, IFileEditorInput, ITextEditorModel } from 'vs/workbench/common/editor';
|
||||
import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel';
|
||||
import { BinaryEditorModel } from 'vs/workbench/common/editor/binaryEditorModel';
|
||||
import { IFileOperationResult, FileOperationResult } from 'vs/platform/files/common/files';
|
||||
import { FileOperationError, FileOperationResult } from 'vs/platform/files/common/files';
|
||||
import { BINARY_FILE_EDITOR_ID, TEXT_FILE_EDITOR_ID, FILE_EDITOR_INPUT_ID } from 'vs/workbench/parts/files/common/files';
|
||||
import { ITextFileService, AutoSaveMode, ModelState, TextFileModelChangeEvent } from 'vs/workbench/services/textfile/common/textfiles';
|
||||
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
|
||||
@@ -216,7 +216,7 @@ export class FileEditorInput extends EditorInput implements IFileEditorInput {
|
||||
}, error => {
|
||||
|
||||
// In case of an error that indicates that the file is binary or too large, just return with the binary editor model
|
||||
if ((<IFileOperationResult>error).fileOperationResult === FileOperationResult.FILE_IS_BINARY || (<IFileOperationResult>error).fileOperationResult === FileOperationResult.FILE_TOO_LARGE) {
|
||||
if ((<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_IS_BINARY || (<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_TOO_LARGE) {
|
||||
return this.resolveAsBinary();
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ import { workbenchInstantiationService, TestTextFileService, TestEditorGroupServ
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { EncodingMode } from 'vs/workbench/common/editor';
|
||||
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
|
||||
import { FileOperationResult, IFileOperationResult } from 'vs/platform/files/common/files';
|
||||
import { FileOperationResult, FileOperationError } from 'vs/platform/files/common/files';
|
||||
import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel';
|
||||
import { Verbosity } from 'vs/platform/editor/common/editor';
|
||||
import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService';
|
||||
@@ -173,10 +173,7 @@ suite('Files - FileEditorInput', () => {
|
||||
test('resolve handles binary files', function (done) {
|
||||
const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), void 0);
|
||||
|
||||
accessor.textFileService.setResolveTextContentErrorOnce(<IFileOperationResult>{
|
||||
message: 'error',
|
||||
fileOperationResult: FileOperationResult.FILE_IS_BINARY
|
||||
});
|
||||
accessor.textFileService.setResolveTextContentErrorOnce(new FileOperationError('error', FileOperationResult.FILE_IS_BINARY));
|
||||
|
||||
return input.resolve(true).then(resolved => {
|
||||
assert.ok(resolved);
|
||||
|
||||
@@ -194,7 +194,7 @@ export class HtmlPreviewPart extends WebviewEditor {
|
||||
this._modelChangeSubscription.dispose();
|
||||
|
||||
if (!(input instanceof HtmlInput)) {
|
||||
return TPromise.wrapError<void>('Invalid input');
|
||||
return TPromise.wrapError<void>(new Error('Invalid input'));
|
||||
}
|
||||
|
||||
return super.setInput(input, options).then(() => {
|
||||
@@ -207,7 +207,7 @@ export class HtmlPreviewPart extends WebviewEditor {
|
||||
}
|
||||
|
||||
if (!this.model) {
|
||||
return TPromise.wrapError<void>(localize('html.voidInput', "Invalid editor input."));
|
||||
return TPromise.wrapError<void>(new Error(localize('html.voidInput', "Invalid editor input.")));
|
||||
}
|
||||
|
||||
this._modelChangeSubscription = this.model.onDidChangeContent(() => {
|
||||
|
||||
@@ -22,7 +22,7 @@ import { IContextMenuService, ContextSubMenu } from 'vs/platform/contextview/bro
|
||||
import { SettingsGroupTitleWidget, EditPreferenceWidget, SettingsHeaderWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets';
|
||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { RangeHighlightDecorations } from 'vs/workbench/common/editor/rangeDecorations';
|
||||
import { IConfigurationEditingService, IConfigurationEditingError, ConfigurationEditingErrorCode, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing';
|
||||
import { IConfigurationEditingService, ConfigurationEditingError, ConfigurationEditingErrorCode, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing';
|
||||
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
|
||||
import { overrideIdentifierFromKey } from 'vs/platform/configuration/common/model';
|
||||
import { IMarkerService, IMarkerData } from 'vs/platform/markers/common/markers';
|
||||
@@ -100,7 +100,7 @@ export class UserSettingsRenderer extends Disposable implements IPreferencesRend
|
||||
});
|
||||
}
|
||||
|
||||
private toErrorMessage(error: IConfigurationEditingError, target: ConfigurationTarget): string {
|
||||
private toErrorMessage(error: ConfigurationEditingError, target: ConfigurationTarget): string {
|
||||
switch (error.code) {
|
||||
case ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION: {
|
||||
return nls.localize('errorInvalidConfiguration', "Unable to write into settings. Correct errors/warnings in the file and try again.");
|
||||
|
||||
@@ -20,7 +20,7 @@ import { Position as EditorPosition, IEditor } from 'vs/platform/editor/common/e
|
||||
import { ICommonCodeEditor } from 'vs/editor/common/editorCommon';
|
||||
import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService';
|
||||
import { IStorageService } from 'vs/platform/storage/common/storage';
|
||||
import { IFileService, IFileOperationResult, FileOperationResult } from 'vs/platform/files/common/files';
|
||||
import { IFileService, FileOperationError, FileOperationResult } from 'vs/platform/files/common/files';
|
||||
import { IMessageService, Severity, IChoiceService } from 'vs/platform/message/common/message';
|
||||
import { IExtensionService } from 'vs/platform/extensions/common/extensions';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
@@ -269,7 +269,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic
|
||||
|
||||
private createIfNotExists(resource: URI, contents: string): TPromise<boolean> {
|
||||
return this.fileService.resolveContent(resource, { acceptTextOnly: true }).then(null, error => {
|
||||
if ((<IFileOperationResult>error).fileOperationResult === FileOperationResult.FILE_NOT_FOUND) {
|
||||
if ((<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_NOT_FOUND) {
|
||||
return this.fileService.updateContent(resource, contents).then(null, error => {
|
||||
return TPromise.wrapError<boolean>(new Error(nls.localize('fail.createSettings', "Unable to create '{0}' ({1}).", labels.getPathLabel(resource, this.contextService, this.environmentService), error)));
|
||||
});
|
||||
|
||||
@@ -280,27 +280,32 @@ export class ProcessTaskSystem extends EventEmitter implements ITaskSystem {
|
||||
this.activeTaskPromise = null;
|
||||
}
|
||||
|
||||
private handleError(task: Task, error: ErrorData): Promise {
|
||||
private handleError(task: Task, errorData: ErrorData): Promise {
|
||||
let makeVisible = false;
|
||||
if (error.error && !error.terminated) {
|
||||
if (errorData.error && !errorData.terminated) {
|
||||
let args: string = task.command.args ? task.command.args.join(' ') : '';
|
||||
this.log(nls.localize('TaskRunnerSystem.childProcessError', 'Failed to launch external program {0} {1}.', task.command.name, args));
|
||||
this.outputChannel.append(error.error.message);
|
||||
this.outputChannel.append(errorData.error.message);
|
||||
makeVisible = true;
|
||||
}
|
||||
|
||||
if (error.stdout) {
|
||||
this.outputChannel.append(error.stdout);
|
||||
if (errorData.stdout) {
|
||||
this.outputChannel.append(errorData.stdout);
|
||||
makeVisible = true;
|
||||
}
|
||||
if (error.stderr) {
|
||||
this.outputChannel.append(error.stderr);
|
||||
if (errorData.stderr) {
|
||||
this.outputChannel.append(errorData.stderr);
|
||||
makeVisible = true;
|
||||
}
|
||||
makeVisible = this.checkTerminated(task, error) || makeVisible;
|
||||
makeVisible = this.checkTerminated(task, errorData) || makeVisible;
|
||||
if (makeVisible) {
|
||||
this.showOutput();
|
||||
}
|
||||
|
||||
const error: Error & ErrorData = errorData.error || new Error();
|
||||
error.stderr = errorData.stderr;
|
||||
error.stdout = errorData.stdout;
|
||||
error.terminated = errorData.terminated;
|
||||
return Promise.wrapError(error);
|
||||
}
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ export function loadReleaseNotes(accessor: ServicesAccessor, version: string): T
|
||||
const match = /^(\d+\.\d+)\./.exec(version);
|
||||
|
||||
if (!match) {
|
||||
return TPromise.wrapError<string>('not found');
|
||||
return TPromise.wrapError<string>(new Error('not found'));
|
||||
}
|
||||
|
||||
const versionLabel = match[1].replace(/\./g, '_');
|
||||
|
||||
@@ -38,9 +38,10 @@ export enum ConfigurationEditingErrorCode {
|
||||
ERROR_INVALID_CONFIGURATION
|
||||
}
|
||||
|
||||
export interface IConfigurationEditingError {
|
||||
code: ConfigurationEditingErrorCode;
|
||||
message: string;
|
||||
export class ConfigurationEditingError extends Error {
|
||||
constructor(message: string, public code: ConfigurationEditingErrorCode) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
|
||||
export enum ConfigurationTarget {
|
||||
|
||||
@@ -27,7 +27,7 @@ import { IConfigurationService, IConfigurationOverrides } from 'vs/platform/conf
|
||||
import { keyFromOverrideIdentifier } from 'vs/platform/configuration/common/model';
|
||||
import { WORKSPACE_CONFIG_DEFAULT_PATH, WORKSPACE_STANDALONE_CONFIGURATIONS } from 'vs/workbench/services/configuration/common/configuration';
|
||||
import { IFileService } from 'vs/platform/files/common/files';
|
||||
import { IConfigurationEditingService, ConfigurationEditingErrorCode, IConfigurationEditingError, ConfigurationTarget, IConfigurationValue, IConfigurationEditingOptions } from 'vs/workbench/services/configuration/common/configurationEditing';
|
||||
import { IConfigurationEditingService, ConfigurationEditingErrorCode, ConfigurationEditingError, ConfigurationTarget, IConfigurationValue, IConfigurationEditingOptions } from 'vs/workbench/services/configuration/common/configurationEditing';
|
||||
import { ITextModelService, ITextEditorModel } from 'vs/editor/common/services/resolverService';
|
||||
import { OVERRIDE_PROPERTY_PATTERN } from 'vs/platform/configuration/common/configurationRegistry';
|
||||
import { IChoiceService, IMessageService, Severity } from 'vs/platform/message/common/message';
|
||||
@@ -72,7 +72,10 @@ export class ConfigurationEditingService implements IConfigurationEditingService
|
||||
return this.queue.queue(() => this.doWriteConfiguration(target, value, options) // queue up writes to prevent race conditions
|
||||
.then(() => null,
|
||||
error => {
|
||||
return options.donotNotifyError ? TPromise.wrapError(error) : this.onError(error, target, value, options.scopes);
|
||||
if (!options.donotNotifyError) {
|
||||
this.onError(error, target, value, options.scopes);
|
||||
}
|
||||
return TPromise.wrapError(error);
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -108,7 +111,7 @@ export class ConfigurationEditingService implements IConfigurationEditingService
|
||||
return false;
|
||||
}
|
||||
|
||||
private onError(error: IConfigurationEditingError, target: ConfigurationTarget, value: IConfigurationValue, scopes: IConfigurationOverrides): TPromise<IConfigurationEditingError> {
|
||||
private onError(error: ConfigurationEditingError, target: ConfigurationTarget, value: IConfigurationValue, scopes: IConfigurationOverrides): void {
|
||||
switch (error.code) {
|
||||
case ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION:
|
||||
this.onInvalidConfigurationError(error, target);
|
||||
@@ -119,10 +122,9 @@ export class ConfigurationEditingService implements IConfigurationEditingService
|
||||
default:
|
||||
this.messageService.show(Severity.Error, error.message);
|
||||
}
|
||||
return TPromise.wrapError(error);
|
||||
}
|
||||
|
||||
private onInvalidConfigurationError(error: IConfigurationEditingError, target: ConfigurationTarget): void {
|
||||
private onInvalidConfigurationError(error: ConfigurationEditingError, target: ConfigurationTarget): void {
|
||||
this.choiceService.choose(Severity.Error, error.message, [nls.localize('open', "Open Settings"), nls.localize('close', "Close")], 1)
|
||||
.then(option => {
|
||||
switch (option) {
|
||||
@@ -132,7 +134,7 @@ export class ConfigurationEditingService implements IConfigurationEditingService
|
||||
});
|
||||
}
|
||||
|
||||
private onConfigurationFileDirtyError(error: IConfigurationEditingError, target: ConfigurationTarget, value: IConfigurationValue, scopes: IConfigurationOverrides): void {
|
||||
private onConfigurationFileDirtyError(error: ConfigurationEditingError, target: ConfigurationTarget, value: IConfigurationValue, scopes: IConfigurationOverrides): void {
|
||||
this.choiceService.choose(Severity.Error, error.message, [nls.localize('saveAndRetry', "Save Settings and Retry"), nls.localize('open', "Open Settings"), nls.localize('close', "Close")], 2)
|
||||
.then(option => {
|
||||
switch (option) {
|
||||
@@ -150,14 +152,10 @@ export class ConfigurationEditingService implements IConfigurationEditingService
|
||||
this.commandService.executeCommand(ConfigurationTarget.USER === target ? 'workbench.action.openGlobalSettings' : 'workbench.action.openWorkspaceSettings');
|
||||
}
|
||||
|
||||
private wrapError(code: ConfigurationEditingErrorCode, target: ConfigurationTarget): TPromise<any> {
|
||||
private wrapError(code: ConfigurationEditingErrorCode, target: ConfigurationTarget): TPromise<never> {
|
||||
const message = this.toErrorMessage(code, target);
|
||||
|
||||
return TPromise.wrapError<IConfigurationEditingError>({
|
||||
code,
|
||||
message,
|
||||
toString: () => message
|
||||
});
|
||||
return TPromise.wrapError<never>(new ConfigurationEditingError(message, code));
|
||||
}
|
||||
|
||||
private toErrorMessage(error: ConfigurationEditingErrorCode, target: ConfigurationTarget): string {
|
||||
|
||||
@@ -25,7 +25,7 @@ import { WorkspaceConfigurationService } from 'vs/workbench/services/configurati
|
||||
import URI from 'vs/base/common/uri';
|
||||
import { FileService } from 'vs/workbench/services/files/node/fileService';
|
||||
import { ConfigurationEditingService } from 'vs/workbench/services/configuration/node/configurationEditingService';
|
||||
import { ConfigurationTarget, IConfigurationEditingError, ConfigurationEditingErrorCode } from 'vs/workbench/services/configuration/common/configurationEditing';
|
||||
import { ConfigurationTarget, ConfigurationEditingError, ConfigurationEditingErrorCode } from 'vs/workbench/services/configuration/common/configurationEditing';
|
||||
import { IFileService } from 'vs/platform/files/common/files';
|
||||
import { WORKSPACE_STANDALONE_CONFIGURATIONS } from 'vs/workbench/services/configuration/common/configuration';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
@@ -171,34 +171,34 @@ suite('ConfigurationEditingService', () => {
|
||||
test('errors cases - invalid key', () => {
|
||||
return testObject.writeConfiguration(ConfigurationTarget.WORKSPACE, { key: 'unknown.key', value: 'value' })
|
||||
.then(() => assert.fail('Should fail with ERROR_UNKNOWN_KEY'),
|
||||
(error: IConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY));
|
||||
(error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY));
|
||||
});
|
||||
|
||||
test('errors cases - invalid target', () => {
|
||||
return testObject.writeConfiguration(ConfigurationTarget.USER, { key: 'tasks.something', value: 'value' })
|
||||
.then(() => assert.fail('Should fail with ERROR_INVALID_TARGET'),
|
||||
(error: IConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_INVALID_TARGET));
|
||||
(error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_INVALID_TARGET));
|
||||
});
|
||||
|
||||
test('errors cases - no workspace', () => {
|
||||
return setUpServices(true)
|
||||
.then(() => testObject.writeConfiguration(ConfigurationTarget.WORKSPACE, { key: 'configurationEditing.service.testSetting', value: 'value' }))
|
||||
.then(() => assert.fail('Should fail with ERROR_NO_WORKSPACE_OPENED'),
|
||||
(error: IConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED));
|
||||
(error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED));
|
||||
});
|
||||
|
||||
test('errors cases - invalid configuration', () => {
|
||||
fs.writeFileSync(globalSettingsFile, ',,,,,,,,,,,,,,');
|
||||
return testObject.writeConfiguration(ConfigurationTarget.USER, { key: 'configurationEditing.service.testSetting', value: 'value' })
|
||||
.then(() => assert.fail('Should fail with ERROR_INVALID_CONFIGURATION'),
|
||||
(error: IConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION));
|
||||
(error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION));
|
||||
});
|
||||
|
||||
test('errors cases - dirty', () => {
|
||||
instantiationService.stub(ITextFileService, 'isDirty', true);
|
||||
return testObject.writeConfiguration(ConfigurationTarget.USER, { key: 'configurationEditing.service.testSetting', value: 'value' })
|
||||
.then(() => assert.fail('Should fail with ERROR_CONFIGURATION_FILE_DIRTY error.'),
|
||||
(error: IConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY));
|
||||
(error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY));
|
||||
});
|
||||
|
||||
test('dirty error is not thrown if not asked to save', () => {
|
||||
@@ -213,7 +213,7 @@ suite('ConfigurationEditingService', () => {
|
||||
instantiationService.stubPromise(IChoiceService, 'choose', target);
|
||||
return testObject.writeConfiguration(ConfigurationTarget.USER, { key: 'configurationEditing.service.testSetting', value: 'value' }, { donotNotifyError: true })
|
||||
.then(() => assert.fail('Should fail with ERROR_CONFIGURATION_FILE_DIRTY error.'),
|
||||
(error: IConfigurationEditingError) => {
|
||||
(error: ConfigurationEditingError) => {
|
||||
assert.equal(false, target.calledOnce);
|
||||
assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY);
|
||||
});
|
||||
|
||||
@@ -11,7 +11,7 @@ import os = require('os');
|
||||
import crypto = require('crypto');
|
||||
import assert = require('assert');
|
||||
|
||||
import { isParent, FileOperation, FileOperationEvent, IContent, IFileService, IResolveFileOptions, IResolveContentOptions, IFileStat, IStreamContent, IFileOperationResult, FileOperationResult, IUpdateContentOptions, FileChangeType, IImportResult, MAX_FILE_SIZE, FileChangesEvent, IFilesConfiguration } from 'vs/platform/files/common/files';
|
||||
import { isParent, FileOperation, FileOperationEvent, IContent, IFileService, IResolveFileOptions, IResolveContentOptions, IFileStat, IStreamContent, FileOperationError, FileOperationResult, IUpdateContentOptions, FileChangeType, IImportResult, MAX_FILE_SIZE, FileChangesEvent, IFilesConfiguration } from 'vs/platform/files/common/files';
|
||||
import { isEqualOrParent } from 'vs/base/common/paths';
|
||||
import { ResourceMap } from 'vs/base/common/map';
|
||||
import arrays = require('vs/base/common/arrays');
|
||||
@@ -217,10 +217,10 @@ export class FileService implements IFileService {
|
||||
|
||||
// Guard early against attempts to resolve an invalid file path
|
||||
if (resource.scheme !== 'file' || !resource.fsPath) {
|
||||
return TPromise.wrapError<IStreamContent>(<IFileOperationResult>{
|
||||
message: nls.localize('fileInvalidPath', "Invalid file resource ({0})", resource.toString()),
|
||||
fileOperationResult: FileOperationResult.FILE_INVALID_PATH
|
||||
});
|
||||
return TPromise.wrapError<IStreamContent>(new FileOperationError(
|
||||
nls.localize('fileInvalidPath', "Invalid file resource ({0})", resource.toString()),
|
||||
FileOperationResult.FILE_INVALID_PATH
|
||||
));
|
||||
}
|
||||
|
||||
// 1.) resolve resource
|
||||
@@ -228,26 +228,20 @@ export class FileService implements IFileService {
|
||||
|
||||
// Return early if resource is a directory
|
||||
if (model.isDirectory) {
|
||||
return TPromise.wrapError<IStreamContent>(<IFileOperationResult>{
|
||||
message: nls.localize('fileIsDirectoryError', "File is directory ({0})", absolutePath),
|
||||
fileOperationResult: FileOperationResult.FILE_IS_DIRECTORY
|
||||
});
|
||||
return TPromise.wrapError<IStreamContent>(new FileOperationError(
|
||||
nls.localize('fileIsDirectoryError', "File is directory ({0})", absolutePath),
|
||||
FileOperationResult.FILE_IS_DIRECTORY
|
||||
));
|
||||
}
|
||||
|
||||
// Return early if file not modified since
|
||||
if (options && options.etag && options.etag === model.etag) {
|
||||
return TPromise.wrapError<IStreamContent>(<IFileOperationResult>{
|
||||
message: nls.localize('fileNotModifiedError', "File not modified since"),
|
||||
fileOperationResult: FileOperationResult.FILE_NOT_MODIFIED_SINCE
|
||||
});
|
||||
return TPromise.wrapError<IStreamContent>(new FileOperationError(nls.localize('fileNotModifiedError', "File not modified since"), FileOperationResult.FILE_NOT_MODIFIED_SINCE));
|
||||
}
|
||||
|
||||
// Return early if file is too large to load
|
||||
if (types.isNumber(model.size) && model.size > MAX_FILE_SIZE) {
|
||||
return TPromise.wrapError<IStreamContent>(<IFileOperationResult>{
|
||||
message: nls.localize('fileTooLargeError', "File too large to open"),
|
||||
fileOperationResult: FileOperationResult.FILE_TOO_LARGE
|
||||
});
|
||||
return TPromise.wrapError<IStreamContent>(new FileOperationError(nls.localize('fileTooLargeError', "File too large to open"), FileOperationResult.FILE_TOO_LARGE));
|
||||
}
|
||||
|
||||
// 2.) detect mimes
|
||||
@@ -257,10 +251,10 @@ export class FileService implements IFileService {
|
||||
|
||||
// Return error early if client only accepts text and this is not text
|
||||
if (options && options.acceptTextOnly && !isText) {
|
||||
return TPromise.wrapError<IStreamContent>(<IFileOperationResult>{
|
||||
message: nls.localize('fileBinaryError', "File seems to be binary and cannot be opened as text"),
|
||||
fileOperationResult: FileOperationResult.FILE_IS_BINARY
|
||||
});
|
||||
return TPromise.wrapError<IStreamContent>(new FileOperationError(
|
||||
nls.localize('fileBinaryError', "File seems to be binary and cannot be opened as text"),
|
||||
FileOperationResult.FILE_IS_BINARY
|
||||
));
|
||||
}
|
||||
|
||||
let preferredEncoding: string;
|
||||
@@ -286,7 +280,7 @@ export class FileService implements IFileService {
|
||||
}, (error) => {
|
||||
|
||||
// bubble up existing file operation results
|
||||
if (!types.isUndefinedOrNull((<IFileOperationResult>error).fileOperationResult)) {
|
||||
if (!types.isUndefinedOrNull((<FileOperationError>error).fileOperationResult)) {
|
||||
return TPromise.wrapError<IStreamContent>(error);
|
||||
}
|
||||
|
||||
@@ -295,10 +289,10 @@ export class FileService implements IFileService {
|
||||
|
||||
// Return if file not found
|
||||
if (!exists) {
|
||||
return TPromise.wrapError<IStreamContent>(<IFileOperationResult>{
|
||||
message: nls.localize('fileNotFoundError', "File not found ({0})", absolutePath),
|
||||
fileOperationResult: FileOperationResult.FILE_NOT_FOUND
|
||||
});
|
||||
return TPromise.wrapError<IStreamContent>(new FileOperationError(
|
||||
nls.localize('fileNotFoundError', "File not found ({0})", absolutePath),
|
||||
FileOperationResult.FILE_NOT_FOUND
|
||||
));
|
||||
}
|
||||
|
||||
// otherwise just give up
|
||||
@@ -472,17 +466,14 @@ export class FileService implements IFileService {
|
||||
|
||||
// Return early with conflict if target exists and we are not told to overwrite
|
||||
if (exists && !isCaseRename && !overwrite) {
|
||||
return TPromise.wrapError<boolean>(<IFileOperationResult>{
|
||||
message: nls.localize('fileMoveConflict', "Unable to move/copy. File already exists at destination."),
|
||||
fileOperationResult: FileOperationResult.FILE_MOVE_CONFLICT
|
||||
});
|
||||
return TPromise.wrapError<boolean>(new FileOperationError(nls.localize('fileMoveConflict', "Unable to move/copy. File already exists at destination."), FileOperationResult.FILE_MOVE_CONFLICT));
|
||||
}
|
||||
|
||||
// 2.) make sure target is deleted before we move/copy unless this is a case rename of the same file
|
||||
let deleteTargetPromise = TPromise.as<void>(void 0);
|
||||
if (exists && !isCaseRename) {
|
||||
if (isEqualOrParent(sourcePath, targetPath, !isLinux /* ignorecase */)) {
|
||||
return TPromise.wrapError<boolean>(nls.localize('unableToMoveCopyError', "Unable to move/copy. File would replace folder it is contained in.")); // catch this corner case!
|
||||
return TPromise.wrapError<boolean>(new Error(nls.localize('unableToMoveCopyError', "Unable to move/copy. File would replace folder it is contained in."))); // catch this corner case!
|
||||
}
|
||||
|
||||
deleteTargetPromise = this.del(uri.file(targetPath));
|
||||
@@ -514,7 +505,7 @@ export class FileService implements IFileService {
|
||||
// 1.) resolve
|
||||
return pfs.stat(sourcePath).then(stat => {
|
||||
if (stat.isDirectory()) {
|
||||
return TPromise.wrapError<IImportResult>(nls.localize('foldersCopyError', "Folders cannot be copied into the workspace. Please select individual files to copy them.")); // for now we do not allow to import a folder into a workspace
|
||||
return TPromise.wrapError<IImportResult>(new Error(nls.localize('foldersCopyError', "Folders cannot be copied into the workspace. Please select individual files to copy them."))); // for now we do not allow to import a folder into a workspace
|
||||
}
|
||||
|
||||
// 2.) copy
|
||||
@@ -574,10 +565,7 @@ export class FileService implements IFileService {
|
||||
|
||||
// Return early if file is too large to load
|
||||
if (types.isNumber(model.size) && model.size > MAX_FILE_SIZE) {
|
||||
return TPromise.wrapError<IStreamContent>(<IFileOperationResult>{
|
||||
message: nls.localize('fileTooLargeError', "File too large to open"),
|
||||
fileOperationResult: FileOperationResult.FILE_TOO_LARGE
|
||||
});
|
||||
return TPromise.wrapError<IStreamContent>(new FileOperationError(nls.localize('fileTooLargeError', "File too large to open"), FileOperationResult.FILE_TOO_LARGE));
|
||||
}
|
||||
|
||||
const absolutePath = this.toAbsolutePath(model);
|
||||
@@ -682,10 +670,7 @@ export class FileService implements IFileService {
|
||||
|
||||
// Find out if content length has changed
|
||||
if (options.etag !== etag(stat.size, options.mtime)) {
|
||||
return TPromise.wrapError<boolean>(<IFileOperationResult>{
|
||||
message: nls.localize('fileModifiedError', "File Modified Since"),
|
||||
fileOperationResult: FileOperationResult.FILE_MODIFIED_SINCE
|
||||
});
|
||||
return TPromise.wrapError<boolean>(new FileOperationError(nls.localize('fileModifiedError', "File Modified Since"), FileOperationResult.FILE_MODIFIED_SINCE));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -694,10 +679,10 @@ export class FileService implements IFileService {
|
||||
|
||||
// Throw if file is readonly and we are not instructed to overwrite
|
||||
if (readonly && !options.overwriteReadonly) {
|
||||
return TPromise.wrapError<boolean>(<IFileOperationResult>{
|
||||
message: nls.localize('fileReadOnlyError', "File is Read Only"),
|
||||
fileOperationResult: FileOperationResult.FILE_READ_ONLY
|
||||
});
|
||||
return TPromise.wrapError<boolean>(new FileOperationError(
|
||||
nls.localize('fileReadOnlyError', "File is Read Only"),
|
||||
FileOperationResult.FILE_READ_ONLY
|
||||
));
|
||||
}
|
||||
|
||||
if (readonly) {
|
||||
|
||||
@@ -12,7 +12,7 @@ import assert = require('assert');
|
||||
|
||||
import { TPromise } from 'vs/base/common/winjs.base';
|
||||
import { FileService, IEncodingOverride } from 'vs/workbench/services/files/node/fileService';
|
||||
import { FileOperation, FileOperationEvent, FileChangesEvent, FileOperationResult, IFileOperationResult } from 'vs/platform/files/common/files';
|
||||
import { FileOperation, FileOperationEvent, FileChangesEvent, FileOperationResult, FileOperationError } from 'vs/platform/files/common/files';
|
||||
import uri from 'vs/base/common/uri';
|
||||
import uuid = require('vs/base/common/uuid');
|
||||
import extfs = require('vs/base/node/extfs');
|
||||
@@ -229,7 +229,7 @@ suite('FileService', () => {
|
||||
});
|
||||
|
||||
service.resolveFile(uri.file(path.join(testDir, 'index.html'))).done(source => {
|
||||
return service.moveFile(source.resource, uri.file(path.join(testDir, 'binary.txt'))).then(null, (e: IFileOperationResult) => {
|
||||
return service.moveFile(source.resource, uri.file(path.join(testDir, 'binary.txt'))).then(null, (e: FileOperationError) => {
|
||||
assert.equal(e.fileOperationResult, FileOperationResult.FILE_MOVE_CONFLICT);
|
||||
|
||||
assert.ok(!event);
|
||||
@@ -603,7 +603,7 @@ suite('FileService', () => {
|
||||
test('resolveContent - FILE_IS_BINARY', function (done: () => void) {
|
||||
let resource = uri.file(path.join(testDir, 'binary.txt'));
|
||||
|
||||
service.resolveContent(resource, { acceptTextOnly: true }).done(null, (e: IFileOperationResult) => {
|
||||
service.resolveContent(resource, { acceptTextOnly: true }).done(null, (e: FileOperationError) => {
|
||||
assert.equal(e.fileOperationResult, FileOperationResult.FILE_IS_BINARY);
|
||||
|
||||
return service.resolveContent(uri.file(path.join(testDir, 'small.txt')), { acceptTextOnly: true }).then(r => {
|
||||
@@ -617,7 +617,7 @@ suite('FileService', () => {
|
||||
test('resolveContent - FILE_IS_DIRECTORY', function (done: () => void) {
|
||||
let resource = uri.file(path.join(testDir, 'deep'));
|
||||
|
||||
service.resolveContent(resource).done(null, (e: IFileOperationResult) => {
|
||||
service.resolveContent(resource).done(null, (e: FileOperationError) => {
|
||||
assert.equal(e.fileOperationResult, FileOperationResult.FILE_IS_DIRECTORY);
|
||||
|
||||
done();
|
||||
@@ -627,7 +627,7 @@ suite('FileService', () => {
|
||||
test('resolveContent - FILE_NOT_FOUND', function (done: () => void) {
|
||||
let resource = uri.file(path.join(testDir, '404.html'));
|
||||
|
||||
service.resolveContent(resource).done(null, (e: IFileOperationResult) => {
|
||||
service.resolveContent(resource).done(null, (e: FileOperationError) => {
|
||||
assert.equal(e.fileOperationResult, FileOperationResult.FILE_NOT_FOUND);
|
||||
|
||||
done();
|
||||
@@ -638,7 +638,7 @@ suite('FileService', () => {
|
||||
let resource = uri.file(path.join(testDir, 'index.html'));
|
||||
|
||||
service.resolveContent(resource).done(c => {
|
||||
return service.resolveContent(resource, { etag: c.etag }).then(null, (e: IFileOperationResult) => {
|
||||
return service.resolveContent(resource, { etag: c.etag }).then(null, (e: FileOperationError) => {
|
||||
assert.equal(e.fileOperationResult, FileOperationResult.FILE_NOT_MODIFIED_SINCE);
|
||||
|
||||
done();
|
||||
@@ -652,7 +652,7 @@ suite('FileService', () => {
|
||||
service.resolveContent(resource).done(c => {
|
||||
fs.writeFileSync(resource.fsPath, 'Updates Incoming!');
|
||||
|
||||
return service.updateContent(resource, c.value, { etag: c.etag, mtime: c.mtime - 1000 }).then(null, (e: IFileOperationResult) => {
|
||||
return service.updateContent(resource, c.value, { etag: c.etag, mtime: c.mtime - 1000 }).then(null, (e: FileOperationError) => {
|
||||
assert.equal(e.fileOperationResult, FileOperationResult.FILE_MODIFIED_SINCE);
|
||||
|
||||
done();
|
||||
|
||||
@@ -225,7 +225,7 @@ export class KeybindingsEditingService extends Disposable implements IKeybinding
|
||||
|
||||
// Target cannot be dirty if not writing into buffer
|
||||
if (this.textFileService.isDirty(this.resource)) {
|
||||
return TPromise.wrapError<IReference<ITextEditorModel>>(localize('errorKeybindingsFileDirty', "Unable to write because the file is dirty. Please save the **Keybindings** file and try again."));
|
||||
return TPromise.wrapError<IReference<ITextEditorModel>>(new Error(localize('errorKeybindingsFileDirty', "Unable to write because the file is dirty. Please save the **Keybindings** file and try again.")));
|
||||
}
|
||||
|
||||
return this.resolveModelReference()
|
||||
@@ -235,11 +235,11 @@ export class KeybindingsEditingService extends Disposable implements IKeybinding
|
||||
if (model.getValue()) {
|
||||
const parsed = this.parse(model);
|
||||
if (parsed.parseErrors.length) {
|
||||
return TPromise.wrapError<IReference<ITextEditorModel>>(localize('parseErrors', "Unable to write keybindings. Please open **Keybindings file** to correct errors/warnings in the file and try again."));
|
||||
return TPromise.wrapError<IReference<ITextEditorModel>>(new Error(localize('parseErrors', "Unable to write keybindings. Please open **Keybindings file** to correct errors/warnings in the file and try again.")));
|
||||
}
|
||||
if (parsed.result) {
|
||||
if (!isArray(parsed.result)) {
|
||||
return TPromise.wrapError<IReference<ITextEditorModel>>(localize('errorInvalidConfiguration', "Unable to write keybindings. **Keybindings file** has an object which is not of type Array. Please open the file to clean up and try again."));
|
||||
return TPromise.wrapError<IReference<ITextEditorModel>>(new Error(localize('errorInvalidConfiguration', "Unable to write keybindings. **Keybindings file** has an object which is not of type Array. Please open the file to clean up and try again.")));
|
||||
}
|
||||
} else {
|
||||
const content = EOL + '[]';
|
||||
|
||||
@@ -111,28 +111,28 @@ suite('Keybindings Editing', () => {
|
||||
fs.writeFileSync(keybindingsFile, ',,,,,,,,,,,,,,');
|
||||
return testObject.editKeybinding('alt+c', aResolvedKeybindingItem({ firstPart: { keyCode: KeyCode.Escape } }))
|
||||
.then(() => assert.fail('Should fail with parse errors'),
|
||||
error => assert.equal(error, 'Unable to write keybindings. Please open **Keybindings file** to correct errors/warnings in the file and try again.'));
|
||||
error => assert.equal(error.message, 'Unable to write keybindings. Please open **Keybindings file** to correct errors/warnings in the file and try again.'));
|
||||
});
|
||||
|
||||
test('errors cases - parse errors 2', () => {
|
||||
fs.writeFileSync(keybindingsFile, '[{"key": }]');
|
||||
return testObject.editKeybinding('alt+c', aResolvedKeybindingItem({ firstPart: { keyCode: KeyCode.Escape } }))
|
||||
.then(() => assert.fail('Should fail with parse errors'),
|
||||
error => assert.equal(error, 'Unable to write keybindings. Please open **Keybindings file** to correct errors/warnings in the file and try again.'));
|
||||
error => assert.equal(error.message, 'Unable to write keybindings. Please open **Keybindings file** to correct errors/warnings in the file and try again.'));
|
||||
});
|
||||
|
||||
test('errors cases - dirty', () => {
|
||||
instantiationService.stub(ITextFileService, 'isDirty', true);
|
||||
return testObject.editKeybinding('alt+c', aResolvedKeybindingItem({ firstPart: { keyCode: KeyCode.Escape } }))
|
||||
.then(() => assert.fail('Should fail with dirty error'),
|
||||
error => assert.equal(error, 'Unable to write because the file is dirty. Please save the **Keybindings** file and try again.'));
|
||||
error => assert.equal(error.message, 'Unable to write because the file is dirty. Please save the **Keybindings** file and try again.'));
|
||||
});
|
||||
|
||||
test('errors cases - did not find an array', () => {
|
||||
fs.writeFileSync(keybindingsFile, '{"key": "alt+c", "command": "hello"}');
|
||||
return testObject.editKeybinding('alt+c', aResolvedKeybindingItem({ firstPart: { keyCode: KeyCode.Escape } }))
|
||||
.then(() => assert.fail('Should fail with dirty error'),
|
||||
error => assert.equal(error, 'Unable to write keybindings. **Keybindings file** has an object which is not of type Array. Please open the file to clean up and try again.'));
|
||||
error => assert.equal(error.message, 'Unable to write keybindings. **Keybindings file** has an object which is not of type Array. Please open the file to clean up and try again.'));
|
||||
});
|
||||
|
||||
test('edit a default keybinding to an empty file', () => {
|
||||
|
||||
@@ -25,7 +25,7 @@ import { ITextFileService, IAutoSaveConfiguration, ModelState, ITextFileEditorMo
|
||||
import { EncodingMode } from 'vs/workbench/common/editor';
|
||||
import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel';
|
||||
import { IBackupFileService, BACKUP_FILE_RESOLVE_OPTIONS } from 'vs/workbench/services/backup/common/backup';
|
||||
import { IFileService, IFileStat, IFileOperationResult, FileOperationResult, IContent, CONTENT_CHANGE_EVENT_BUFFER_DELAY, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files';
|
||||
import { IFileService, IFileStat, FileOperationError, FileOperationResult, IContent, CONTENT_CHANGE_EVENT_BUFFER_DELAY, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { IMessageService, Severity } from 'vs/platform/message/common/message';
|
||||
import { IModeService } from 'vs/editor/common/services/modeService';
|
||||
@@ -331,7 +331,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
|
||||
return this.loadWithContent(content);
|
||||
}
|
||||
|
||||
private handleLoadError(error: IFileOperationResult): TPromise<TextFileEditorModel> {
|
||||
private handleLoadError(error: FileOperationError): TPromise<TextFileEditorModel> {
|
||||
const result = error.fileOperationResult;
|
||||
|
||||
// Apply orphaned state based on error code
|
||||
@@ -699,7 +699,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
|
||||
this.inErrorMode = true;
|
||||
|
||||
// Look out for a save conflict
|
||||
if ((<IFileOperationResult>error).fileOperationResult === FileOperationResult.FILE_MODIFIED_SINCE) {
|
||||
if ((<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_MODIFIED_SINCE) {
|
||||
this.inConflictMode = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ import { IRevertOptions, IResult, ITextFileOperationResult, ITextFileService, IR
|
||||
import { ConfirmResult } from 'vs/workbench/common/editor';
|
||||
import { ILifecycleService, ShutdownReason } from 'vs/platform/lifecycle/common/lifecycle';
|
||||
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
|
||||
import { IFileService, IResolveContentOptions, IFilesConfiguration, IFileOperationResult, FileOperationResult, AutoSaveConfiguration, HotExitConfiguration } from 'vs/platform/files/common/files';
|
||||
import { IFileService, IResolveContentOptions, IFilesConfiguration, FileOperationError, FileOperationResult, AutoSaveConfiguration, HotExitConfiguration } from 'vs/platform/files/common/files';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||
@@ -602,7 +602,7 @@ export abstract class TextFileService implements ITextFileService {
|
||||
}, error => {
|
||||
|
||||
// binary model: delete the file and run the operation again
|
||||
if ((<IFileOperationResult>error).fileOperationResult === FileOperationResult.FILE_IS_BINARY || (<IFileOperationResult>error).fileOperationResult === FileOperationResult.FILE_TOO_LARGE) {
|
||||
if ((<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_IS_BINARY || (<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_TOO_LARGE) {
|
||||
return this.fileService.del(target).then(() => this.doSaveTextFileAs(sourceModel, resource, target));
|
||||
}
|
||||
|
||||
@@ -654,7 +654,7 @@ export abstract class TextFileService implements ITextFileService {
|
||||
}, error => {
|
||||
|
||||
// FileNotFound means the file got deleted meanwhile, so still record as successful revert
|
||||
if ((<IFileOperationResult>error).fileOperationResult === FileOperationResult.FILE_NOT_FOUND) {
|
||||
if ((<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_NOT_FOUND) {
|
||||
mapResourceToResult.get(model.getResource()).success = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ import { ITextFileService, ModelState, StateChange } from 'vs/workbench/services
|
||||
import { workbenchInstantiationService, TestTextFileService, createFileInput, TestFileService } from 'vs/workbench/test/workbenchTestServices';
|
||||
import { onError, toResource } from 'vs/base/test/common/utils';
|
||||
import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager';
|
||||
import { FileOperationResult, IFileOperationResult, IFileService } from 'vs/platform/files/common/files';
|
||||
import { FileOperationResult, FileOperationError, IFileService } from 'vs/platform/files/common/files';
|
||||
import { IModelService } from 'vs/editor/common/services/modelService';
|
||||
|
||||
class ServiceAccessor {
|
||||
@@ -195,10 +195,7 @@ suite('Files - TextFileEditorModel', () => {
|
||||
|
||||
model.load().done(() => {
|
||||
const mtime = getLastModifiedTime(model);
|
||||
accessor.textFileService.setResolveTextContentErrorOnce(<IFileOperationResult>{
|
||||
message: 'error',
|
||||
fileOperationResult: FileOperationResult.FILE_NOT_MODIFIED_SINCE
|
||||
});
|
||||
accessor.textFileService.setResolveTextContentErrorOnce(new FileOperationError('error', FileOperationResult.FILE_NOT_MODIFIED_SINCE));
|
||||
|
||||
return model.load().then((model: TextFileEditorModel) => {
|
||||
assert.ok(model);
|
||||
@@ -214,10 +211,7 @@ suite('Files - TextFileEditorModel', () => {
|
||||
const model: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/index_async.txt'), 'utf8');
|
||||
|
||||
model.load().done(() => {
|
||||
accessor.textFileService.setResolveTextContentErrorOnce(<IFileOperationResult>{
|
||||
message: 'error',
|
||||
fileOperationResult: FileOperationResult.FILE_NOT_FOUND
|
||||
});
|
||||
accessor.textFileService.setResolveTextContentErrorOnce(new FileOperationError('error', FileOperationResult.FILE_NOT_FOUND));
|
||||
|
||||
return model.load().then((model: TextFileEditorModel) => {
|
||||
assert.ok(model);
|
||||
@@ -329,7 +323,7 @@ suite('Files - TextFileEditorModel', () => {
|
||||
|
||||
TextFileEditorModel.setSaveParticipant({
|
||||
participate: (model) => {
|
||||
return TPromise.wrapError('boom');
|
||||
return TPromise.wrapError(new Error('boom'));
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -84,7 +84,7 @@ class ResourceModelCollection extends ReferenceCollection<TPromise<ITextEditorMo
|
||||
return first(factories).then(model => {
|
||||
if (!model) {
|
||||
console.error(`Unable to open '${resource}' resource is not available.`); // TODO PII
|
||||
return TPromise.wrapError<IModel>('resource is not available');
|
||||
return TPromise.wrapError<IModel>(new Error('resource is not available'));
|
||||
}
|
||||
|
||||
return model;
|
||||
@@ -125,7 +125,7 @@ export class TextModelResolverService implements ITextModelService {
|
||||
const cachedModel = this.modelService.getModel(resource);
|
||||
|
||||
if (!cachedModel) {
|
||||
return TPromise.wrapError<IReference<ITextEditorModel>>('Cant resolve inmemory resource');
|
||||
return TPromise.wrapError<IReference<ITextEditorModel>>(new Error('Cant resolve inmemory resource'));
|
||||
}
|
||||
|
||||
return TPromise.as(new ImmortalReference(this.instantiationService.createInstance(ResourceEditorModel, resource)));
|
||||
|
||||
@@ -402,7 +402,7 @@ export class WorkbenchThemeService implements IWorkbenchThemeService {
|
||||
this.updateDynamicCSSRules(themeData);
|
||||
return this.applyTheme(themeData, settingsTarget);
|
||||
}, error => {
|
||||
return TPromise.wrapError<IColorTheme>(nls.localize('error.cannotloadtheme', "Unable to load {0}: {1}", themeData.path, error.message));
|
||||
return TPromise.wrapError<IColorTheme>(new Error(nls.localize('error.cannotloadtheme', "Unable to load {0}: {1}", themeData.path, error.message)));
|
||||
});
|
||||
}
|
||||
return null;
|
||||
@@ -734,7 +734,7 @@ function _applyIconTheme(data: IInternalIconThemeData, onApply: (theme: IInterna
|
||||
_applyRules(data.styleSheetContent, iconThemeRulesClassName);
|
||||
return onApply(data);
|
||||
}, error => {
|
||||
return TPromise.wrapError<IFileIconTheme>(nls.localize('error.cannotloadicontheme', "Unable to load {0}", data.path));
|
||||
return TPromise.wrapError<IFileIconTheme>(new Error(nls.localize('error.cannotloadicontheme', "Unable to load {0}", data.path)));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ suite('ExtHostLanguageFeatureCommands', function () {
|
||||
_serviceBrand: undefined,
|
||||
executeCommand(id, args): any {
|
||||
if (!CommandsRegistry.getCommands()[id]) {
|
||||
return TPromise.wrapError(id + ' NOT known');
|
||||
return TPromise.wrapError(new Error(id + ' NOT known'));
|
||||
}
|
||||
let { handler } = CommandsRegistry.getCommands()[id];
|
||||
return TPromise.as(instantiationService.invokeFunction(handler, args));
|
||||
|
||||
@@ -11,7 +11,7 @@ import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace';
|
||||
import { ExtHostConfiguration } from 'vs/workbench/api/node/extHostConfiguration';
|
||||
import { MainThreadConfigurationShape } from 'vs/workbench/api/node/extHost.protocol';
|
||||
import { TPromise } from 'vs/base/common/winjs.base';
|
||||
import { ConfigurationTarget, ConfigurationEditingErrorCode, IConfigurationEditingError } from 'vs/workbench/services/configuration/common/configurationEditing';
|
||||
import { ConfigurationTarget, ConfigurationEditingErrorCode, ConfigurationEditingError } from 'vs/workbench/services/configuration/common/configurationEditing';
|
||||
import { ConfigurationModel } from 'vs/platform/configuration/common/configuration';
|
||||
import { TestThreadService } from './testThreadService';
|
||||
|
||||
@@ -213,7 +213,7 @@ suite('ExtHostConfiguration', function () {
|
||||
|
||||
const shape = new class extends MainThreadConfigurationShape {
|
||||
$updateConfigurationOption(target: ConfigurationTarget, key: string, value: any): TPromise<any> {
|
||||
return TPromise.wrapError(<IConfigurationEditingError>{ code: ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY, message: 'Unknown Key' }); // something !== OK
|
||||
return TPromise.wrapError(new ConfigurationEditingError('Unknown Key', ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY)); // something !== OK
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -235,7 +235,7 @@ suite('ExtHostDocumentSaveParticipant', () => {
|
||||
const participant = new ExtHostDocumentSaveParticipant(documents, workspace);
|
||||
|
||||
let sub1 = participant.onWillSaveTextDocumentEvent(function (e) {
|
||||
e.waitUntil(TPromise.wrapError('dddd'));
|
||||
e.waitUntil(TPromise.wrapError(new Error('dddd')));
|
||||
});
|
||||
|
||||
let event: vscode.TextDocumentWillSaveEvent;
|
||||
|
||||
@@ -34,7 +34,7 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle
|
||||
import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService';
|
||||
import { IEditorGroupService, GroupArrangement, GroupOrientation, ITabOptions, IMoveOptions } from 'vs/workbench/services/group/common/groupService';
|
||||
import { TextFileService } from 'vs/workbench/services/textfile/common/textFileService';
|
||||
import { FileOperationEvent, IFileService, IResolveContentOptions, IFileOperationResult, IFileStat, IImportResult, FileChangesEvent, IResolveFileOptions, IContent, IUpdateContentOptions, IStreamContent } from 'vs/platform/files/common/files';
|
||||
import { FileOperationEvent, IFileService, IResolveContentOptions, FileOperationError, IFileStat, IImportResult, FileChangesEvent, IResolveFileOptions, IContent, IUpdateContentOptions, IStreamContent } from 'vs/platform/files/common/files';
|
||||
import { IModelService } from 'vs/editor/common/services/modelService';
|
||||
import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl';
|
||||
import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl';
|
||||
@@ -143,7 +143,7 @@ export class TestTextFileService extends TextFileService {
|
||||
|
||||
private promptPath: string;
|
||||
private confirmResult: ConfirmResult;
|
||||
private resolveTextContentError: IFileOperationResult;
|
||||
private resolveTextContentError: FileOperationError;
|
||||
|
||||
constructor(
|
||||
@ILifecycleService lifecycleService: ILifecycleService,
|
||||
@@ -170,7 +170,7 @@ export class TestTextFileService extends TextFileService {
|
||||
this.confirmResult = result;
|
||||
}
|
||||
|
||||
public setResolveTextContentErrorOnce(error: IFileOperationResult): void {
|
||||
public setResolveTextContentErrorOnce(error: FileOperationError): void {
|
||||
this.resolveTextContentError = error;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user