private static IEnumerable <IRFunctionSignatureHelp> MakeSignatures(IFunctionInfo functionInfo, ITrackingTextRange applicableToSpan, IRIntellisenseContext context) { var signatures = new List <IRFunctionSignatureHelp>(); if (functionInfo?.Signatures != null) { signatures.AddRange(functionInfo.Signatures.Select(s => RFunctionSignatureHelp.Create(context, functionInfo, s, applicableToSpan))); context.Session.Properties["functionInfo"] = functionInfo; } return(signatures); }
public static IRFunctionSignatureHelp Create(IRIntellisenseContext context, IFunctionInfo functionInfo, ISignatureInfo signatureInfo, ITrackingTextRange applicableSpan) { var sig = new RFunctionSignatureHelp(context.Session, context.EditorBuffer, functionInfo.Name, string.Empty, signatureInfo); var paramList = new List <ISignatureParameterHelp>(); // Locus points in the pretty printed signature (the one displayed in the tooltip) var locusPoints = new List <int>(); var signatureString = signatureInfo.GetSignatureString(functionInfo.Name, locusPoints); sig.Content = signatureString; sig.ApplicableToRange = applicableSpan; sig.Documentation = functionInfo.Description?.Wrap(Math.Min(MaxSignatureLength, sig.Content.Length)); Debug.Assert(locusPoints.Count == signatureInfo.Arguments.Count + 1); for (var i = 0; i < signatureInfo.Arguments.Count; i++) { var p = signatureInfo.Arguments[i]; if (p != null) { var locusStart = locusPoints[i]; var locusLength = locusPoints[i + 1] - locusStart; Debug.Assert(locusLength >= 0); var locus = new TextRange(locusStart, locusLength); // VS may end showing very long tooltip so we need to keep // description reasonably short: typically about // same length as the function signature. var description = p.Description.Wrap(Math.Min(MaxSignatureLength, sig.Content.Length)); paramList.Add(new RSignatureParameterHelp(description, locus, p.Name, sig)); } } sig.Parameters = new ReadOnlyCollection <ISignatureParameterHelp>(paramList); sig.ComputeCurrentParameter(context.AstRoot, context.Position); return(sig); }