Microsoft.R.Editor.TextViewExtensions.GetItemAtPosition C# (CSharp) Method

GetItemAtPosition() public static method

public static GetItemAtPosition ( ITextSnapshotLine line, int position, bool>.Func tokenTypeCheck, Span &span ) : string
line ITextSnapshotLine
position int
tokenTypeCheck bool>.Func
span Span
return string
        public static string GetItemAtPosition(ITextSnapshotLine line, int position, Func<RTokenType, bool> tokenTypeCheck, out Span span) {
            string lineText = line.GetText();
            var offset = 0;
            var positionInTokens = position - line.Start;
            var tokenizer = new RTokenizer();
            var tokens = tokenizer.Tokenize(lineText);
            var tokenIndex = tokens.GetItemContaining(positionInTokens);
            if (tokenIndex >= 0) {
                var token = tokens[tokenIndex];
                if (token.TokenType == RTokenType.Comment) {
                    // Tokenize inside comment since we do want F1 to work inside 
                    // commented out code, code samples or Roxygen blocks.
                    positionInTokens -= token.Start;
                    offset = token.Start + 1;
                    tokens = tokenizer.Tokenize(lineText.Substring(offset, token.Length - 1));
                    tokenIndex = tokens.GetItemContaining(positionInTokens);
                    if (tokenIndex >= 0) {
                        token = tokens[tokenIndex];
                    }
                }
                if (tokenTypeCheck(token.TokenType)) {
                    var start = token.Start + offset;
                    var end = Math.Min(start + token.Length, line.End);
                    span = Span.FromBounds(line.Start + start, line.Start + end); // return view span
                    return lineText.Substring(start, end - start);
                }
            }

            span = Span.FromBounds(0, 0);
            return string.Empty;
        }