Path: blob/main/src/vs/editor/contrib/parameterHints/browser/parameterHints.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js';6import { Lazy } from '../../../../base/common/lazy.js';7import { Disposable } from '../../../../base/common/lifecycle.js';8import { ICodeEditor } from '../../../browser/editorBrowser.js';9import { EditorAction, EditorCommand, EditorContributionInstantiation, registerEditorAction, registerEditorCommand, registerEditorContribution, ServicesAccessor } from '../../../browser/editorExtensions.js';10import { IEditorContribution } from '../../../common/editorCommon.js';11import { EditorContextKeys } from '../../../common/editorContextKeys.js';12import * as languages from '../../../common/languages.js';13import { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';14import { ParameterHintsModel, TriggerContext } from './parameterHintsModel.js';15import { Context } from './provideSignatureHelp.js';16import * as nls from '../../../../nls.js';17import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';18import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';19import { KeybindingWeight } from '../../../../platform/keybinding/common/keybindingsRegistry.js';20import { ParameterHintsWidget } from './parameterHintsWidget.js';2122export class ParameterHintsController extends Disposable implements IEditorContribution {2324public static readonly ID = 'editor.controller.parameterHints';2526public static get(editor: ICodeEditor): ParameterHintsController | null {27return editor.getContribution<ParameterHintsController>(ParameterHintsController.ID);28}2930private readonly editor: ICodeEditor;31private readonly model: ParameterHintsModel;32private readonly widget: Lazy<ParameterHintsWidget>;3334constructor(35editor: ICodeEditor,36@IInstantiationService instantiationService: IInstantiationService,37@ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService,38) {39super();4041this.editor = editor;4243this.model = this._register(new ParameterHintsModel(editor, languageFeaturesService.signatureHelpProvider));4445this._register(this.model.onChangedHints(newParameterHints => {46if (newParameterHints) {47this.widget.value.show();48this.widget.value.render(newParameterHints);49} else {50this.widget.rawValue?.hide();51}52}));5354this.widget = new Lazy(() => this._register(instantiationService.createInstance(ParameterHintsWidget, this.editor, this.model)));55}5657cancel(): void {58this.model.cancel();59}6061previous(): void {62this.widget.rawValue?.previous();63}6465next(): void {66this.widget.rawValue?.next();67}6869trigger(context: TriggerContext): void {70this.model.trigger(context, 0);71}72}7374export class TriggerParameterHintsAction extends EditorAction {7576constructor() {77super({78id: 'editor.action.triggerParameterHints',79label: nls.localize2('parameterHints.trigger.label', "Trigger Parameter Hints"),80precondition: EditorContextKeys.hasSignatureHelpProvider,81kbOpts: {82kbExpr: EditorContextKeys.editorTextFocus,83primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.Space,84weight: KeybindingWeight.EditorContrib85}86});87}8889public run(accessor: ServicesAccessor, editor: ICodeEditor): void {90const controller = ParameterHintsController.get(editor);91controller?.trigger({92triggerKind: languages.SignatureHelpTriggerKind.Invoke93});94}95}9697registerEditorContribution(ParameterHintsController.ID, ParameterHintsController, EditorContributionInstantiation.BeforeFirstInteraction);98registerEditorAction(TriggerParameterHintsAction);99100const weight = KeybindingWeight.EditorContrib + 75;101102const ParameterHintsCommand = EditorCommand.bindToContribution<ParameterHintsController>(ParameterHintsController.get);103104registerEditorCommand(new ParameterHintsCommand({105id: 'closeParameterHints',106precondition: Context.Visible,107handler: x => x.cancel(),108kbOpts: {109weight: weight,110kbExpr: EditorContextKeys.focus,111primary: KeyCode.Escape,112secondary: [KeyMod.Shift | KeyCode.Escape]113}114}));115116registerEditorCommand(new ParameterHintsCommand({117id: 'showPrevParameterHint',118precondition: ContextKeyExpr.and(Context.Visible, Context.MultipleSignatures),119handler: x => x.previous(),120kbOpts: {121weight: weight,122kbExpr: EditorContextKeys.focus,123primary: KeyCode.UpArrow,124secondary: [KeyMod.Alt | KeyCode.UpArrow],125mac: { primary: KeyCode.UpArrow, secondary: [KeyMod.Alt | KeyCode.UpArrow, KeyMod.WinCtrl | KeyCode.KeyP] }126}127}));128129registerEditorCommand(new ParameterHintsCommand({130id: 'showNextParameterHint',131precondition: ContextKeyExpr.and(Context.Visible, Context.MultipleSignatures),132handler: x => x.next(),133kbOpts: {134weight: weight,135kbExpr: EditorContextKeys.focus,136primary: KeyCode.DownArrow,137secondary: [KeyMod.Alt | KeyCode.DownArrow],138mac: { primary: KeyCode.DownArrow, secondary: [KeyMod.Alt | KeyCode.DownArrow, KeyMod.WinCtrl | KeyCode.KeyN] }139}140}));141142143