Try preserving selected signature better in js/ts

Fixes #94834
This commit is contained in:
Matt Bierner 2020-04-09 15:06:30 -07:00
parent 3978fab7f1
commit 8b46fd0645

View file

@ -40,14 +40,27 @@ class TypeScriptSignatureHelpProvider implements vscode.SignatureHelpProvider {
const info = response.body;
const result = new vscode.SignatureHelp();
result.activeSignature = info.selectedItemIndex;
result.activeParameter = this.getActiveParmeter(info);
result.signatures = info.items.map(signature => this.convertSignature(signature));
result.activeSignature = this.getActiveSignature(context, info, result.signatures);
result.activeParameter = this.getActiveParameter(info);
return result;
}
private getActiveParmeter(info: Proto.SignatureHelpItems): number {
private getActiveSignature(context: vscode.SignatureHelpContext, info: Proto.SignatureHelpItems, signatures: readonly vscode.SignatureInformation[]): number {
// Try matching the previous active signature's label to keep it selected
const previouslyActiveSignature = context.activeSignatureHelp?.signatures[context.activeSignatureHelp.activeSignature];
if (previouslyActiveSignature && context.isRetrigger) {
const existingIndex = signatures.findIndex(other => other.label === previouslyActiveSignature?.label);
if (existingIndex >= 0) {
return existingIndex;
}
}
return info.selectedItemIndex;
}
private getActiveParameter(info: Proto.SignatureHelpItems): number {
const activeSignature = info.items[info.selectedItemIndex];
if (activeSignature && activeSignature.isVariadic) {
return Math.min(info.argumentIndex, activeSignature.parameters.length - 1);