我正在编写 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);