Пример #1
0
        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;
        }