From e6df99aed88787c162126a9f99b36a183dd43ff2 Mon Sep 17 00:00:00 2001 From: jrieken Date: Wed, 11 Sep 2019 08:01:13 +0000 Subject: [PATCH 1/6] implement CallsFrom/CallsTo proposal --- src/vs/vscode.proposed.d.ts | 41 +++++------ .../api/browser/mainThreadLanguageFeatures.ts | 40 +++++++---- .../workbench/api/common/extHost.api.impl.ts | 3 +- .../workbench/api/common/extHost.protocol.ts | 7 +- .../api/common/extHostLanguageFeatures.ts | 68 +++++++++++-------- src/vs/workbench/api/common/extHostTypes.ts | 27 ++++++-- .../browser/callHierarchy.contribution.ts | 2 +- .../browser/callHierarchyPeek.ts | 2 +- .../browser/callHierarchyTree.ts | 55 ++++++++++++--- .../callHierarchy/common/callHierarchy.ts | 33 +++++---- 10 files changed, 172 insertions(+), 106 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 911dc43e83174..7e70fbc1c5353 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -18,11 +18,6 @@ declare module 'vscode' { //#region Joh - call hierarchy - export enum CallHierarchyDirection { - CallsFrom = 1, - CallsTo = 2, - } - export class CallHierarchyItem { kind: SymbolKind; name: string; @@ -34,33 +29,29 @@ declare module 'vscode' { constructor(kind: SymbolKind, name: string, detail: string, uri: Uri, range: Range, selectionRange: Range); } + export class CallsTo { + source: CallHierarchyItem; + sourceRanges: Range[]; + constructor(item: CallHierarchyItem, sourceRanges: Range[]); + } + + export class CallsFrom { + sourceRanges: Range[]; + target: CallHierarchyItem; + constructor(item: CallHierarchyItem, sourceRanges: Range[]); + } + export interface CallHierarchyItemProvider { /** * Given a document and position compute a call hierarchy item. This is justed as * anchor for call hierarchy and then `resolveCallHierarchyItem` is being called. */ - provideCallHierarchyItem( - document: TextDocument, - position: Position, - token: CancellationToken - ): ProviderResult; + resolveCallHierarchyItem(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - /** - * Resolve a call hierarchy item, e.g. compute all calls from or to a function. - * The result is an array of item/location-tuples. The location in the returned tuples - * is always relative to the "caller" with the caller either being the provided item or - * the returned item. - * - * @param item A call hierarchy item previously returned from `provideCallHierarchyItem` or `resolveCallHierarchyItem` - * @param direction Resolve calls from a function or calls to a function - * @param token A cancellation token - */ - resolveCallHierarchyItem( - item: CallHierarchyItem, - direction: CallHierarchyDirection, - token: CancellationToken - ): ProviderResult<[CallHierarchyItem, Location[]][]>; + provideCallsTo(target: CallHierarchyItem, token: CancellationToken): ProviderResult; + + provideCallsFrom(source: CallHierarchyItem, token: CancellationToken): ProviderResult; } export namespace languages { diff --git a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts index 966a740a4f112..26ce381604c8c 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts @@ -11,7 +11,7 @@ import * as search from 'vs/workbench/contrib/search/common/search'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Position as EditorPosition } from 'vs/editor/common/core/position'; import { Range as EditorRange, IRange } from 'vs/editor/common/core/range'; -import { ExtHostContext, MainThreadLanguageFeaturesShape, ExtHostLanguageFeaturesShape, MainContext, IExtHostContext, ILanguageConfigurationDto, IRegExpDto, IIndentationRuleDto, IOnEnterRuleDto, ILocationDto, IWorkspaceSymbolDto, reviveWorkspaceEditDto, IDocumentFilterDto, IDefinitionLinkDto, ISignatureHelpProviderMetadataDto, ILinkDto, ICallHierarchyDto, ISuggestDataDto, ICodeActionDto } from '../common/extHost.protocol'; +import { ExtHostContext, MainThreadLanguageFeaturesShape, ExtHostLanguageFeaturesShape, MainContext, IExtHostContext, ILanguageConfigurationDto, IRegExpDto, IIndentationRuleDto, IOnEnterRuleDto, ILocationDto, IWorkspaceSymbolDto, reviveWorkspaceEditDto, IDocumentFilterDto, IDefinitionLinkDto, ISignatureHelpProviderMetadataDto, ILinkDto, ICallHierarchyItemDto, ISuggestDataDto, ICodeActionDto } from '../common/extHost.protocol'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { LanguageConfiguration, IndentationRule, OnEnterRule } from 'vs/editor/common/modes/languageConfiguration'; import { IModeService } from 'vs/editor/common/services/modeService'; @@ -111,7 +111,7 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha return data; } - private static _reviveCallHierarchyItemDto(data: ICallHierarchyDto | undefined): callh.CallHierarchyItem { + private static _reviveCallHierarchyItemDto(data: ICallHierarchyItemDto | undefined): callh.CallHierarchyItem { if (data) { data.uri = URI.revive(data.uri); } @@ -494,21 +494,31 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha $registerCallHierarchyProvider(handle: number, selector: IDocumentFilterDto[]): void { this._registrations.set(handle, callh.CallHierarchyProviderRegistry.register(selector, { - provideCallHierarchyItem: (document, position, token) => { - return this._proxy.$provideCallHierarchyItem(handle, document.uri, position, token).then(MainThreadLanguageFeatures._reviveCallHierarchyItemDto); + resolveCallHierarchyItem: (document, position, token) => { + return this._proxy.$resolveCallHierarchyItem(handle, document.uri, position, token).then(MainThreadLanguageFeatures._reviveCallHierarchyItemDto); }, - resolveCallHierarchyItem: (item, direction, token) => { - return this._proxy.$resolveCallHierarchyItem(handle, item, direction, token).then(data => { - if (data) { - for (let i = 0; i < data.length; i++) { - const [item, locations] = data[i]; - data[i] = [ - MainThreadLanguageFeatures._reviveCallHierarchyItemDto(item), - MainThreadLanguageFeatures._reviveLocationDto(locations) - ]; - } + provideCallsFrom: async (item, token) => { + const callsFrom = await this._proxy.$provideCallHierarchyItemsFrom(handle, item, token); + if (!callsFrom) { + return callsFrom; + } + return callsFrom.map(([item, sourceRanges]): callh.CallsFrom => { + return { + target: MainThreadLanguageFeatures._reviveCallHierarchyItemDto(item), + sourceRanges + } + }); + }, + provideCallsTo: async (item, token) => { + const callsTo = await this._proxy.$provideCallHierarchyItemsTo(handle, item, token); + if (!callsTo) { + return callsTo; + } + return callsTo.map(([item, sourceRanges]): callh.CallsTo => { + return { + source: MainThreadLanguageFeatures._reviveCallHierarchyItemDto(item), + sourceRanges } - return data as [callh.CallHierarchyItem, modes.Location[]][]; }); } })); diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 8ad00122b890a..620d4e3c42d87 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -893,7 +893,8 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I ViewColumn: extHostTypes.ViewColumn, WorkspaceEdit: extHostTypes.WorkspaceEdit, // proposed - CallHierarchyDirection: extHostTypes.CallHierarchyDirection, + CallsFrom: extHostTypes.CallsFrom, + CallsTo: extHostTypes.CallsTo, CallHierarchyItem: extHostTypes.CallHierarchyItem, Decoration: extHostTypes.Decoration }; diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 901509be9852c..8643aeec33683 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1067,7 +1067,7 @@ export interface ICodeLensDto { command?: ICommandDto; } -export interface ICallHierarchyDto { +export interface ICallHierarchyItemDto { _id: number; kind: modes.SymbolKind; name: string; @@ -1111,8 +1111,9 @@ export interface ExtHostLanguageFeaturesShape { $provideColorPresentations(handle: number, resource: UriComponents, colorInfo: IRawColorInfo, token: CancellationToken): Promise; $provideFoldingRanges(handle: number, resource: UriComponents, context: modes.FoldingContext, token: CancellationToken): Promise; $provideSelectionRanges(handle: number, resource: UriComponents, positions: IPosition[], token: CancellationToken): Promise; - $provideCallHierarchyItem(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; - $resolveCallHierarchyItem(handle: number, item: callHierarchy.CallHierarchyItem, direction: callHierarchy.CallHierarchyDirection, token: CancellationToken): Promise<[ICallHierarchyDto, modes.Location[]][]>; + $resolveCallHierarchyItem(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; + $provideCallHierarchyItemsTo(handle: number, target: callHierarchy.CallHierarchyItem, token: CancellationToken): Promise<[ICallHierarchyItemDto, IRange[]][] | undefined>; + $provideCallHierarchyItemsFrom(handle: number, source: callHierarchy.CallHierarchyItem, token: CancellationToken): Promise<[ICallHierarchyItemDto, IRange[]][] | undefined>; } export interface ExtHostQuickOpenShape { diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index d60f8d24cd789..1d166cad13c30 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -14,7 +14,7 @@ import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; import { ExtHostCommands, CommandsConverter } from 'vs/workbench/api/common/extHostCommands'; import { ExtHostDiagnostics } from 'vs/workbench/api/common/extHostDiagnostics'; import { asPromise } from 'vs/base/common/async'; -import { MainContext, MainThreadLanguageFeaturesShape, ExtHostLanguageFeaturesShape, IRawColorInfo, IMainContext, IdObject, IRegExpDto, IIndentationRuleDto, IOnEnterRuleDto, ILanguageConfigurationDto, IWorkspaceSymbolDto, ISuggestResultDto, IWorkspaceSymbolsDto, ICodeActionDto, IDocumentFilterDto, IWorkspaceEditDto, ISignatureHelpProviderMetadataDto, ILinkDto, ICodeLensDto, ISuggestDataDto, ILinksListDto, ChainedCacheId, ICodeLensListDto, ICodeActionListDto, ISignatureHelpDto, ISignatureHelpContextDto } from './extHost.protocol'; +import { MainContext, MainThreadLanguageFeaturesShape, ExtHostLanguageFeaturesShape, IRawColorInfo, IMainContext, IdObject, IRegExpDto, IIndentationRuleDto, IOnEnterRuleDto, ILanguageConfigurationDto, IWorkspaceSymbolDto, ISuggestResultDto, IWorkspaceSymbolsDto, ICodeActionDto, IDocumentFilterDto, IWorkspaceEditDto, ISignatureHelpProviderMetadataDto, ILinkDto, ICodeLensDto, ISuggestDataDto, ILinksListDto, ChainedCacheId, ICodeLensListDto, ICodeActionListDto, ISignatureHelpDto, ISignatureHelpContextDto, ICallHierarchyItemDto } from './extHost.protocol'; import { regExpLeadsToEndlessLoop, regExpFlags } from 'vs/base/common/strings'; import { IPosition } from 'vs/editor/common/core/position'; import { IRange, Range as EditorRange } from 'vs/editor/common/core/range'; @@ -1011,8 +1011,8 @@ class SelectionRangeAdapter { class CallHierarchyAdapter { - // todo@joh keep object (heap service, lifecycle) - private readonly _cache = new LRUCache(1000, 0.8); + // todo@joh keep object (add managed lifecycle) + private readonly _cache = new LRUCache(3000, 0.8); private _idPool = 0; constructor( @@ -1020,33 +1020,39 @@ class CallHierarchyAdapter { private readonly _provider: vscode.CallHierarchyItemProvider ) { } - provideCallHierarchyItem(resource: URI, pos: IPosition, token: CancellationToken): Promise { + async resolveCallHierarchyItem(resource: URI, pos: IPosition, token: CancellationToken): Promise { const document = this._documents.getDocument(resource); const position = typeConvert.Position.to(pos); - return asPromise(() => this._provider.provideCallHierarchyItem(document, position, token)).then(item => { - if (!item) { - return undefined; - } - return this._fromItem(item); - }); + const item = await this._provider.resolveCallHierarchyItem(document, position, token); + if (!item) { + return undefined; + } + return this._fromItem(item); } - resolveCallHierarchyItem(item: callHierarchy.CallHierarchyItem, direction: callHierarchy.CallHierarchyDirection, token: CancellationToken): Promise<[callHierarchy.CallHierarchyItem, modes.Location[]][]> { - return asPromise(() => this._provider.resolveCallHierarchyItem( - this._cache.get(item._id)!, - direction as number, token) // todo@joh proper convert - ).then(data => { - if (!data) { - return []; - } - return data.map(tuple => { - return <[callHierarchy.CallHierarchyItem, modes.Location[]]>[ - this._fromItem(tuple[0]), - tuple[1].map(typeConvert.location.from) - ]; - }); - }); + async provideCallsTo(target: callHierarchy.CallHierarchyItem, token: CancellationToken): Promise<[ICallHierarchyItemDto, IRange[]][] | undefined> { + const item = this._cache.get(target._id); + if (!item) { + return undefined; + } + const calls = await this._provider.provideCallsTo(item, token); + if (!calls) { + return undefined; + } + return calls.map(call => (<[ICallHierarchyItemDto, IRange[]]>[this._fromItem(call.source), call.sourceRanges.map(typeConvert.Range.from)])) + } + + async provideCallsFrom(source: callHierarchy.CallHierarchyItem, token: CancellationToken): Promise<[ICallHierarchyItemDto, IRange[]][] | undefined> { + const item = this._cache.get(source._id); + if (!item) { + return undefined; + } + const calls = await this._provider.provideCallsFrom(item, token); + if (!calls) { + return undefined; + } + return calls.map(call => (<[ICallHierarchyItemDto, IRange[]]>[this._fromItem(call.target), call.sourceRanges.map(typeConvert.Range.from)])) } private _fromItem(item: vscode.CallHierarchyItem, _id: number = this._idPool++): callHierarchy.CallHierarchyItem { @@ -1496,12 +1502,16 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { return this._createDisposable(handle); } - $provideCallHierarchyItem(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { - return this._withAdapter(handle, CallHierarchyAdapter, adapter => adapter.provideCallHierarchyItem(URI.revive(resource), position, token), undefined); + $resolveCallHierarchyItem(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { + return this._withAdapter(handle, CallHierarchyAdapter, adapter => adapter.resolveCallHierarchyItem(URI.revive(resource), position, token), undefined); + } + + $provideCallHierarchyItemsTo(handle: number, target: callHierarchy.CallHierarchyItem, token: CancellationToken): Promise<[ICallHierarchyItemDto, IRange[]][] | undefined> { + return this._withAdapter(handle, CallHierarchyAdapter, adapter => adapter.provideCallsTo(target, token), undefined); } - $resolveCallHierarchyItem(handle: number, item: callHierarchy.CallHierarchyItem, direction: callHierarchy.CallHierarchyDirection, token: CancellationToken): Promise<[callHierarchy.CallHierarchyItem, modes.Location[]][]> { - return this._withAdapter(handle, CallHierarchyAdapter, adapter => adapter.resolveCallHierarchyItem(item, direction, token), []); + $provideCallHierarchyItemsFrom(handle: number, source: callHierarchy.CallHierarchyItem, token: CancellationToken): Promise<[ICallHierarchyItemDto, IRange[]][] | undefined> { + return this._withAdapter(handle, CallHierarchyAdapter, adapter => adapter.provideCallsFrom(source, token), undefined); } // --- configuration diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 623297aa26da5..cd935172512f3 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -1146,12 +1146,6 @@ export class SelectionRange { } } - -export enum CallHierarchyDirection { - CallsFrom = 1, - CallsTo = 2, -} - export class CallHierarchyItem { kind: SymbolKind; name: string; @@ -1170,6 +1164,27 @@ export class CallHierarchyItem { } } +export class CallsTo { + + source: CallHierarchyItem; + sourceRanges: Range[]; + + constructor(item: CallHierarchyItem, sourceRanges: Range[]) { + this.sourceRanges = sourceRanges; + this.source = item; + } +} +export class CallsFrom { + + target: CallHierarchyItem; + sourceRanges: Range[]; + + constructor(item: CallHierarchyItem, sourceRanges: Range[]) { + this.sourceRanges = sourceRanges; + this.target = item; + } +} + @es5ClassCompat export class CodeLens { diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution.ts index 84334ce1cac94..a008fb81ddcd2 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution.ts @@ -93,7 +93,7 @@ class CallHierarchyController extends Disposable implements IEditorContribution this._sessionDispose.push({ dispose() { cancel.cancel(); } }); this._sessionDispose.push(widget); - Promise.resolve(provider.provideCallHierarchyItem(model, position, cancel.token)).then(item => { + Promise.resolve(provider.resolveCallHierarchyItem(model, position, cancel.token)).then(item => { if (cancel.token.isCancellationRequested) { return; } diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts index de26aa5c2416d..437a00ff18257 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts @@ -7,7 +7,7 @@ import 'vs/css!./media/callHierarchy'; import { PeekViewWidget, IPeekViewService } from 'vs/editor/contrib/referenceSearch/peekViewWidget'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { CallHierarchyProvider, CallHierarchyDirection, CallHierarchyItem } from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; +import { CallHierarchyProvider, CallHierarchyItem, CallHierarchyDirection } from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; import { FuzzyScore } from 'vs/base/common/filters'; import * as callHTree from 'vs/workbench/contrib/callHierarchy/browser/callHierarchyTree'; diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts index becdc2dc3ed2b..f7f0189e9dfc8 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IAsyncDataSource, ITreeRenderer, ITreeNode } from 'vs/base/browser/ui/tree/tree'; -import { CallHierarchyItem, CallHierarchyDirection, CallHierarchyProvider } from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; +import { CallHierarchyItem, CallHierarchyProvider, CallHierarchyDirection } from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IIdentityProvider, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { FuzzyScore, createMatches } from 'vs/base/common/filters'; @@ -12,6 +12,7 @@ import { IconLabel } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { symbolKindToCssClass, Location } from 'vs/editor/common/modes'; import { Range } from 'vs/editor/common/core/range'; import { hash } from 'vs/base/common/hash'; +import { onUnexpectedExternalError } from 'vs/base/common/errors'; export class Call { constructor( @@ -34,21 +35,55 @@ export class SingleDirectionDataSource implements IAsyncDataSource { if (element instanceof Call) { - try { - const direction = this.getDirection(); - const calls = await this.provider.resolveCallHierarchyItem(element.item, direction, CancellationToken.None); - if (!calls) { - return []; - } - return calls.map(([item, locations]) => new Call(item, locations, element)); - } catch { - return []; + const results: Call[] = []; + if (this.getDirection() === CallHierarchyDirection.CallsFrom) { + await this._getCallsFrom(element, results); + } else { + await this._getCallsTo(element, results); } + return results; } else { // 'root' return [new Call(element, [{ uri: element.uri, range: Range.lift(element.range).collapseToStart() }], undefined)]; } } + + private async _getCallsFrom(source: Call, bucket: Call[]): Promise { + try { + const callsFrom = await this.provider.provideCallsFrom(source.item, CancellationToken.None); + if (!callsFrom) { + return; + } + for (const callFrom of callsFrom) { + bucket.push(new Call( + callFrom.target, + callFrom.sourceRanges.map(range => ({ range, uri: source.item.uri })), + source + )); + } + } catch (e) { + onUnexpectedExternalError(e); + } + } + + private async _getCallsTo(target: Call, bucket: Call[]): Promise { + try { + const callsTo = await this.provider.provideCallsTo(target.item, CancellationToken.None); + if (!callsTo) { + return; + } + for (const callTo of callsTo) { + bucket.push(new Call( + callTo.source, + callTo.sourceRanges.map(range => ({ range, uri: callTo.source.uri })), + target + )); + } + } catch (e) { + onUnexpectedExternalError(e); + } + } + } export class IdentityProvider implements IIdentityProvider { diff --git a/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts b/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts index 4c448e4d8fa7c..c45d704779b1f 100644 --- a/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts +++ b/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts @@ -3,17 +3,16 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IPosition } from 'vs/editor/common/core/position'; import { IRange } from 'vs/editor/common/core/range'; -import { SymbolKind, ProviderResult, Location } from 'vs/editor/common/modes'; +import { SymbolKind, ProviderResult } from 'vs/editor/common/modes'; import { ITextModel } from 'vs/editor/common/model'; import { CancellationToken } from 'vs/base/common/cancellation'; import { LanguageFeatureRegistry } from 'vs/editor/common/modes/languageFeatureRegistry'; import { URI } from 'vs/base/common/uri'; +import { IPosition } from 'vs/editor/common/core/position'; export const enum CallHierarchyDirection { - CallsFrom = 1, - CallsTo = 2 + CallsTo, CallsFrom } export interface CallHierarchyItem { @@ -26,19 +25,23 @@ export interface CallHierarchyItem { selectionRange: IRange; } +export interface CallsTo { + source: CallHierarchyItem, + sourceRanges: IRange[] +} + +export interface CallsFrom { + sourceRanges: IRange[], + target: CallHierarchyItem +} + export interface CallHierarchyProvider { - provideCallHierarchyItem( - document: ITextModel, - position: IPosition, - token: CancellationToken - ): ProviderResult; - - resolveCallHierarchyItem( - item: CallHierarchyItem, - direction: CallHierarchyDirection, - token: CancellationToken - ): ProviderResult<[CallHierarchyItem, Location[]][]>; + resolveCallHierarchyItem(document: ITextModel, postion: IPosition, token: CancellationToken): ProviderResult; + + provideCallsTo(target: CallHierarchyItem, token: CancellationToken): ProviderResult; + + provideCallsFrom(source: CallHierarchyItem, token: CancellationToken): ProviderResult; } export const CallHierarchyProviderRegistry = new LanguageFeatureRegistry(); From 5c4d58eec887d7d05cf5e1381c7a5018f013e6b8 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 11 Sep 2019 12:13:59 +0200 Subject: [PATCH 2/6] make default direction CallsFrom, better source range highlights --- .../browser/callHierarchy.contribution.ts | 2 +- .../browser/callHierarchyPeek.ts | 53 ++++++++++--------- .../browser/callHierarchyTree.ts | 3 +- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution.ts index a008fb81ddcd2..6dd1a69973428 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution.ts @@ -81,7 +81,7 @@ class CallHierarchyController extends Disposable implements IEditorContribution this._editor, position, provider, - CallHierarchyDirection.CallsTo + CallHierarchyDirection.CallsFrom ); widget.showLoading(); diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts index 437a00ff18257..d98fce5e2e03b 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts @@ -22,15 +22,13 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { EmbeddedCodeEditorWidget } from 'vs/editor/browser/widget/embeddedCodeEditorWidget'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { TrackedRangeStickiness, IModelDeltaDecoration, IModelDecorationOptions, OverviewRulerLane } from 'vs/editor/common/model'; import { registerThemingParticipant, themeColorFromId, IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; import * as referencesWidget from 'vs/editor/contrib/referenceSearch/referencesWidget'; -import { isNonEmptyArray } from 'vs/base/common/arrays'; import { IPosition } from 'vs/editor/common/core/position'; import { Action } from 'vs/base/common/actions'; import { IActionBarOptions, ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar'; -import { ILabelService } from 'vs/platform/label/common/label'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { Color } from 'vs/base/common/color'; import { TreeMouseEventTarget } from 'vs/base/browser/ui/tree/tree'; @@ -110,7 +108,6 @@ export class CallHierarchyTreePeekWidget extends PeekViewWidget { @IPeekViewService private readonly _peekViewService: IPeekViewService, @IEditorService private readonly _editorService: IEditorService, @ITextModelService private readonly _textModelService: ITextModelService, - @ILabelService private readonly _labelService: ILabelService, @IStorageService private readonly _storageService: IStorageService, @IInstantiationService private readonly _instantiationService: IInstantiationService, ) { @@ -239,15 +236,15 @@ export class CallHierarchyTreePeekWidget extends PeekViewWidget { })); // session state - let localDispose: IDisposable[] = []; - this._disposables.add({ dispose() { dispose(localDispose); } }); + const localDispose = new DisposableStore(); + this._disposables.add(localDispose); // update editor this._disposables.add(this._tree.onDidChangeFocus(e => { const [element] = e.elements; - if (element && isNonEmptyArray(element.locations)) { + if (element) { - localDispose = dispose(localDispose); + localDispose.clear(); const options: IModelDecorationOptions = { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, @@ -257,20 +254,28 @@ export class CallHierarchyTreePeekWidget extends PeekViewWidget { position: OverviewRulerLane.Center }, }; - let decorations: IModelDeltaDecoration[] = []; - let fullRange: IRange | undefined; - for (const { range } of element.locations) { - decorations.push({ range, options }); - fullRange = !fullRange ? range : Range.plusRange(range, fullRange); - } this._textModelService.createModelReference(element.item.uri).then(value => { this._editor.setModel(value.object.textEditorModel); - this._editor.revealRangeInCenter(fullRange!, ScrollType.Smooth); - this._editor.revealLine(element.item.range.startLineNumber, ScrollType.Smooth); - const ids = this._editor.deltaDecorations([], decorations); - localDispose.push({ dispose: () => this._editor.deltaDecorations(ids, []) }); - localDispose.push(value); + + // set decorations for caller ranges (if in the same file) + let decorations: IModelDeltaDecoration[] = []; + let fullRange: IRange | undefined; + for (const loc of element.locations) { + if (loc.uri.toString() === element.item.uri.toString()) { + decorations.push({ range: loc.range, options }); + fullRange = !fullRange ? loc.range : Range.plusRange(loc.range, fullRange); + } + } + if (fullRange) { + this._editor.revealRange(fullRange, ScrollType.Immediate); + const ids = this._editor.deltaDecorations([], decorations); + localDispose.add(toDisposable(() => this._editor.deltaDecorations(ids, []))); + } + + // reveal the actual element + this._editor.revealRange(element.item.range, ScrollType.Smooth); + localDispose.add(value); }); let node: callHTree.Call | CallHierarchyItem = element; @@ -313,11 +318,11 @@ export class CallHierarchyTreePeekWidget extends PeekViewWidget { return; } - if (e.element && isNonEmptyArray(e.element.locations)) { + if (e.element) { this.dispose(); this._editorService.openEditor({ resource: e.element.item.uri, - options: { selection: e.element.locations[0].range } + options: { selection: e.element.item.selectionRange } }); } })); @@ -325,11 +330,11 @@ export class CallHierarchyTreePeekWidget extends PeekViewWidget { this._disposables.add(this._tree.onDidChangeSelection(e => { const [element] = e.elements; // don't close on click - if (element && isNonEmptyArray(element.locations) && e.browserEvent instanceof KeyboardEvent) { + if (element && e.browserEvent instanceof KeyboardEvent) { this.dispose(); this._editorService.openEditor({ resource: element.item.uri, - options: { selection: element.locations[0].range } + options: { selection: element.item.selectionRange } }); } })); @@ -373,7 +378,7 @@ export class CallHierarchyTreePeekWidget extends PeekViewWidget { } this.setTitle( item.name, - item.detail || this._labelService.getUriLabel(item.uri, { relative: true }), + item.detail || '', ); } diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts index f7f0189e9dfc8..e35d09574e9fe 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts @@ -10,7 +10,6 @@ import { IIdentityProvider, IListVirtualDelegate } from 'vs/base/browser/ui/list import { FuzzyScore, createMatches } from 'vs/base/common/filters'; import { IconLabel } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { symbolKindToCssClass, Location } from 'vs/editor/common/modes'; -import { Range } from 'vs/editor/common/core/range'; import { hash } from 'vs/base/common/hash'; import { onUnexpectedExternalError } from 'vs/base/common/errors'; @@ -44,7 +43,7 @@ export class SingleDirectionDataSource implements IAsyncDataSource Date: Wed, 11 Sep 2019 12:50:41 +0200 Subject: [PATCH 3/6] reset view state when direction changes --- .../contrib/callHierarchy/browser/callHierarchyPeek.ts | 3 ++- .../contrib/callHierarchy/browser/callHierarchyTree.ts | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts index d98fce5e2e03b..51d91c7ea3183 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts @@ -194,7 +194,7 @@ export class CallHierarchyTreePeekWidget extends PeekViewWidget { addClass(treeContainer, 'tree'); container.appendChild(treeContainer); const options: IAsyncDataTreeOptions = { - identityProvider: new callHTree.IdentityProvider(), + identityProvider: new callHTree.IdentityProvider(() => this._direction), ariaLabel: localize('tree.aria', "Call Hierarchy"), expandOnlyOnTwistieClick: true, }; @@ -387,6 +387,7 @@ export class CallHierarchyTreePeekWidget extends PeekViewWidget { if (this._direction !== newDirection) { this._treeViewStates.set(this._direction, this._tree.getViewState()); this._direction = newDirection; + this._tree.setFocus([]); this.showItem(item); } }; diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts index e35d09574e9fe..20fdcb654ab89 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts @@ -86,8 +86,13 @@ export class SingleDirectionDataSource implements IAsyncDataSource { + + constructor( + public getDirection: () => CallHierarchyDirection + ) { } + getId(element: Call): { toString(): string; } { - return hash(element.item.uri.toString(), hash(JSON.stringify(element.item.range))).toString() + (element.parent ? this.getId(element.parent) : ''); + return this.getDirection() + hash(element.item.uri.toString(), hash(JSON.stringify(element.item.range))).toString() + (element.parent ? this.getId(element.parent) : ''); } } From c0802a73d7e62ecfcd6e7d9a2c6abac29d33d0d8 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 11 Sep 2019 13:53:34 +0200 Subject: [PATCH 4/6] add meta title with direction - Calls/Callers --- .../contrib/callHierarchy/browser/callHierarchyPeek.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts index 51d91c7ea3183..823c80c65e80a 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts @@ -292,7 +292,7 @@ export class CallHierarchyTreePeekWidget extends PeekViewWidget { } node = parent; } - this.setMetaTitle(localize('meta', " – {0}", names.join(' → '))); + this.setTitle(this._tree.getInput()!.name, names.join(' → ')); } })); @@ -376,10 +376,9 @@ export class CallHierarchyTreePeekWidget extends PeekViewWidget { if (!viewState) { this._tree.setFocus([firstChild]); } - this.setTitle( - item.name, - item.detail || '', - ); + this.setMetaTitle(this._direction === CallHierarchyDirection.CallsFrom + ? localize('callFrom', " – Calls") + : localize('callsTo', " – Callers")); } if (!this._changeDirectionAction) { From 8e5edc0eda0f4a61ca9d6d03f7e34521c3fea3bd Mon Sep 17 00:00:00 2001 From: jrieken Date: Wed, 11 Sep 2019 13:25:53 +0000 Subject: [PATCH 5/6] use Outgoing/Incoming terminology --- src/vs/vscode.proposed.d.ts | 12 +++++------ .../api/browser/mainThreadLanguageFeatures.ts | 20 +++++++++---------- .../workbench/api/common/extHost.api.impl.ts | 4 ++-- .../workbench/api/common/extHost.protocol.ts | 4 ++-- .../api/common/extHostLanguageFeatures.ts | 8 ++++---- src/vs/workbench/api/common/extHostTypes.ts | 4 ++-- .../browser/callHierarchyTree.ts | 4 ++-- .../callHierarchy/common/callHierarchy.ts | 8 ++++---- 8 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 7e70fbc1c5353..f3f635799623e 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -29,13 +29,13 @@ declare module 'vscode' { constructor(kind: SymbolKind, name: string, detail: string, uri: Uri, range: Range, selectionRange: Range); } - export class CallsTo { + export class CallHierarchyIncomingCall { source: CallHierarchyItem; sourceRanges: Range[]; constructor(item: CallHierarchyItem, sourceRanges: Range[]); } - export class CallsFrom { + export class CallHierarchyOutgoingCall { sourceRanges: Range[]; target: CallHierarchyItem; constructor(item: CallHierarchyItem, sourceRanges: Range[]); @@ -43,15 +43,15 @@ declare module 'vscode' { export interface CallHierarchyItemProvider { + provideCallHierarchyIncomingCalls(target: CallHierarchyItem, token: CancellationToken): ProviderResult; + + provideCallHierarchyOutgoingCalls(source: CallHierarchyItem, token: CancellationToken): ProviderResult; + /** * Given a document and position compute a call hierarchy item. This is justed as * anchor for call hierarchy and then `resolveCallHierarchyItem` is being called. */ resolveCallHierarchyItem(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - - provideCallsTo(target: CallHierarchyItem, token: CancellationToken): ProviderResult; - - provideCallsFrom(source: CallHierarchyItem, token: CancellationToken): ProviderResult; } export namespace languages { diff --git a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts index 26ce381604c8c..e74e585c3d699 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts @@ -497,24 +497,24 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha resolveCallHierarchyItem: (document, position, token) => { return this._proxy.$resolveCallHierarchyItem(handle, document.uri, position, token).then(MainThreadLanguageFeatures._reviveCallHierarchyItemDto); }, - provideCallsFrom: async (item, token) => { - const callsFrom = await this._proxy.$provideCallHierarchyItemsFrom(handle, item, token); - if (!callsFrom) { - return callsFrom; + provideOutgoingCalls: async (item, token) => { + const outgoing = await this._proxy.$provideCallHierarchyOutgoingCalls(handle, item, token); + if (!outgoing) { + return outgoing; } - return callsFrom.map(([item, sourceRanges]): callh.CallsFrom => { + return outgoing.map(([item, sourceRanges]): callh.OutgoingCall => { return { target: MainThreadLanguageFeatures._reviveCallHierarchyItemDto(item), sourceRanges } }); }, - provideCallsTo: async (item, token) => { - const callsTo = await this._proxy.$provideCallHierarchyItemsTo(handle, item, token); - if (!callsTo) { - return callsTo; + provideIncomingCalls: async (item, token) => { + const incoming = await this._proxy.$provideCallHierarchyIncomingCalls(handle, item, token); + if (!incoming) { + return incoming; } - return callsTo.map(([item, sourceRanges]): callh.CallsTo => { + return incoming.map(([item, sourceRanges]): callh.IncomingCall => { return { source: MainThreadLanguageFeatures._reviveCallHierarchyItemDto(item), sourceRanges diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 620d4e3c42d87..5dde2c62f2b48 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -893,8 +893,8 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I ViewColumn: extHostTypes.ViewColumn, WorkspaceEdit: extHostTypes.WorkspaceEdit, // proposed - CallsFrom: extHostTypes.CallsFrom, - CallsTo: extHostTypes.CallsTo, + CallHierarchyOutgoingCall: extHostTypes.CallHierarchyOutgoingCall, + CallHierarchyIncomingCall: extHostTypes.CallHierarchyIncomingCall, CallHierarchyItem: extHostTypes.CallHierarchyItem, Decoration: extHostTypes.Decoration }; diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 8643aeec33683..d02471a71b7ff 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1112,8 +1112,8 @@ export interface ExtHostLanguageFeaturesShape { $provideFoldingRanges(handle: number, resource: UriComponents, context: modes.FoldingContext, token: CancellationToken): Promise; $provideSelectionRanges(handle: number, resource: UriComponents, positions: IPosition[], token: CancellationToken): Promise; $resolveCallHierarchyItem(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; - $provideCallHierarchyItemsTo(handle: number, target: callHierarchy.CallHierarchyItem, token: CancellationToken): Promise<[ICallHierarchyItemDto, IRange[]][] | undefined>; - $provideCallHierarchyItemsFrom(handle: number, source: callHierarchy.CallHierarchyItem, token: CancellationToken): Promise<[ICallHierarchyItemDto, IRange[]][] | undefined>; + $provideCallHierarchyIncomingCalls(handle: number, target: callHierarchy.CallHierarchyItem, token: CancellationToken): Promise<[ICallHierarchyItemDto, IRange[]][] | undefined>; + $provideCallHierarchyOutgoingCalls(handle: number, source: callHierarchy.CallHierarchyItem, token: CancellationToken): Promise<[ICallHierarchyItemDto, IRange[]][] | undefined>; } export interface ExtHostQuickOpenShape { diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index 1d166cad13c30..6b17efba31f2d 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -1036,7 +1036,7 @@ class CallHierarchyAdapter { if (!item) { return undefined; } - const calls = await this._provider.provideCallsTo(item, token); + const calls = await this._provider.provideCallHierarchyIncomingCalls(item, token); if (!calls) { return undefined; } @@ -1048,7 +1048,7 @@ class CallHierarchyAdapter { if (!item) { return undefined; } - const calls = await this._provider.provideCallsFrom(item, token); + const calls = await this._provider.provideCallHierarchyOutgoingCalls(item, token); if (!calls) { return undefined; } @@ -1506,11 +1506,11 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { return this._withAdapter(handle, CallHierarchyAdapter, adapter => adapter.resolveCallHierarchyItem(URI.revive(resource), position, token), undefined); } - $provideCallHierarchyItemsTo(handle: number, target: callHierarchy.CallHierarchyItem, token: CancellationToken): Promise<[ICallHierarchyItemDto, IRange[]][] | undefined> { + $provideCallHierarchyIncomingCalls(handle: number, target: callHierarchy.CallHierarchyItem, token: CancellationToken): Promise<[ICallHierarchyItemDto, IRange[]][] | undefined> { return this._withAdapter(handle, CallHierarchyAdapter, adapter => adapter.provideCallsTo(target, token), undefined); } - $provideCallHierarchyItemsFrom(handle: number, source: callHierarchy.CallHierarchyItem, token: CancellationToken): Promise<[ICallHierarchyItemDto, IRange[]][] | undefined> { + $provideCallHierarchyOutgoingCalls(handle: number, source: callHierarchy.CallHierarchyItem, token: CancellationToken): Promise<[ICallHierarchyItemDto, IRange[]][] | undefined> { return this._withAdapter(handle, CallHierarchyAdapter, adapter => adapter.provideCallsFrom(source, token), undefined); } diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index cd935172512f3..57e377721b85e 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -1164,7 +1164,7 @@ export class CallHierarchyItem { } } -export class CallsTo { +export class CallHierarchyIncomingCall { source: CallHierarchyItem; sourceRanges: Range[]; @@ -1174,7 +1174,7 @@ export class CallsTo { this.source = item; } } -export class CallsFrom { +export class CallHierarchyOutgoingCall { target: CallHierarchyItem; sourceRanges: Range[]; diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts index 20fdcb654ab89..73f7f51f280aa 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts @@ -49,7 +49,7 @@ export class SingleDirectionDataSource implements IAsyncDataSource { try { - const callsFrom = await this.provider.provideCallsFrom(source.item, CancellationToken.None); + const callsFrom = await this.provider.provideOutgoingCalls(source.item, CancellationToken.None); if (!callsFrom) { return; } @@ -67,7 +67,7 @@ export class SingleDirectionDataSource implements IAsyncDataSource { try { - const callsTo = await this.provider.provideCallsTo(target.item, CancellationToken.None); + const callsTo = await this.provider.provideIncomingCalls(target.item, CancellationToken.None); if (!callsTo) { return; } diff --git a/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts b/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts index c45d704779b1f..6e8a9bd9eafa0 100644 --- a/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts +++ b/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts @@ -25,12 +25,12 @@ export interface CallHierarchyItem { selectionRange: IRange; } -export interface CallsTo { +export interface IncomingCall { source: CallHierarchyItem, sourceRanges: IRange[] } -export interface CallsFrom { +export interface OutgoingCall { sourceRanges: IRange[], target: CallHierarchyItem } @@ -39,9 +39,9 @@ export interface CallHierarchyProvider { resolveCallHierarchyItem(document: ITextModel, postion: IPosition, token: CancellationToken): ProviderResult; - provideCallsTo(target: CallHierarchyItem, token: CancellationToken): ProviderResult; + provideIncomingCalls(target: CallHierarchyItem, token: CancellationToken): ProviderResult; - provideCallsFrom(source: CallHierarchyItem, token: CancellationToken): ProviderResult; + provideOutgoingCalls(source: CallHierarchyItem, token: CancellationToken): ProviderResult; } export const CallHierarchyProviderRegistry = new LanguageFeatureRegistry(); From edff5d912ef67203425320798801445ed51c1d2f Mon Sep 17 00:00:00 2001 From: jrieken Date: Wed, 11 Sep 2019 13:33:51 +0000 Subject: [PATCH 6/6] Some jsdoc --- src/vs/vscode.proposed.d.ts | 47 ++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index f3f635799623e..d0c32c1606994 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -19,11 +19,40 @@ declare module 'vscode' { //#region Joh - call hierarchy export class CallHierarchyItem { - kind: SymbolKind; + /** + * The name of this item. + */ name: string; + + /** + * The kind of this item. + */ + kind: SymbolKind; + + /** + * Tags for this item. + */ + tags?: ReadonlyArray; + + /** + * More detail for this item, e.g. the signature of a function. + */ detail?: string; + + /** + * The resource identifier of this item. + */ uri: Uri; + + /** + * The range enclosing this symbol not including leading/trailing whitespace but everything else, e.g. comments and code. + */ range: Range; + + /** + * The range that should be selected and reveal when this symbol is being picked, e.g. the name of a function. + * Must be contained by the [`range`](#CallHierarchyItem.range). + */ selectionRange: Range; constructor(kind: SymbolKind, name: string, detail: string, uri: Uri, range: Range, selectionRange: Range); @@ -43,11 +72,27 @@ declare module 'vscode' { export interface CallHierarchyItemProvider { + /** + * Provide a list of callers for the provided item, e.g. all function calling a function. + * + * @param target + * @param token + * @returns + */ provideCallHierarchyIncomingCalls(target: CallHierarchyItem, token: CancellationToken): ProviderResult; + /** + * Provide a list of calls for the provided item, e.g. all functions call from a function. + * + * @param source + * @param token + * @returns + */ provideCallHierarchyOutgoingCalls(source: CallHierarchyItem, token: CancellationToken): ProviderResult; /** + * todo@joh not needed? + * * Given a document and position compute a call hierarchy item. This is justed as * anchor for call hierarchy and then `resolveCallHierarchyItem` is being called. */