Piszę rozszerzenie do Visual Studio intellisense i chciałbym uzyskać typ elementu tuż przed kursorem w edytorze C#.Znajdź typ elementu w bieżącej pozycji w oknie edytora C#
Obecnie mam ITextBuffer
, którego mogę użyć do pobrania bieżącego pliku źródłowego.
mogę również uzyskać aktualną pozycję w redakcji, jak poniżej:
var dte = Microsoft.VisualStudio.Shell.ServiceProvider.GlobalProvider.GetService(typeof(EnvDTE._DTE)) as EnvDTE.DTE;
TextSelection sel = (TextSelection)dte.ActiveDocument.Selection;
Jednak nie jestem zbyt pewny jak wykryć typ elementu obecnie za kursorem w edytorze. Próbowałem używać Roslyn, ale wygląda na to, że powinno to być znacznie prostsze niż to. Czy Roslyn jest najlepszym narzędziem do tego (poprzez kompilację dokumentu i nawigację do właściwej pozycji w dokumencie), czy jest lepszy sposób?
Poniżej moja próba znalezienia typ elementu za pomocą Roslyn: (. Nie logiki rozmytej)
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 Ciekawie będzie posłuchać, co Eric ma do powiedzenia na ten temat. – MoonKnight
Dlaczego nie używasz 'ITextView.Caret.Position'? – leppie
@leppie im całkiem nowy do SDK VS, ale to brzmi jak o wiele łatwiejszy sposób, aby uzyskać obecny kursor pos, ja go zmienię –