diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index e40b62830fb..eb306058711 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -1078,11 +1078,12 @@ class CallHierarchyAdapter { } releaseSession(sessionId: string): void { - this._cache.delete(sessionId); + this._cache.delete(sessionId.charAt(0)); } - private _cacheAndConvertItem(sessionId: string, item: vscode.CallHierarchyItem): extHostProtocol.ICallHierarchyItemDto { - const array = this._cache.get(sessionId.charAt(0))!; + private _cacheAndConvertItem(itemOrSessionId: string, item: vscode.CallHierarchyItem): extHostProtocol.ICallHierarchyItemDto { + const sessionId = itemOrSessionId.charAt(0); + const array = this._cache.get(sessionId)!; const dto: extHostProtocol.ICallHierarchyItemDto = { id: sessionId + String.fromCharCode(array.length), name: item.name, diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts index f96bcf3eebe..0ed48a860b4 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts @@ -269,12 +269,8 @@ export class CallHierarchyTreePeekWidget extends PeekViewWidget { let previewUri: URI; if (this._direction === CallHierarchyDirection.CallsFrom) { // outgoing calls: show caller and highlight focused calls - const parent = this._tree.getParentElement(element); - if (parent instanceof callHTree.Call) { - previewUri = parent.item.uri; - } else { - previewUri = parent.root.uri; - } + previewUri = element.parent ? element.parent.item.uri : element.model.root.uri; + } else { // incoming calls: show caller and highlight focused calls previewUri = element.item.uri; diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts index b7a8a59ef64..af83dbfa8ae 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts @@ -16,7 +16,8 @@ export class Call { constructor( readonly item: CallHierarchyItem, readonly locations: Location[], - readonly model: CallHierarchyModel + readonly model: CallHierarchyModel, + readonly parent: Call | undefined ) { } } @@ -32,41 +33,32 @@ export class DataSource implements IAsyncDataSource { async getChildren(element: CallHierarchyModel | Call): Promise { if (element instanceof CallHierarchyModel) { - return [new Call(element.root, [], element)]; + return [new Call(element.root, [], element, undefined)]; } - const results: Call[] = []; + const { model, item } = element; + if (this.getDirection() === CallHierarchyDirection.CallsFrom) { - await this._getOutgoingCalls(element.model, element.item, results); + return (await model.resolveOutgoingCalls(item, CancellationToken.None)).map(call => { + return new Call( + call.to, + call.fromRanges.map(range => ({ range, uri: item.uri })), + model, + element + ); + }); + } else { - await this._getIncomingCalls(element.model, element.item, results); - } - return results; - } - - private async _getOutgoingCalls(model: CallHierarchyModel, item: CallHierarchyItem, bucket: Call[]): Promise { - - const outgoingCalls = await model.resolveOutgoingCalls(item, CancellationToken.None); - for (const call of outgoingCalls) { - bucket.push(new Call( - call.to, - call.fromRanges.map(range => ({ range, uri: item.uri })), - model - )); + return (await model.resolveIncomingCalls(item, CancellationToken.None)).map(call => { + return new Call( + call.from, + call.fromRanges.map(range => ({ range, uri: call.from.uri })), + model, + element + ); + }); } } - - private async _getIncomingCalls(model: CallHierarchyModel, item: CallHierarchyItem, bucket: Call[]): Promise { - const incomingCalls = await model.resolveIncomingCalls(item, CancellationToken.None); - for (const call of incomingCalls) { - bucket.push(new Call( - call.from, - call.fromRanges.map(range => ({ range, uri: call.from.uri })), - model - )); - } - } - }