From 37398ea53e6eca59b99b7e2884a62f9918feec51 Mon Sep 17 00:00:00 2001 From: Pine Wu Date: Thu, 20 Oct 2016 22:54:52 -0700 Subject: [PATCH] Handle all error by showing message --- src/vs/workbench/api/node/extHost.protocol.ts | 1 + .../api/node/extHostTreeExplorers.ts | 35 ++++++++++--------- .../api/node/mainThreadTreeExplorers.ts | 8 ++++- .../browser/treeExplorerViewletService.ts | 23 +++++++++--- 4 files changed, 46 insertions(+), 21 deletions(-) diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 35fc36042a6..643722e1b8c 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -119,6 +119,7 @@ export abstract class MainThreadEditorsShape { export abstract class MainThreadTreeExplorersShape { $registerTreeExplorerNodeProvider(providerId: string): void { throw ni(); } + $showMessage(severity: Severity, message: string): void { throw ni(); } } export abstract class MainThreadErrorsShape { diff --git a/src/vs/workbench/api/node/extHostTreeExplorers.ts b/src/vs/workbench/api/node/extHostTreeExplorers.ts index 6c2b28020d5..53a903c16d8 100644 --- a/src/vs/workbench/api/node/extHostTreeExplorers.ts +++ b/src/vs/workbench/api/node/extHostTreeExplorers.ts @@ -12,6 +12,7 @@ import { MainContext, ExtHostTreeExplorersShape, MainThreadTreeExplorersShape } import { InternalTreeExplorerNode } from 'vs/workbench/parts/explorers/common/treeExplorerViewModel'; import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; import { asWinJsPromise } from 'vs/base/common/async'; +import { Severity } from 'vs/platform/message/common/message'; export class ExtHostTreeExplorers extends ExtHostTreeExplorersShape { private _proxy: MainThreadTreeExplorersShape; @@ -41,10 +42,7 @@ export class ExtHostTreeExplorers extends ExtHostTreeExplorersShape { } $provideRootNode(providerId: string): TPromise { - const provider = this._treeExplorerNodeProviders[providerId]; - if (!provider) { - throw new Error(`no TreeExplorerNodeProvider registered with id '${providerId}'`); - } + const provider = this.getProvider(providerId); return asWinJsPromise(() => provider.provideRootNode()).then(externalRootNode => { const treeNodeMap = Object.create(null); @@ -54,15 +52,12 @@ export class ExtHostTreeExplorers extends ExtHostTreeExplorersShape { this._externalNodeMaps[providerId][internalRootNode.id] = externalRootNode; return internalRootNode; }, err => { - throw new Error(`TreeExplorerNodeProvider '${providerId}' failed to provide root node`); + this.showErrorMessage(`TreeExplorerNodeProvider '${providerId}' failed to provide root node.`); }); } $resolveChildren(providerId: string, mainThreadNode: InternalTreeExplorerNode): TPromise { - const provider = this._treeExplorerNodeProviders[providerId]; - if (!provider) { - throw new Error(`no TreeExplorerNodeProvider registered with id '${providerId}'`); - } + const provider = this.getProvider(providerId); const externalNodeMap = this._externalNodeMaps[providerId]; const externalNode = externalNodeMap[mainThreadNode.id]; @@ -74,25 +69,33 @@ export class ExtHostTreeExplorers extends ExtHostTreeExplorersShape { return internalChild; }); }, err => { - throw new Error(`TreeExplorerNodeProvider '${providerId}' failed to resolveChildren`); + this.showErrorMessage(`TreeExplorerNodeProvider '${providerId}' failed to resolve children.`); }); } $executeCommand(providerId: string, mainThreadNode: InternalTreeExplorerNode): TPromise { - const provider = this._treeExplorerNodeProviders[providerId]; - if (!provider) { - throw new Error(`no TreeExplorerNodeProvider registered with id '${providerId}'`); - } - if (mainThreadNode.clickCommand) { const externalNode = this._externalNodeMaps[providerId][mainThreadNode.id]; return asWinJsPromise(() => this.commands.executeCommand(mainThreadNode.clickCommand, externalNode)).then(() => { return null; }, err => { - throw new Error(`Failed to execute command '${mainThreadNode.clickCommand}' provided by TreeExplorerNodeProvider '${providerId}'`); + this.showErrorMessage(`Failed to execute command '${mainThreadNode.clickCommand}' provided by TreeExplorerNodeProvider '${providerId}'.`); }); } return TPromise.as(null); } + + getProvider(providerId: string): TreeExplorerNodeProvider { + const provider = this._treeExplorerNodeProviders[providerId]; + if (!provider) { + this.showErrorMessage(`No TreeExplorerNodeProvider with id '${providerId}' registered.`); + } + + return provider; + } + + private showErrorMessage(message: string): void { + this._proxy.$showMessage(Severity.Error, message); + } } diff --git a/src/vs/workbench/api/node/mainThreadTreeExplorers.ts b/src/vs/workbench/api/node/mainThreadTreeExplorers.ts index fc8985d8399..463051e0053 100644 --- a/src/vs/workbench/api/node/mainThreadTreeExplorers.ts +++ b/src/vs/workbench/api/node/mainThreadTreeExplorers.ts @@ -9,13 +9,15 @@ import { IThreadService } from 'vs/workbench/services/thread/common/threadServic import { ExtHostContext, MainThreadTreeExplorersShape, ExtHostTreeExplorersShape } from './extHost.protocol'; import { ITreeExplorerViewletService } from 'vs/workbench/parts/explorers/browser/treeExplorerViewletService'; import { InternalTreeExplorerNode } from 'vs/workbench/parts/explorers/common/treeExplorerViewModel'; +import { IMessageService, Severity } from 'vs/platform/message/common/message'; export class MainThreadTreeExplorers extends MainThreadTreeExplorersShape { private _proxy: ExtHostTreeExplorersShape; constructor( @IThreadService threadService: IThreadService, - @ITreeExplorerViewletService private treeExplorerService: ITreeExplorerViewletService + @ITreeExplorerViewletService private treeExplorerService: ITreeExplorerViewletService, + @IMessageService private messageService: IMessageService ) { super(); @@ -35,4 +37,8 @@ export class MainThreadTreeExplorers extends MainThreadTreeExplorersShape { } }); } + + $showMessage(severity: Severity, message: string): void { + this.messageService.show(severity, message); + } } diff --git a/src/vs/workbench/parts/explorers/browser/treeExplorerViewletService.ts b/src/vs/workbench/parts/explorers/browser/treeExplorerViewletService.ts index 50c83853cac..e731c121ad4 100644 --- a/src/vs/workbench/parts/explorers/browser/treeExplorerViewletService.ts +++ b/src/vs/workbench/parts/explorers/browser/treeExplorerViewletService.ts @@ -7,6 +7,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IInstantiationService, createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { InternalTreeExplorerNode, InternalTreeExplorerNodeProvider } from 'vs/workbench/parts/explorers/common/treeExplorerViewModel'; +import { IMessageService, Severity } from 'vs/platform/message/common/message'; export const ITreeExplorerViewletService = createDecorator('customViewletService'); @@ -25,7 +26,8 @@ export class TreeExplorerViewletService implements ITreeExplorerViewletService { private _treeExplorerNodeProvider: { [providerId: string]: InternalTreeExplorerNodeProvider }; constructor( - @IInstantiationService private _instantiationService: IInstantiationService + @IInstantiationService private _instantiationService: IInstantiationService, + @IMessageService private messageService: IMessageService, ) { this._treeExplorerNodeProvider = Object.create(null); } @@ -35,14 +37,27 @@ export class TreeExplorerViewletService implements ITreeExplorerViewletService { } provideTreeContent(providerId: string): TPromise { - return TPromise.wrap(this._treeExplorerNodeProvider[providerId].provideRootNode()); + const provider = this.getProvider(providerId); + return TPromise.wrap(provider.provideRootNode()); } resolveChildren(providerId: string, node: InternalTreeExplorerNode): TPromise { - return TPromise.wrap(this._treeExplorerNodeProvider[providerId].resolveChildren(node)); + const provider = this.getProvider(providerId); + return TPromise.wrap(provider.resolveChildren(node)); } executeCommand(providerId: string, node: InternalTreeExplorerNode): TPromise { - return TPromise.wrap(this._treeExplorerNodeProvider[providerId].executeCommand(node)); + const provider = this.getProvider(providerId); + return TPromise.wrap(provider.executeCommand(node)); + } + + private getProvider(providerId: string): InternalTreeExplorerNodeProvider { + const provider = this._treeExplorerNodeProvider[providerId]; + + if (!provider) { + this.messageService.show(Severity.Error, `No TreeExplorerNodeProvider with id '${providerId}' registered.`); + } + + return provider; } }