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

'use strict';

J
Johannes Rieken 已提交
8 9 10
import URI from 'vs/base/common/uri';
import {TPromise} from 'vs/base/common/winjs.base';
import {onUnexpectedError} from 'vs/base/common/errors';
11
import {IModel, IPosition} from 'vs/editor/common/editorCommon';
E
Erich Gamma 已提交
12 13
import {IDeclarationSupport} from 'vs/editor/common/modes';
import LanguageFeatureRegistry from 'vs/editor/common/modes/languageFeatureRegistry';
J
Johannes Rieken 已提交
14
import {IReference} from 'vs/editor/common/modes';
E
Erich Gamma 已提交
15

J
Johannes Rieken 已提交
16
export const DeclarationRegistry = new LanguageFeatureRegistry<IDeclarationSupport>('declarationSupport');
E
Erich Gamma 已提交
17

18
export function getDeclarationsAtPosition(model: IModel, position: IPosition): TPromise<IReference[]> {
J
Johannes Rieken 已提交
19 20

	const promises: TPromise<any>[] = [];
21 22
	const resource = model.getAssociatedResource();
	const provider = DeclarationRegistry.ordered(model);
J
Johannes Rieken 已提交
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
	const references: (IReference[]| IReference)[] = Array<(IReference[]| IReference)>(provider.length);

	// get results
	provider.map((provider, idx) => {
		let promise = provider.findDeclaration(resource, position);
		promises.push(promise.then(result => {
			references[idx] = result;
		}, err => {
			onUnexpectedError(err);
		}));
	});

	return TPromise.join(promises).then(() => {
		let result: IReference[] = [];
		for (let item of references) {
			if (Array.isArray(item)) {
				result.push(...item)
			} else if(item) {
				result.push(item);
			}
		}

		return result;
	});
}