Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/contrib/parameterHints/browser/provideSignatureHelp.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { CancellationToken } from '../../../../base/common/cancellation.js';
7
import { onUnexpectedExternalError } from '../../../../base/common/errors.js';
8
import { assertType } from '../../../../base/common/types.js';
9
import { URI } from '../../../../base/common/uri.js';
10
import { IPosition, Position } from '../../../common/core/position.js';
11
import { LanguageFeatureRegistry } from '../../../common/languageFeatureRegistry.js';
12
import * as languages from '../../../common/languages.js';
13
import { ITextModel } from '../../../common/model.js';
14
import { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';
15
import { ITextModelService } from '../../../common/services/resolverService.js';
16
import { CommandsRegistry } from '../../../../platform/commands/common/commands.js';
17
import { RawContextKey } from '../../../../platform/contextkey/common/contextkey.js';
18
19
export const Context = {
20
Visible: new RawContextKey<boolean>('parameterHintsVisible', false),
21
MultipleSignatures: new RawContextKey<boolean>('parameterHintsMultipleSignatures', false),
22
};
23
24
export async function provideSignatureHelp(
25
registry: LanguageFeatureRegistry<languages.SignatureHelpProvider>,
26
model: ITextModel,
27
position: Position,
28
context: languages.SignatureHelpContext,
29
token: CancellationToken
30
): Promise<languages.SignatureHelpResult | undefined> {
31
32
const supports = registry.ordered(model);
33
34
for (const support of supports) {
35
try {
36
const result = await support.provideSignatureHelp(model, position, token, context);
37
if (result) {
38
return result;
39
}
40
} catch (err) {
41
onUnexpectedExternalError(err);
42
}
43
}
44
return undefined;
45
}
46
47
CommandsRegistry.registerCommand('_executeSignatureHelpProvider', async (accessor, ...args: [URI, IPosition, string?]) => {
48
const [uri, position, triggerCharacter] = args;
49
assertType(URI.isUri(uri));
50
assertType(Position.isIPosition(position));
51
assertType(typeof triggerCharacter === 'string' || !triggerCharacter);
52
53
const languageFeaturesService = accessor.get(ILanguageFeaturesService);
54
55
const ref = await accessor.get(ITextModelService).createModelReference(uri);
56
try {
57
58
const result = await provideSignatureHelp(languageFeaturesService.signatureHelpProvider, ref.object.textEditorModel, Position.lift(position), {
59
triggerKind: languages.SignatureHelpTriggerKind.Invoke,
60
isRetrigger: false,
61
triggerCharacter,
62
}, CancellationToken.None);
63
64
if (!result) {
65
return undefined;
66
}
67
68
setTimeout(() => result.dispose(), 0);
69
return result.value;
70
71
} finally {
72
ref.dispose();
73
}
74
});
75
76