【问题标题】:Get Roslyn SyntaxNode at cursor in command handler在命令处理程序中的光标处获取 Roslyn SyntaxNode
【发布时间】:2021-06-07 15:25:48
【问题描述】:

虽然在DiagnosticAnalyzer 中很容易获得所需的语法节点(因为它会传递给您),但尚不清楚如何在其他上下文中获取 Roslyn 中的语法节点。例如,Roslyn 语法可视化器(源似乎不可用)如何获取光标下的语法节点?

我想要做的是实现一个命令,该命令可以利用 Roslyn 语法树来确定调用命令时光标的位置。我一直找不到以这种方式使用 Roslyn。

【问题讨论】:

  • 也许 Roslyn 只是使用标准的标签和分类系统? msdn.microsoft.com/en-us/library/…
  • @MickyDuncan 它有自己的位置和范围表示 - github.com/dotnet/roslyn/blob/master/src/Compilers/Core/… (很可能在两者之间进行映射,但我希望有一个正确的方法来做到这一点。 ..)
  • 有趣的是,我也在调查同样的事情。只是出于好奇,您的扩展程序是做什么的?
  • @petrk。我正在实现与 ReSharper 在您点击 Alt-End 时所做的非常相似的事情 - 如果插入符号位于接口成员或虚拟成员上,它将导航到实现,或者如果有多个实现则显示一个列表。
  • @IanGriffiths:听起来不错。我正在实施类似 ReSharper 的重新排列代码元素功能(上移/下移和左移/右移)

标签: c# visual-studio


【解决方案1】:

这里是github Sytax Visualizer 的源代码链接

【讨论】:

    【解决方案2】:

    首先,您需要获取当前的文本缓冲区。这有点复杂,我个人使用了 Mads Kristensen 在他的开源 WebEssentials 中编写的代码。请参阅ProjectHelpers.cs 中的GetCurentTextBuffer()

    其次,要检索适当的 Roslyn 结构(例如 Document),您可以使用 Roslyn 中的一种扩展方法(请参阅 Microsoft.CodeAnalysis.Text.Extensions)。这个特殊位的灵感来自blog post by Josh Varty

    从那里,获取 Roslyn 文档的 SyntaxTree 并找到插入符号位置的节点非常简单。

    【讨论】:

      猜你喜欢
      • 2012-03-08
      • 2021-12-31
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      • 2022-11-18
      • 2011-03-27
      相关资源
      最近更新 更多