goToSymbol.ts 4.3 KB
Newer Older
E
Erich Gamma 已提交
1 2 3 4 5
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

M
Matt Bierner 已提交
6
import { flatten, coalesce } from 'vs/base/common/arrays';
7
import { CancellationToken } from 'vs/base/common/cancellation';
8
import { onUnexpectedExternalError } from 'vs/base/common/errors';
9
import { registerModelAndPositionCommand } from 'vs/editor/browser/editorExtensions';
10
import { Position } from 'vs/editor/common/core/position';
11
import { ITextModel } from 'vs/editor/common/model';
12
import { LocationLink, DefinitionProviderRegistry, ImplementationProviderRegistry, TypeDefinitionProviderRegistry, DeclarationProviderRegistry, ProviderResult, ReferenceProviderRegistry } from 'vs/editor/common/modes';
A
Alex Dima 已提交
13
import { LanguageFeatureRegistry } from 'vs/editor/common/modes/languageFeatureRegistry';
E
Erich Gamma 已提交
14

15

16
function getLocationLinks<T>(
17 18 19
	model: ITextModel,
	position: Position,
	registry: LanguageFeatureRegistry<T>,
J
Johannes Rieken 已提交
20 21
	provide: (provider: T, model: ITextModel, position: Position) => ProviderResult<LocationLink | LocationLink[]>
): Promise<LocationLink[]> {
22 23 24
	const provider = registry.ordered(model);

	// get results
B
Benjamin Pasero 已提交
25
	const promises = provider.map((provider): Promise<LocationLink | LocationLink[] | undefined> => {
26
		return Promise.resolve(provide(provider, model, position)).then(undefined, err => {
27
			onUnexpectedExternalError(err);
B
Benjamin Pasero 已提交
28
			return undefined;
29 30
		});
	});
31
	return Promise.all(promises)
32
		.then(flatten)
33
		.then(coalesce);
34 35
}

36

J
Johannes Rieken 已提交
37
export function getDefinitionsAtPosition(model: ITextModel, position: Position, token: CancellationToken): Promise<LocationLink[]> {
38
	return getLocationLinks(model, position, DefinitionProviderRegistry, (provider, model, position) => {
39 40 41 42
		return provider.provideDefinition(model, position, token);
	});
}

J
Johannes Rieken 已提交
43
export function getDeclarationsAtPosition(model: ITextModel, position: Position, token: CancellationToken): Promise<LocationLink[]> {
44
	return getLocationLinks(model, position, DeclarationProviderRegistry, (provider, model, position) => {
45 46 47 48
		return provider.provideDeclaration(model, position, token);
	});
}

J
Johannes Rieken 已提交
49
export function getImplementationsAtPosition(model: ITextModel, position: Position, token: CancellationToken): Promise<LocationLink[]> {
50
	return getLocationLinks(model, position, ImplementationProviderRegistry, (provider, model, position) => {
51 52
		return provider.provideImplementation(model, position, token);
	});
53 54
}

J
Johannes Rieken 已提交
55
export function getTypeDefinitionsAtPosition(model: ITextModel, position: Position, token: CancellationToken): Promise<LocationLink[]> {
56
	return getLocationLinks(model, position, TypeDefinitionProviderRegistry, (provider, model, position) => {
57 58
		return provider.provideTypeDefinition(model, position, token);
	});
E
Erich Gamma 已提交
59
}
60

61
export function getReferencesAtPosition(model: ITextModel, position: Position, compact: boolean, token: CancellationToken): Promise<LocationLink[]> {
62 63
	return getLocationLinks(model, position, ReferenceProviderRegistry, async (provider, model, position) => {
		const result = await provider.provideReferences(model, position, { includeDeclaration: true }, token);
64
		if (!compact || !result || result.length !== 2) {
65 66 67 68 69 70 71
			return result;
		}
		const resultWithoutDeclaration = await provider.provideReferences(model, position, { includeDeclaration: false }, token);
		if (resultWithoutDeclaration && resultWithoutDeclaration.length === 1) {
			return resultWithoutDeclaration;
		}
		return result;
72 73 74
	});
}

75 76 77 78 79
registerModelAndPositionCommand('_executeDefinitionProvider', (model, position) => getDefinitionsAtPosition(model, position, CancellationToken.None));
registerModelAndPositionCommand('_executeDeclarationProvider', (model, position) => getDeclarationsAtPosition(model, position, CancellationToken.None));
registerModelAndPositionCommand('_executeImplementationProvider', (model, position) => getImplementationsAtPosition(model, position, CancellationToken.None));
registerModelAndPositionCommand('_executeTypeDefinitionProvider', (model, position) => getTypeDefinitionsAtPosition(model, position, CancellationToken.None));
registerModelAndPositionCommand('_executeReferenceProvider', (model, position) => getReferencesAtPosition(model, position, false, CancellationToken.None));