簡體   English   中英

如何在給定的Roslyn SyntaxNode上打開Visual Studio代碼編輯器?

[英]How to open Visual Studio code editor at given Roslyn SyntaxNode?

給定一個SyntaxNode實例,我如何打開適當的源代碼文件並將光標放在該節點所在的位置?

我正在寫一些簡單的分析器。 我可以按需啟動它,並從當前光標位置獲取語法節點。 但是我不知道如何從結果語法節點返回編輯器。 我看到該節點具有Span屬性,但Span ,我沒有看到任何信息。 我要顯示的節點可能在其他文件中,甚至可能沒有打開。

對於搜索結果,我希望具有類似於“轉到...”命令的行為。

我花了一整天的時間,但終於明白了。

private void selectNodeInEditor(SyntaxNode n) {
    var cm = (IComponentModel)Package.GetGlobalService(typeof(SComponentModel));
    var tm = (IVsTextManager)Package.GetGlobalService(typeof(SVsTextManager));
    var ws = (Workspace)cm.GetService<VisualStudioWorkspace>();
    var did = ws.CurrentSolution.GetDocumentId(n.SyntaxTree);
    ws.OpenDocument(did);
    tm.GetActiveView(1, null, out var av);
    var sp = n.GetLocation().GetMappedLineSpan().StartLinePosition;
    var ep = n.GetLocation().GetMappedLineSpan().EndLinePosition;
    av.SetSelection(sp.Line, sp.Character, ep.Line, ep.Character);
}

語法節點具有GetLocation()方法,該方法返回該語法節點的Microsoft.CodeAnalysis.Location ,因此這是從SyntaxNode獲取位置對象的一種方法。

var nodeLocation = syntaxNode.GetLocation();

如果您碰巧也需要符號,則還可以使用ISymbol接口上的Locations屬性從符號中獲取位置信息。 從文檔:

獲取源或元數據中最初定義符號的位置。 某些符號(例如,部分類)可能在一個以上的位置中定義。

https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.codeanalysis.isymbol?view=roslyn-dotnet

這可能是更可取的,因為取決於SyntaxNode的類型,您可能希望獲取符號的原始定義,而不是符號本身,例如,您可以從字段的類型獲取類聲明。 這可以通過OriginalDefinition屬性完成。

// assumes there's a SemanticModel in scope and your node is called synatxNode
var syntaxNodeSymbol = semanticModel.GetSymbolInfo(syntaxNode).Symbol;

// make sure syntaxNodeSymbol is null checked

var nodeLocation = syntaxNodeSymbol.Locations[0];
var originalNodeLocation = syntaxNodeSymbol.OriginalDefinition.Locations[0];

至於實際跳到該節點,這個問題可能是一個很好的起點: 用roslyn從文本位置轉到定義

但是,通過在錯誤列表面板中雙擊消息,這已經可以在Visual Studio中實現。 此外,您要在該位置進行的任何代碼修復都將顯示在代碼修復窗口中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM