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;
}