【问题标题】:How to open Visual Studio code editor at given Roslyn SyntaxNode?如何在给定的 Roslyn SyntaxNode 打开 Visual Studio 代码编辑器?
【发布时间】:2019-08-02 11:59:22
【问题描述】:

给定一个SyntaxNode 实例,如何打开适当的源代码文件并将光标放在节点所在的位置?

我正在编写一些简单的分析器。我可以按需启动它并从当前光标位置获取语法节点。但我不知道如何从结果语法节点返回编辑器。我看到该节点有一个 Span 属性,但除此之外我没有看到任何信息。我要显示的节点可以在其他一些甚至可能无法打开的文件中。

我希望我的搜索结果具有类似于“转到...”命令的行为。

【问题讨论】:

    标签: c# visual-studio editor roslyn vssdk


    【解决方案1】:

    我花了一整天的时间,终于搞定了。

    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);
    }
    

    【讨论】:

      【解决方案2】:

      语法节点有一个GetLocation() 方法,该方法为该语法节点返回一个Microsoft.CodeAnalysis.Location,因此这是从SyntaxNode 获取位置对象的一种方法。

      var nodeLocation = syntaxNode.GetLocation();
      

      如果您碰巧也需要符号,您还可以使用ISymbol 接口上的Locations 属性从符号中获取位置信息。来自文档:

      在源或元数据中获取最初定义符号的位置。某些符号(例如,部分类)可能在多个位置定义。

      https://docs.microsoft.com/en-us/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];
      

      至于实际跳转到节点,这个问题可能是一个很好的起点: Go to definition from text position with roslyn

      但是,在 Visual Studio 中,双击错误列表面板中的消息即可实现这一点。此外,您想在该位置进行的任何代码修复都将显示在代码修复窗口中。

      【讨论】:

      • 谢谢,我在 location 中找到了文件路径,但仍然不知道该为谁打开代码编辑器。问题是我没有产生任何错误/警告,也没有提供任何代码修复。我已经为分析结果创建了自己的窗口,并希望从那里打开位置...
      • 您想打开一个新的 Visual Studio 还是 Visual Studio 代码窗口?从您的问题的标题来看,这并不完全清楚。
      • 理想情况下,我希望文件能够像“转到定义”一样打开。我刚刚试过DTE.ItemsOperations.Navigate()DTE.ItemsOperations.OpenFile() 没有成功
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多