Skip to content

Commit

Permalink
add type hierarchy API test, fix conversion direction for arguments, …
Browse files Browse the repository at this point in the history
…also fix call hierarchy
  • Loading branch information
jrieken committed Jul 15, 2021
1 parent 238e421 commit f50840e
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 25 deletions.
4 changes: 2 additions & 2 deletions src/vs/workbench/api/common/extHostCommands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -369,8 +369,8 @@ export class ApiCommandArgument<V, O = V> {
static readonly Number = new ApiCommandArgument<number>('number', '', v => typeof v === 'number', v => v);
static readonly String = new ApiCommandArgument<string>('string', '', v => typeof v === 'string', v => v);

static readonly CallHierarchyItem = new ApiCommandArgument('item', 'A call hierarchy item', v => v instanceof extHostTypes.CallHierarchyItem, extHostTypeConverter.CallHierarchyItem.to);
static readonly TypeHierarchyItem = new ApiCommandArgument('item', 'A type hierarchy item', v => v instanceof extHostTypes.TypeHierarchyItem, extHostTypeConverter.TypeHierarchyItem.to);
static readonly CallHierarchyItem = new ApiCommandArgument('item', 'A call hierarchy item', v => v instanceof extHostTypes.CallHierarchyItem, extHostTypeConverter.CallHierarchyItem.from);
static readonly TypeHierarchyItem = new ApiCommandArgument('item', 'A type hierarchy item', v => v instanceof extHostTypes.TypeHierarchyItem, extHostTypeConverter.TypeHierarchyItem.from);

constructor(
readonly name: string,
Expand Down
24 changes: 2 additions & 22 deletions src/vs/workbench/api/common/extHostLanguageFeatures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1408,17 +1408,7 @@ class CallHierarchyAdapter {

private _cacheAndConvertItem(sessionId: string, item: vscode.CallHierarchyItem): extHostProtocol.ICallHierarchyItemDto {
const map = this._cache.get(sessionId)!;
const dto: extHostProtocol.ICallHierarchyItemDto = {
_sessionId: sessionId,
_itemId: map.size.toString(36),
name: item.name,
detail: item.detail,
kind: typeConvert.SymbolKind.from(item.kind),
uri: item.uri,
range: typeConvert.Range.from(item.range),
selectionRange: typeConvert.Range.from(item.selectionRange),
tags: item.tags?.map(typeConvert.SymbolTag.from)
};
const dto = typeConvert.CallHierarchyItem.from(item, sessionId, map.size.toString(36));
map.set(dto._itemId, item);
return dto;
}
Expand Down Expand Up @@ -1492,17 +1482,7 @@ class TypeHierarchyAdapter {

private _cacheAndConvertItem(sessionId: string, item: vscode.TypeHierarchyItem): extHostProtocol.ITypeHierarchyItemDto {
const map = this._cache.get(sessionId)!;
const dto: extHostProtocol.ICallHierarchyItemDto = {
_sessionId: sessionId,
_itemId: map.size.toString(36),
name: item.name,
detail: item.detail,
kind: typeConvert.SymbolKind.from(item.kind),
uri: item.uri,
range: typeConvert.Range.from(item.range),
selectionRange: typeConvert.Range.from(item.selectionRange),
tags: item.tags?.map(typeConvert.SymbolTag.from)
};
const dto = typeConvert.TypeHierarchyItem.from(item, sessionId, map.size.toString(36));
map.set(dto._itemId, item);
return dto;
}
Expand Down
44 changes: 44 additions & 0 deletions src/vs/workbench/api/common/extHostTypeConverters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -722,6 +722,28 @@ export namespace CallHierarchyItem {

return result;
}

export function from(item: vscode.CallHierarchyItem, sessionId?: string, itemId?: string): extHostProtocol.ICallHierarchyItemDto {

sessionId = sessionId ?? (<types.TypeHierarchyItem>item)._sessionId;

This comment has been minimized.

Copy link
@Eskibear

Eskibear Jul 15, 2021

Member

types.CallHierarchyItem ?

This comment has been minimized.

Copy link
@jrieken

jrieken Jul 15, 2021

Author Member

Yeah, copy-paste error...

This comment has been minimized.

Copy link
@jrieken

jrieken Jul 15, 2021

Author Member

pushed a fix

itemId = itemId ?? (<types.TypeHierarchyItem>item)._itemId;

if (sessionId === undefined || itemId === undefined) {
throw new Error('invalid item');
}

return {
_sessionId: sessionId,
_itemId: itemId,
name: item.name,
detail: item.detail,
kind: SymbolKind.from(item.kind),
uri: item.uri,
range: Range.from(item.range),
selectionRange: Range.from(item.selectionRange),
tags: item.tags?.map(SymbolTag.from)
};
}
}

export namespace CallHierarchyIncomingCall {
Expand Down Expand Up @@ -1792,4 +1814,26 @@ export namespace TypeHierarchyItem {

return result;
}

export function from(item: vscode.TypeHierarchyItem, sessionId?: string, itemId?: string): extHostProtocol.ITypeHierarchyItemDto {

sessionId = sessionId ?? (<types.TypeHierarchyItem>item)._sessionId;
itemId = itemId ?? (<types.TypeHierarchyItem>item)._itemId;

if (sessionId === undefined || itemId === undefined) {
throw new Error('invalid item');
}

return {
_sessionId: sessionId,
_itemId: itemId,
kind: SymbolKind.from(item.kind),
name: item.name,
detail: item.detail ?? '',
uri: item.uri,
range: Range.from(item.range),
selectionRange: Range.from(item.selectionRange),
tags: item.tags?.map(SymbolTag.from)
};
}
}
2 changes: 2 additions & 0 deletions src/vs/workbench/api/common/extHostTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1242,6 +1242,7 @@ export class CallHierarchyItem {
_itemId?: string;

kind: SymbolKind;
tags?: SymbolTag[];
name: string;
detail?: string;
uri: URI;
Expand Down Expand Up @@ -3437,6 +3438,7 @@ export class TypeHierarchyItem {
_itemId?: string;

kind: SymbolKind;
tags?: SymbolTag[];
name: string;
detail?: string;
uri: URI;
Expand Down
36 changes: 35 additions & 1 deletion src/vs/workbench/test/browser/api/extHostApiCommands.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1292,7 +1292,7 @@ suite('ExtHostLanguageFeatureCommands', function () {
assert.ok(value[0].parent);
});

// --- call hierarcht
// --- call hierarchy

test('CallHierarchy, back and forth', async function () {

Expand Down Expand Up @@ -1335,6 +1335,40 @@ suite('ExtHostLanguageFeatureCommands', function () {
assert.strictEqual(outgoing[0].to.name, 'OUTGOING');
});

// --- type hierarchy

test('TypeHierarchy, back and forth', async function () {


disposables.push(extHost.registerTypeHierarchyProvider(nullExtensionDescription, defaultSelector, new class implements vscode.TypeHierarchyProvider {
prepareTypeHierarchy(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): vscode.ProviderResult<vscode.TypeHierarchyItem[]> {
return [new types.TypeHierarchyItem(types.SymbolKind.Constant, 'ROOT', 'ROOT', document.uri, new types.Range(0, 0, 0, 0), new types.Range(0, 0, 0, 0))];
}
provideTypeHierarchySupertypes(item: vscode.TypeHierarchyItem, token: vscode.CancellationToken): vscode.ProviderResult<vscode.TypeHierarchyItem[]> {
return [new types.TypeHierarchyItem(types.SymbolKind.Constant, 'SUPER', 'SUPER', item.uri, new types.Range(0, 0, 0, 0), new types.Range(0, 0, 0, 0))];
}
provideTypeHierarchySubtypes(item: vscode.TypeHierarchyItem, token: vscode.CancellationToken): vscode.ProviderResult<vscode.TypeHierarchyItem[]> {
return [new types.TypeHierarchyItem(types.SymbolKind.Constant, 'SUB', 'SUB', item.uri, new types.Range(0, 0, 0, 0), new types.Range(0, 0, 0, 0))];
}
}));

await rpcProtocol.sync();

const root = await commands.executeCommand<vscode.TypeHierarchyItem[]>('vscode.prepareTypeHierarchy', model.uri, new types.Position(0, 0));

assert.ok(Array.isArray(root));
assert.strictEqual(root.length, 1);
assert.strictEqual(root[0].name, 'ROOT');

const incoming = await commands.executeCommand<vscode.TypeHierarchyItem[]>('vscode.provideSupertypes', root[0]);
assert.strictEqual(incoming.length, 1);
assert.strictEqual(incoming[0].name, 'SUPER');

const outgoing = await commands.executeCommand<vscode.TypeHierarchyItem[]>('vscode.provideSubtypes', root[0]);
assert.strictEqual(outgoing.length, 1);
assert.strictEqual(outgoing[0].name, 'SUB');
});

test('selectionRangeProvider on inner array always returns outer array #91852', async function () {

disposables.push(extHost.registerSelectionRangeProvider(nullExtensionDescription, defaultSelector, <vscode.SelectionRangeProvider>{
Expand Down

0 comments on commit f50840e

Please sign in to comment.