From 0e48aab0732f76182826069fb7c29f6138f90b5d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 Aug 2016 18:57:56 +0200 Subject: [PATCH] use lastIndexOf for parameter hints, still just educated guessing, #10293 --- src/vs/base/browser/dom.ts | 5 ++ .../browser/parameterHintsWidget.ts | 53 ++++++++++--------- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index f20eba078b1..0203c04e124 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -936,6 +936,11 @@ export function append(parent: HTMLElement, child: T): T { return child; } +export function prepend(parent: HTMLElement, child: T): T { + parent.insertBefore(child, parent.firstChild); + return child; +} + const SELECTOR_REGEX = /([\w\-]+)?(#([\w\-]+))?((.([\w\-]+))*)/; // Similar to builder, but much more lightweight diff --git a/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts b/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts index 66dfda5ce5b..2011f50e4d5 100644 --- a/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts +++ b/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts @@ -314,47 +314,50 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable { if(!hasParameters) { const label = dom.append(code, $('span')); label.textContent = signature.label; - return code; + + } else { + this.renderParameters(code, signature, currentParameter); } - const parameters = $('span.parameters'); - let offset = 0; - let idx = 0; + return signatureElement; + } - for (let i = 0, len = signature.parameters.length; i < len; i++) { + private renderParameters(parent: HTMLElement, signature: SignatureInformation, currentParameter: number): void { + + let end = signature.label.length; + let idx = 0; + let element: HTMLSpanElement; + + for (let i = signature.parameters.length - 1; i >= 0; i--) { const parameter = signature.parameters[i]; - idx = signature.label.indexOf(parameter.label, idx); + idx = signature.label.lastIndexOf(parameter.label, end); let signatureLabelOffset = 0; let signatureLabelEnd = 0; if (idx >= 0) { signatureLabelOffset = idx; - idx += parameter.label.length; - signatureLabelEnd = idx; + signatureLabelEnd = idx + parameter.label.length; } - const element = i === 0 ? code : parameters; + // non parameter part + element = document.createElement('span'); + element.textContent = signature.label.substring(signatureLabelEnd, end); + dom.prepend(parent, element); - const label = $('span'); - label.textContent = signature.label.substring(offset, signatureLabelOffset); - dom.append(element, label); + // parameter part + element = document.createElement('span'); + element.className = `parameter ${i === currentParameter ? 'active' : ''}`; + element.textContent = signature.label.substring(signatureLabelOffset, signatureLabelEnd); + dom.prepend(parent, element); - const parameterElement = $('span.parameter'); - dom.addClass(parameterElement, i === currentParameter ? 'active' : ''); - parameterElement.textContent = signature.label.substring(signatureLabelOffset, signatureLabelEnd); - dom.append(parameters, parameterElement); - - offset = signatureLabelEnd; + end = signatureLabelOffset; } + // non parameter part + element = document.createElement('span'); + element.textContent = signature.label.substring(0, end); + dom.prepend(parent, element); - const label = $('span'); - label.textContent = signature.label.substring(offset); - - dom.append(code, parameters); - dom.append(code, label); - - return signatureElement; } private renderDocumentation(element: HTMLElement, signature:SignatureInformation, activeParameterIdx:number): void {