Я пишу расширение для Visual Studio intellisense и хотел бы получить тип элемента непосредственно перед курсором в редакторе C #.
В настоящее время у меня есть ITextBuffer
, который я могу использовать для получения текущего исходного файла.
Я также могу получить текущую позицию в редакторе, как показано ниже:
var dte = Microsoft.VisualStudio.Shell.ServiceProvider.GlobalProvider.GetService(typeof(EnvDTE._DTE)) as EnvDTE.DTE;
TextSelection sel = (TextSelection)dte.ActiveDocument.Selection;
Однако я не слишком уверен, как определить тип элемента, который в данный момент находится за курсором в редакторе. Я пытался использовать Roslyn, но кажется, что это должно быть намного проще, чем это. Является ли Roslyn лучшим инструментом для этого (путем компиляции документа и перехода к нужной позиции в документе )или есть лучший способ.
Ниже моя попытка найти тип предмета с помощью Roslyn:
ITextSnapshot snapshot = m_textBuffer.CurrentSnapshot;
SnapshotPoint? triggerPoint = session.GetTriggerPoint(snapshot);
var tree = SyntaxTree.ParseCompilationUnit(m_textBuffer.CurrentSnapshot.GetText());
var nodes = tree.GetRoot().DescendantNodes();
var element = nodes.Where(n => n.Span.End <= triggerPoint.Value.Position).Last();
var comp = Compilation.Create("test", syntaxTrees: new[] { tree });
var semModel = comp.GetSemanticModel(tree);
//I cant work out what to do here to get the type as the element doesnt seem to be of the required type
var s = semModel.GetTypeInfo((AttributeSyntax)element);