Escribo una extensión de Visual Studio intellisense y me gustaría obtener el tipo de elemento justo antes del cursor en un editor de C#.Encuentra el tipo de artículo en la posición actual en una ventana del editor de C#
Actualmente tengo un ITextBuffer
que puedo usar para obtener el archivo fuente actual.
también puedo obtener la posición actual en el editor de la siguiente manera:
var dte = Microsoft.VisualStudio.Shell.ServiceProvider.GlobalProvider.GetService(typeof(EnvDTE._DTE)) as EnvDTE.DTE;
TextSelection sel = (TextSelection)dte.ActiveDocument.Selection;
Sin embargo, no estoy muy seguro de cómo detectar el tipo del elemento actualmente detrás del cursor en el editor. Intenté usar Roslyn pero parece que esto debería ser mucho más simple que esto. ¿Es Roslyn la mejor herramienta para hacerlo (compilando el documento y navegando hasta la posición correcta en el documento) o existe una mejor manera?
A continuación es mi intento de encontrar el tipo del elemento utilizando Roslyn: (n. ° lógica difusa)
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);
+1 Será interesante escuchar lo que Eric tiene que decir al respecto. – MoonKnight
¿Por qué no estás usando 'ITextView.Caret.Position'? – leppie
@leppie soy bastante nuevo en el sdk VS pero parece una forma mucho más fácil de obtener el cursor actual pos, lo cambiaré –