public static IReadOnlyList<ISignatureInfo> ParseSignatures(string usageContent, IReadOnlyDictionary<string, string> argumentsDescriptions = null) { // RD signature text may contain \dots sequence which denotes ellipsis. // R parser does not know about it and hence we will replace \dots by ... // Also, signatures may contain S3 method info like // '\method{as.matrix}{data.frame}(x, rownames.force = NA, \dots)' // which we need to filter out since they are irrelevant to intellisense. List<ISignatureInfo> signatures = new List<ISignatureInfo>(); usageContent = usageContent.Replace(@"\dots", "..."); RTokenizer tokenizer = new RTokenizer(separateComments: true); IReadOnlyTextRangeCollection<RToken> collection = tokenizer.Tokenize(usageContent); ITextProvider textProvider = new TextStream(usageContent); TokenStream<RToken> tokens = new TokenStream<RToken>(collection, RToken.EndOfStreamToken); var parseContext = new ParseContext(textProvider, TextRange.FromBounds(tokens.CurrentToken.Start, textProvider.Length), tokens, tokenizer.CommentTokens); while (!tokens.IsEndOfStream()) { // Filter out '\method{...}{}(signature) if (tokens.CurrentToken.TokenType == RTokenType.OpenCurlyBrace) { // Check if { is preceded by \method } if (tokens.CurrentToken.TokenType != RTokenType.Identifier) { break; } string functionName = textProvider.GetText(tokens.CurrentToken); tokens.MoveToNextToken(); ISignatureInfo info = ParseSignature(functionName, parseContext, argumentsDescriptions); if (info != null) { signatures.Add(info); } } return signatures; }