Skip to content

Commit 9fa354a

Browse files
committed
update internal API to allow parameter label to be an offset-range of its the signature label, microsoft#56337
1 parent 107e4bb commit 9fa354a

5 files changed

Lines changed: 33 additions & 35 deletions

File tree

‎src/vs/editor/common/modes.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ export interface ParameterInformation {
557557
* The label of this signature. Will be shown in
558558
* the UI.
559559
*/
560-
label: string;
560+
label: string | [number, number];
561561
/**
562562
* The human-readable doc-comment of this signature. Will be shown
563563
* in the UI but can be omitted.

‎src/vs/editor/contrib/parameterHints/parameterHints.css‎

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,6 @@
107107
display: block;
108108
}
109109

110-
.monaco-editor .parameter-hints-widget .signature .parameter {
111-
display: inline-block;
112-
}
113-
114110
.monaco-editor .parameter-hints-widget .signature .parameter.active {
115111
font-weight: bold;
116112
text-decoration: underline;
@@ -131,4 +127,4 @@
131127
.monaco-editor.hc-black .parameter-hints-widget .button.next,
132128
.monaco-editor.vs-dark .parameter-hints-widget .button.next {
133129
background-image: url('arrow-down-dark.svg');
134-
}
130+
}

‎src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts‎

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,7 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable {
432432
this.overloads.textContent = currentOverload;
433433

434434
if (activeParameter) {
435-
const labelToAnnounce = activeParameter.label;
435+
const labelToAnnounce = this.getParameterLabel(signature, this.hints.activeParameter);
436436
// Select method gets called on every user type while parameter hints are visible.
437437
// We do not want to spam the user with same announcements, so we only announce if the current parameter changed.
438438

@@ -447,39 +447,41 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable {
447447
}
448448

449449
private renderParameters(parent: HTMLElement, signature: modes.SignatureInformation, currentParameter: number): void {
450-
let end = signature.label.length;
451-
let idx = 0;
452-
let element: HTMLSpanElement;
453450

454-
for (let i = signature.parameters.length - 1; i >= 0; i--) {
455-
const parameter = signature.parameters[i];
456-
idx = signature.label.lastIndexOf(parameter.label, end - 1);
451+
let [start, end] = this.getParameterLabelOffsets(signature, currentParameter);
457452

458-
let signatureLabelOffset = 0;
459-
let signatureLabelEnd = 0;
453+
let beforeSpan = document.createElement('span');
454+
beforeSpan.textContent = signature.label.substring(0, start);
460455

461-
if (idx >= 0) {
462-
signatureLabelOffset = idx;
463-
signatureLabelEnd = idx + parameter.label.length;
464-
}
456+
let paramSpan = document.createElement('span');
457+
paramSpan.textContent = signature.label.substring(start, end);
458+
paramSpan.className = 'parameter active';
465459

466-
// non parameter part
467-
element = document.createElement('span');
468-
element.textContent = signature.label.substring(signatureLabelEnd, end);
469-
dom.prepend(parent, element);
460+
let afterSpan = document.createElement('span');
461+
afterSpan.textContent = signature.label.substring(end);
470462

471-
// parameter part
472-
element = document.createElement('span');
473-
element.className = `parameter ${i === currentParameter ? 'active' : ''}`;
474-
element.textContent = signature.label.substring(signatureLabelOffset, signatureLabelEnd);
475-
dom.prepend(parent, element);
463+
dom.append(parent, beforeSpan, paramSpan, afterSpan);
464+
}
476465

477-
end = signatureLabelOffset;
466+
private getParameterLabel(signature: modes.SignatureInformation, paramIdx: number): string {
467+
const param = signature.parameters[paramIdx];
468+
if (typeof param.label === 'string') {
469+
return param.label;
470+
} else {
471+
return signature.label.substring(param.label[0], param.label[1]);
472+
}
473+
}
474+
475+
private getParameterLabelOffsets(signature: modes.SignatureInformation, paramIdx: number): [number, number] {
476+
const param = signature.parameters[paramIdx];
477+
if (Array.isArray(param.label)) {
478+
return param.label;
479+
} else {
480+
const idx = signature.label.lastIndexOf(param.label);
481+
return idx >= 0
482+
? [idx, idx + param.label.length]
483+
: [0, 0];
478484
}
479-
// non parameter part
480-
element = document.createElement('span');
481-
element.textContent = signature.label.substring(0, end);
482-
dom.prepend(parent, element);
483485
}
484486

485487
// private select(position: number): void {

‎src/vs/monaco.d.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4834,7 +4834,7 @@ declare namespace monaco.languages {
48344834
* The label of this signature. Will be shown in
48354835
* the UI.
48364836
*/
4837-
label: string;
4837+
label: string | [number, number];
48384838
/**
48394839
* The human-readable doc-comment of this signature. Will be shown
48404840
* in the UI but can be omitted.

‎src/vs/workbench/api/node/extHostTypeConverters.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ export namespace ParameterInformation {
578578
}
579579
export function to(info: modes.ParameterInformation): types.ParameterInformation {
580580
return {
581-
label: info.label,
581+
label: typeof info.label === 'string' ? info.label : '', //todo@joh
582582
documentation: htmlContent.isMarkdownString(info.documentation) ? MarkdownString.to(info.documentation) : info.documentation
583583
};
584584
}

0 commit comments

Comments
 (0)