Tôi đang viết phần mở rộng cho Visual Studio intellisense và muốn nhận loại mục ngay trước con trỏ trong trình soạn thảo C#.Tìm loại mục ở vị trí hiện tại trong cửa sổ soạn thảo C#
Tôi hiện có một số ITextBuffer
mà tôi có thể sử dụng để lấy tệp nguồn hiện tại.
Tôi cũng có thể có được vị trí hiện tại trong trình soạn thảo như sau:
var dte = Microsoft.VisualStudio.Shell.ServiceProvider.GlobalProvider.GetService(typeof(EnvDTE._DTE)) as EnvDTE.DTE;
TextSelection sel = (TextSelection)dte.ActiveDocument.Selection;
Tuy nhiên tôi không quá chắc chắn làm thế nào để phát hiện các loại mặt hàng đó hiện đằng sau con trỏ trong trình soạn thảo. Tôi đã thử sử dụng Roslyn nhưng có vẻ như đây là một điều đơn giản hơn nhiều để làm hơn thế này. Roslyn có phải là công cụ tốt nhất để thực hiện điều này hay không (thông qua biên dịch tài liệu và điều hướng đến vị trí chính xác trong tài liệu) hoặc có cách nào tốt hơn.
Dưới đây là nỗ lực của tôi trong việc tìm các loại mặt hàng sử dụng Roslyn: (. Không logic mờ)
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 Thật thú vị khi nghe những gì Eric nói về điều này. – MoonKnight
Tại sao bạn không sử dụng 'ITextView.Caret.Position'? – leppie
@leppie im khá mới với VS sdk nhưng âm thanh đó giống như một cách dễ dàng hơn nhiều để có được vị trí con trỏ hiện tại, tôi sẽ thay đổi nó –