Obtenha Roslyn SyntaxToken na seleção de texto do Visual Studio (posição do cursor)

Estou tentando fazer uma ponte entre o VSSDK e o Roslyn SDK em um pacote de extensão do Visual Studio e estou tendo problemas com isso. O ActivePoint.AbsoluteCharOffset fornecido pelo Visual Studio não corresponde ao elemento que recebo do Roslyn ao usar o FindToken (deslocamento). Tenho certeza de que isso tem a ver com a forma como cada lado conta os caracteres EOL com base no meu hack de trabalho atual, mas não tenho 100% de certeza que meu hack se manterá no longo prazo.

Meu hack é esta linha:charOffset += point.Line;

Eu adiciono o número de linhas no deslocamento de char, isso parece funcionar, então acho que estou adicionando todos os caracteres de quebra de linha que estão sendo ignorados pela contagem de pontos ativos.

Ajudantes

private VisualStudioWorkspace workspace = null;
public RoslynUtilities(VisualStudioWorkspace workspace)
{
    this.workspace = workspace;
}
public Solution Solution { get { return workspace.CurrentSolution; } }
public Document GetDocumentFromPath(string fullPath)
{
    foreach (Project proj in this.Solution.Projects)
    {               
        foreach (Document doc in proj.Documents)
        {
            if (doc.FilePath == fullPath)
                return doc;                   
        }
    }
    return null;
}
public SyntaxTree GetSyntaxTreeFromDocumentPath(string fullPath)
{
    Document doc = GetDocumentFromPath(fullPath);
    if (doc != null)
        return doc.GetSyntaxTreeAsync().Result;
    else
        return null;
}
public SyntaxNode GetNodeByFilePosition(string fullPath, int absoluteChar)
{
    SyntaxTree tree = GetSyntaxTreeFromDocumentPath(fullPath);
    if(tree != null)
    {
        var compUnit = tree.GetCompilationUnitRoot();
        if(compUnit != null)
        {
            return compUnit.FindToken(absoluteChar, true).Parent;
        }
    }
    return null;                        
}
private VisualStudioWorkspace GetRoslynWorkspace()
    {
        var componentModel = (IComponentModel)GetGlobalService(typeof(SComponentModel));
        return componentModel.GetService<VisualStudioWorkspace>();
    }

Parte principal

EnvDTE80.DTE2 applicationObject = (EnvDTE80.DTE2)GetService(typeof(SDTE));
EnvDTE.TextSelection ts = applicationObject.ActiveWindow.Selection as EnvDTE.TextSelection;
if (ts == null)
    return;

EnvDTE.VirtualPoint point = ts.ActivePoint;
int charOffset = point.AbsoluteCharOffset;
charOffset += point.Line;//HACK ALERT

Parse.Roslyn.RoslynUtilities roslyn = new Parse.Roslyn.RoslynUtilities(GetRoslynWorkspace());
SyntaxNode node = roslyn.GetNodeByFilePosition(applicationObject.ActiveDocument.FullName, charOffset);

questionAnswers(1)

yourAnswerToTheQuestion