在 Visual Studio 中使用 Roslyn 语法可视化工具浏览代码

本文概述了作为 .NET 编译器平台(“Roslyn”)SDK 的一部分提供的语法可视化工具。 语法可视化工具是一个工具窗口,可帮助你检查和浏览语法树。 这是了解要分析的代码模型的基本工具。 使用 .NET 编译器平台(“Roslyn”)SDK 开发自己的应用程序时,这也是调试帮助。 创建第一个分析器时打开此工具。 可视化工具可帮助你了解 API 使用的模型。 还可以使用 SharpLabLINQPad 等工具检查代码并了解语法树。

安装说明 - Visual Studio 安装程序

Visual Studio 安装程序中查找 .NET 编译器平台 SDK 有两种不同的方法:

使用 Visual Studio 安装程序进行安装 - 工作负载视图

不会自动选择 .NET 编译器平台 SDK 作为 Visual Studio 扩展开发工作负载的一部分。 必须将其选为可选组件。

  1. 运行 Visual Studio 安装程序
  2. 选择“修改”
  3. 检查 Visual Studio 扩展开发 工作负载。
  4. 在摘要树中打开 Visual Studio 扩展开发 节点。
  5. 勾选 .NET 编译器平台 SDK 的框。 将在可选组件最下面找到它。

(可选)还需要 DGML 编辑器 在可视化工具中显示图形:

  1. 在摘要树中打开 “单个组件 ”节点。
  2. 选中框以启用 DGML 编辑器

使用 Visual Studio 安装程序 - 单个组件选项卡进行安装

  1. 运行 Visual Studio 安装程序
  2. 选择“修改”
  3. 选择 “单个组件 ”选项卡
  4. 勾选 .NET 编译器平台 SDK 的框。 可在 编译器、生成工具和运行时 部分的顶部找到它。

(可选)还需要 DGML 编辑器 在可视化工具中显示图形:

  1. 选中“DGML 编辑器”框。 可在 “代码工具” 部分下找到它。

阅读 概述 文章,熟悉 .NET 编译器平台 SDK 中使用的概念。 它介绍语法树、节点、令牌和琐事。

Syntax Visualizer

语法可视化工具允许检查 Visual Studio IDE 中当前活动编辑器窗口中 C# 或 Visual Basic 代码文件的语法树。 可以通过单击“查看>其他窗口>语法可视化器”来启动可视化器。 还可以使用右上角的 “快速启动 ”工具栏。 键入“syntax”,并显示用于打开 语法可视化工具 的命令。

此命令将语法可视化工具作为浮动工具窗口打开。 如果没有打开代码编辑器窗口,则显示为空白,如下图所示。

语法可视化工具窗口

将此工具窗口停靠在 Visual Studio 中方便操作的位置,例如左侧。 可视化工具显示有关当前代码文件的信息。

使用 “文件>新建项目” 命令创建新项目。 可以创建 Visual Basic 或 C# 项目。 当 Visual Studio 打开此项目的主代码文件时,可视化工具将显示该项目的语法树。 可以在此 Visual Studio 实例中打开任何现有的 C# /Visual Basic 文件,可视化工具将显示该文件的语法树。 如果在 Visual Studio 中打开了多个代码文件,可视化工具将显示当前活动代码文件的语法树(具有键盘焦点的代码文件)。

  • C#
  • Visual Basic

可视化 C# 语法树

如前面的图像所示,可视化工具窗口显示顶部的语法树和底部的属性网格。 属性网格显示当前在树中选中的项的属性,包括项的 .NET 类型和种类(SyntaxKind)

语法树包括三种类型的项 - 节点令牌琐碎项。 可以在 “使用语法 ”一文中详细了解这些类型。 每种类型的项都使用不同的颜色表示。 单击“图例”按钮,获取所用颜色的概述。

树中的每个项也显示其自己的 范围范围是文本文件中该节点的索引(起始和结束位置)。 在前面的 C# 示例中,所选择的“UsingKeyword [0..5)”标记的范围宽度为 5 个字符,即 [0..5)。 起始索引是跨度的一部分,而结束索引不是。"[\..)"表示法表示这个意思。

可通过两种方法导航树:

  • 展开或点击树状图中的元素。 可视化工具会自动选择与代码编辑器中此项跨度对应的文本。
  • 在代码编辑器中单击或选择文本。 在前面的 Visual Basic 示例中,如果在代码编辑器中选择包含“Module Module1”的行,可视化工具会自动导航到树中的相应 ModuleStatement 节点。

可视化工具突出显示树中的项,其范围最符合编辑器中所选文本的跨度。

可视化工具刷新树以匹配活动代码文件中的修改。 在Main()中添加对Console.WriteLine()的调用。 键入时,可视化工具会刷新树。

键入 Console.后暂停键入。 树中有一些粉色的项。 此时,类型化代码中存在错误(也称为“诊断”。 这些错误会附加到语法树的节点、标记和琐碎内容中。 可视化工具会显示哪些项存在错误,并用粉色突出显示其背景。 可以检查任何粉红色项目上的错误,只需将鼠标悬停在该项目上。 可视化工具仅显示语法错误(与类型化代码的语法相关的错误):它不显示任何语义错误。

语法图

右键单击树中的任何项,然后单击 “查看定向语法图”。

  • C#
  • Visual Basic

可视化工具显示位于选定项的子树的图形表示形式。 对于与 C# 示例中的方法对应的 Main()MethodDeclaration 节点,请尝试这些步骤。 可视化工具显示如下所示的语法图:

查看 C# 语法图

语法图查看器具有一个选项,可以显示其配色方案的图例。 还可以将鼠标悬停在语法图中的单个项上,以查看与该项对应的属性。

可以重复查看树中不同项的语法图,图形将始终显示在 Visual Studio 中的同一窗口中。 可以将此窗口停靠在 Visual Studio 内的一个方便位置,以便无需在选项卡之间切换即可查看新的语法图。 通常放在底部(代码编辑器窗口的下面)会比较方便。

下面是可视化工具窗口以及语法关系图窗口所采用的停靠布局:

可视化器和语法图窗口的统一停靠布局

另一个选项是在双重监视器设置中将语法图形窗口放在第二个监视器上。

检查语义

语法可视化工具支持对符号和语义信息进行基本的检查。 在 C# 示例中键入 double x = 1 + 1; Main()。 然后,在代码编辑器窗口中选择表达式 1 + 1 。 可视化工具在图形界面中突出显示AddExpression节点。 右键单击此 AddExpression,然后单击“查看符号”(如果有)。 请注意,大多数菜单项都有“如果有”限定符。 语法可视化工具检查节点的属性,包括所有节点可能不存在的属性。

可视化工具中的属性网格会更新,如下图所示:该表达式的符号为 SynthesizedIntrinsicOperatorSymbol,其中 Kind = Method

语法可视化工具中的符号属性

右键单击同一 AddExpression 节点,然后选择 “查看 TypeSymbol”(如果有)。 可视化工具中的属性网格将更新,如下图所示,指示所选表达式的类型。Int32

TypeSymbol 属性

右击同一AddExpression节点,然后选择“查看转换后的 TypeSymbol(如果有)”。 属性网格会更新,指示虽然表达式的类型为 Int32,但表达式 Double 的转换类型如下图所示。 此节点包含转换后的类型符号信息,因为 Int32 表达式所在的上下文要求必须转换为 Double 型。 此转换满足了为赋值运算符左侧的变量 x 指定的类型为 Double 型的要求。

转换后的 TypeSymbol 属性

最后,右键单击同一 AddExpression 节点,然后选择 “查看常量值”(如果有)。 属性网格显示表达式的值是编译时常量,它的值是2

常量值

还可以在 Visual Basic 中复制前面的示例。 在 Visual Basic 文件中键入Dim x As Double = 1 + 1。 在代码编辑器窗口中选择表达式 1 + 1 。 可视化工具会在其中突出显示相应的 AddExpression 节点。 针对此 AddExpression 重复上述步骤,应看到相同的结果。

在 Visual Basic 中检查更多代码。 使用以下代码更新主 Visual Basic 文件:

Imports C = System.Console

Module Program
    Sub Main(args As String())
        C.WriteLine()
    End Sub
End Module

此代码在文件顶部引入了一个把类型 System.Console 映射为 C 的别名,并在 Main() 中使用此别名。 选择在 Main() 方法的 C.WriteLine() 中使用此别名 C。 可视化工具在可视化工具中选择相应的 IdentifierName 节点。 右键单击此节点,然后单击“查看符号”(如果有)。 属性网格指示此标识符绑定到类型 System.Console ,如下图所示:

语法可视化工具中符号 C 的属性

右键单击同一 IdentifierName 节点,然后选择 “查看 AliasSymbol”(如果有)。 属性网格指示标识符是一个别名,其名称 C 绑定到 System.Console 目标。 换句话说,属性网格提供有关对应于标识符CAliasSymbol 的信息。

AliasSymbol 属性

检查对应于任何声明的类型、方法、属性的符号。 在可视化工具中选择相应的节点,然后右键单击以访问视图符号(如果有)。 选择该方法 Sub Main(),包括方法的正文。 右键单击可视化工具中的相应 SubBlock 节点,然后选择“查看符号”(如果有)。 属性网格显示此SubBlockMethodSymbol的名称为Main,返回类型为Void

查看方法声明的符号

可以在 C# 中轻松复制上述 Visual Basic 示例。 键入 using C = System.Console; 代替 Imports C = System.Console 别名。 C# 中的上述步骤在可视化工具窗口中生成相同的结果。

语义检查操作仅在节点上可用。 不能用于标记和琐事。 并非所有节点都有要检查的有趣语义信息。 当节点没有有趣的语义信息时,右键单击并选择 视图 * 符号(如果有) 会显示空白属性网格。

您可以在 “语义工作” 概述文档中阅读有关用于执行语义分析的 API 的更多信息。

关闭语法可视化工具

如果不使用它来检查源代码,则可以关闭可视化工具窗口。 语法可视化工具在浏览代码、编辑和更改源时更新其显示。 当你不使用它时,它可能会让人分心。