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

7
import {sequence, asWinJsPromise} from 'vs/base/common/async';
8
import {isFalsyOrEmpty} from 'vs/base/common/arrays';
9
import {onUnexpectedError} from 'vs/base/common/errors';
10
import {TPromise} from 'vs/base/common/winjs.base';
A
Alex Dima 已提交
11
import {IReadOnlyModel} from 'vs/editor/common/editorCommon';
12
import {CommonEditorRegistry} from 'vs/editor/common/editorCommonExtensions';
13
import {ISuggestResult, ISuggestSupport, SuggestRegistry} from 'vs/editor/common/modes';
14
import {SnippetsRegistry} from 'vs/editor/common/modes/supports';
A
Alex Dima 已提交
15
import {Position} from 'vs/editor/common/core/position';
E
Erich Gamma 已提交
16

17 18 19 20 21
export const Context = {
	Visible: 'suggestWidgetVisible',
	MultipleSuggestions: 'suggestWidgetMultipleSuggestions',
	AcceptOnKey: 'suggestionSupportsAcceptOnKey'
};
E
Erich Gamma 已提交
22

23
export interface ISuggestResult2 extends ISuggestResult {
24 25 26
	support?: ISuggestSupport;
}

A
Alex Dima 已提交
27
export function provideCompletionItems(model: IReadOnlyModel, position: Position, groups?: ISuggestSupport[][]): TPromise<ISuggestResult2[]> {
28 29 30 31 32

	if (!groups) {
		groups = SuggestRegistry.orderedGroups(model);
	}

33
	const result: ISuggestResult2[] = [];
34 35 36 37 38

	const factory = groups.map((supports, index) => {
		return () => {

			// stop as soon as a group produced a result
39
			if (result.length > 0) {
40 41 42 43
				return;
			}

			// for each support in the group ask for suggestions
44
			return TPromise.join(supports.map(support => {
45 46 47
				return asWinJsPromise((token) => {
					return support.provideCompletionItems(model, position, token);
				}).then(values => {
48

J
Johannes Rieken 已提交
49 50 51 52
					if (!values) {
						return;
					}

53
					for (let suggestResult of values) {
54

55
						if (!suggestResult || isFalsyOrEmpty(suggestResult.suggestions)) {
56 57 58
							continue;
						}

59
						result.push({
60
							support,
61 62 63
							currentWord: suggestResult.currentWord,
							incomplete: suggestResult.incomplete,
							suggestions: suggestResult.suggestions
64
						});
65 66 67
					}

				}, onUnexpectedError);
68
			}));
69 70 71
		};
	});

72 73
	return sequence(factory).then(() => {
		// add snippets to the first group
74
		const snippets = SnippetsRegistry.getSnippets(model, position);
75 76
		result.push(snippets);
		return result;
77
	});
78 79 80
}

CommonEditorRegistry.registerDefaultLanguageCommand('_executeCompletionItemProvider', (model, position, args) => {
81
	return provideCompletionItems(model, position);
J
Johannes Rieken 已提交
82
});