typescript-language-server
Version:
Language Server Protocol (LSP) implementation for TypeScript using tsserver
82 lines • 3.55 kB
JavaScript
/*
* Copyright (C) 2017, 2018 TypeFox and others.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*/
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as lsp from 'vscode-languageserver';
import { asDocumentation, asPlainText } from './protocol-translation.js';
export function asSignatureHelp(info, context) {
const signatures = info.items.map(asSignatureInformation);
return {
activeSignature: getActiveSignature(info, signatures, context),
activeParameter: getActiveParameter(info),
signatures,
};
}
function getActiveSignature(info, signatures, context) {
// Try matching the previous active signature's label to keep it selected
if (context?.activeSignatureHelp?.activeSignature !== undefined) {
const previouslyActiveSignature = context.activeSignatureHelp.signatures[context.activeSignatureHelp.activeSignature];
if (previouslyActiveSignature && context.isRetrigger) {
const existingIndex = signatures.findIndex(other => other.label === previouslyActiveSignature.label);
if (existingIndex !== -1) {
return existingIndex;
}
}
}
return info.selectedItemIndex;
}
function getActiveParameter(info) {
const activeSignature = info.items[info.selectedItemIndex];
if (activeSignature?.isVariadic) {
return Math.min(info.argumentIndex, activeSignature.parameters.length - 1);
}
return info.argumentIndex;
}
function asSignatureInformation(item) {
const parameters = item.parameters.map(asParameterInformation);
const signature = {
label: asPlainText(item.prefixDisplayParts),
documentation: asDocumentation({
documentation: item.documentation,
tags: item.tags.filter(x => x.name !== 'param'),
}),
parameters,
};
signature.label += parameters.map(parameter => parameter.label).join(asPlainText(item.separatorDisplayParts));
signature.label += asPlainText(item.suffixDisplayParts);
return signature;
}
function asParameterInformation(parameter) {
return {
label: asPlainText(parameter.displayParts),
documentation: asDocumentation(parameter),
};
}
export function toTsTriggerReason(context) {
switch (context.triggerKind) {
case lsp.SignatureHelpTriggerKind.TriggerCharacter:
if (context.triggerCharacter) {
if (context.isRetrigger) {
return { kind: 'retrigger', triggerCharacter: context.triggerCharacter };
}
else {
return { kind: 'characterTyped', triggerCharacter: context.triggerCharacter };
}
}
else {
return { kind: 'invoked' };
}
case lsp.SignatureHelpTriggerKind.ContentChange:
return context.isRetrigger ? { kind: 'retrigger' } : { kind: 'invoked' };
case lsp.SignatureHelpTriggerKind.Invoked:
default:
return { kind: 'invoked' };
}
}
//# sourceMappingURL=hover.js.map