この記事では、.NET コンパイラ プラットフォーム ("Roslyn") SDK の一部として付属する構文ビジュアライザー ツールの概要について説明します。 構文ビジュアライザーは、構文ツリーの検査と探索に役立つツール ウィンドウです。 これは、分析するコードのモデルを理解するために不可欠なツールです。 また、.NET Compiler Platform ("Roslyn") SDK を使用して独自のアプリケーションを開発する場合のデバッグ支援でもあります。 最初のアナライザーを作成するときに、このツールを開きます。 ビジュアライザーは、API で使用されるモデルを理解するのに役立ちます。 SharpLab や LINQPad などのツールを使用して、コードを検査し、構文ツリーを理解することもできます。
インストール手順 - Visual Studio インストーラー
Visual Studio インストーラーで .NET コンパイラ プラットフォーム SDK を見つけるには、次の 2 つの方法があります。
Visual Studio インストーラー - ワークロード ビューを使用してインストールする
.NET Compiler Platform SDK は、Visual Studio 拡張機能開発ワークロードの一部として自動的に選択されません。 オプションコンポーネントとして選択する必要があります。
- Visual Studio インストーラーを実行する
- [変更] を選択します
- Visual Studio 拡張機能の開発ワークロードを確認します。
- 概要ツリーで Visual Studio 拡張機能開発 ノードを開きます。
- .NET コンパイラ プラットフォーム SDK のボックスがオンになっていることを確認します。
- [変更] を選択します。
必要に応じて、 DGML エディター でビジュアライザーにグラフを表示することもできます。
- 概要ツリーで [ 個々のコンポーネント ] ノードを開きます。
- DGML エディターのチェック ボックスをオンにします
Visual Studio インストーラーを使用したインストール - [個々のコンポーネント] タブ
- Visual Studio インストーラーを実行する
- [変更] を選択します
- [ 個々のコンポーネント ] タブを選択する
- .NET コンパイラ プラットフォーム SDK のチェック ボックスをオンにします。 上部の [ コンパイラ、ビルド ツール、およびランタイム ] セクションにあります。
- [変更] を選択します。
必要に応じて、 DGML エディター でビジュアライザーにグラフを表示することもできます。
- DGML エディターのチェック ボックスをオンにします。 [ コード ツール ] セクションに表示されます。
概要記事を読んで、.NET Compiler Platform SDK で使用される概念について理解します。 構文ツリー、ノード、トークン、トリビアの概要について説明します。
Syntax Visualizer
構文ビジュアライザーを使用すると、Visual Studio IDE 内の現在アクティブなエディター ウィンドウで、C# または Visual Basic コード ファイルの構文ツリーを検査できます。 ビジュアライザーを起動するには、 ビュー>その他の Windows>Syntax ビジュアライザーをクリックします。 右上隅にある クイック ローンチ ツールバーを使うこともできます。 「syntax」と入力すると、 構文ビジュアライザー を開くコマンドが表示されます。
このコマンドを実行すると、構文ビジュアライザーがフローティング ツール ウィンドウとして開きます。 次の図に示すように、コード エディター ウィンドウを開いていない場合、表示は空白になります。
左側など、Visual Studio 内の便利な場所にこのツール ウィンドウをドッキングします。 ビジュアライザーには、現在のコード ファイルに関する情報が表示されます。
ファイル>新しいプロジェクト コマンドを使用して新規プロジェクトを作成します。 Visual Basic または C# プロジェクトを作成できます。 Visual Studio でこのプロジェクトのメイン コード ファイルが開かれると、ビジュアライザーに構文ツリーが表示されます。 この Visual Studio インスタンスで既存の C# または Visual Basic ファイルを開くと、そのファイルの構文ツリーがビジュアライザーに表示されます。 Visual Studio 内で複数のコード ファイルを開いている場合、ビジュアライザーは現在アクティブなコード ファイル (キーボード フォーカスを持つコード ファイル) の構文ツリーを表示します。
前の図に示すように、ビジュアライザー ツール ウィンドウの上部に構文ツリーが表示され、下部にプロパティ グリッドが表示されます。 プロパティ グリッドには、ツリーで現在選択されている項目のプロパティが表示されます。これには、.NET 型 や項目の 種類 (SyntaxKind) が含まれます。
構文ツリーは、ノード、トークン、トリビアの 3 種類の項目で構成されます。 これらの型の詳細については、 構文の操作 に関する記事を参照してください。 各種類の項目は、異なる色を使用して表されます。 使用されている色の概要については、[凡例] ボタンをクリックします。
ツリー内の各項目には、独自の スパンも表示されます。 スパンは、テキスト ファイル内のそのノードのインデックス (開始位置と終了位置) です。 前の C# の例では、選択した "UsingKeyword [0..5)" トークンの スパン は 5 文字幅 [0..5) です。 "[..)" 表記は、開始インデックスがスパンの一部であることを意味しますが、終了インデックスは含まれません。
ツリー内を移動するには、次の 2 つの方法があります。
- ツリー内の項目を展開またはクリックします。 ビジュアライザーは、コード エディターでこの項目のスパンに対応するテキストを自動的に選択します。
- コード エディターでテキストをクリックまたは選択します。 前の Visual Basic の例では、コード エディターで "Module Module1" を含む行を選択すると、ビジュアライザーはツリー内の対応する ModuleStatement ノードに自動的に移動します。
ビジュアライザーは、エディターで選択したテキストのスパンに最も一致するスパンを持つツリー内の項目を強調表示します。
ビジュアライザーは、アクティブなコード ファイルの変更に合わせてツリーを更新します。
Console.WriteLine()内のMain()への呼び出しを追加します。 入力すると、ビジュアライザーによってツリーが更新されます。
Console.を入力したら、入力を一時停止します。 ツリーには、ピンク色の項目がいくつかあります。 この時点で、入力されたコードにエラー (これを「診断」とも呼びます) があります。 これらのエラーは、構文ツリー内のノード、トークン、トリビアにアタッチされます。 ビジュアライザーには、背景がピンク色で強調表示されているエラーが添付されている項目が表示されます。 項目の上にマウス ポインターを置くと、ピンク色の項目のエラーを調べることができます。 ビジュアライザーには構文エラー (型指定されたコードの構文に関連するエラー) のみが表示されます。セマンティック エラーは表示されません。
構文グラフ
ツリー内の任意の項目を右クリックし、[ 方向付き構文グラフの表示] をクリックします。
ビジュアライザーは、選択した項目をルートにしたサブツリーのグラフィカルな表現を表示します。 C# の例の メソッドに対応する Main() ノードに対して、次の手順を試してください。 ビジュアライザーには、次のような構文グラフが表示されます。
構文グラフ ビューアーには、色分けスキームの凡例を表示するオプションがあります。 また、構文グラフ内の個々の項目をマウスでポイントして、その項目に対応するプロパティを表示することもできます。
ツリー内のさまざまな項目の構文グラフを繰り返し表示でき、グラフは常に Visual Studio 内の同じウィンドウに表示されます。 新しい構文グラフを表示するためにタブを切り替える必要がないように、Visual Studio 内の便利な場所にこのウィンドウをドッキングできます。 下のコード エディター ウィンドウは、多くの場合便利です。
ビジュアライザー ツール ウィンドウと構文グラフ ウィンドウで使用するドッキング レイアウトを次に示します。
もう 1 つのオプションは、デュアル モニターのセットアップで、2 台目のモニターに構文グラフ ウィンドウを配置することです。
セマンティクスの検査
構文ビジュアライザーを使用すると、シンボルとセマンティック情報の基本的な検査が可能になります。 C# の例で Main() 内に double x = 1 + 1; を入力します。 次に、コード エディター ウィンドウで式 1 + 1 を選択します。 ビジュアライザーは、ビジュアライザーの AddExpression ノードを強調表示します。 この AddExpression を右クリックし、[ シンボルの表示] (存在する場合) をクリックします。 ほとんどのメニュー項目には "if any" 修飾子があることに注意してください。 構文ビジュアライザーは、ノードのプロパティ (すべてのノードに存在しない可能性があるプロパティを含む) を検査します。
ビジュアライザーのプロパティ グリッドは、次の図に示すように更新されます。式のシンボルは、Kind = メソッドを持つ SynthesizedIntrinsicOperatorSymbol です。
同じ AddExpression ノードを右クリックし、 TypeSymbol の表示 (存在する場合) を選択します。 ビジュアライザーのプロパティ グリッドは、次の図に示すように更新され、選択した式の型が Int32されていることを示します。
同じ AddExpression ノードを右クリックし、 変換された TypeSymbol を表示 (存在する場合) を選択します。 プロパティ グリッドが更新され、式の元の型はInt32であるが、次の図に示すように変換された式の型はDoubleです。
Int32式はDoubleに変換する必要があるコンテキストで発生するため、このノードには変換された型シンボル情報が含まれます。 この変換は、代入演算子の左側にある変数Doubleに指定されたx型を満たします。
最後に、同じ 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
このコードでは、ファイルの先頭にある型Cにマップされ、System.Console内でこのエイリアスを使用する、Main()という名前のエイリアスが導入されています。
C メソッド内で、このエイリアス (C.WriteLine() のMain()) の使用を選択します。 ビジュアライザーは、ビジュアライザー内の対応する IdentifierName ノードを選択します。 このノードを右クリックし、[ シンボルの表示](存在する場合)をクリックします。 プロパティ グリッドは、次の図に示すように、この識別子が System.Console 型にバインドされていることを示します。
同じ IdentifierName ノードを右クリックし、 AliasSymbol の表示 (存在する場合) を選択します。 プロパティ グリッドは、識別子が、C ターゲットにバインドされている名前System.Consoleを持つエイリアスであることを示します。 つまり、プロパティ グリッドは、識別子に対応する C に関する情報を提供します。
宣言された型、メソッド、プロパティに対応するシンボルを調べます。 ビジュアライザーで対応するノードを選択し、右クリックして シンボルの表示 (存在する場合) にアクセスします。 メソッドの本体を含め、 Sub Main()メソッドを選択します。 ビジュアライザーで対応する SubBlock ノードを右クリックし、 シンボルの表示 (存在する場合) を選択します。 プロパティ グリッドには、このSubBlockのMethodSymbolの名前Mainと戻り値の型Voidが表示されます。
上記の Visual Basic の例は、C# で簡単にレプリケートできます。 エイリアスのusing C = System.Console;の代わりにImports C = System.Consoleを入力します。 C# の上記の手順では、ビジュアライザー ウィンドウに同じ結果が生成されます。
セマンティック検査操作は、ノードでのみ使用できます。 トークンやトリビアでは使用できません。 すべてのノードに、検査する興味深いセマンティック情報があるわけではありません。 ノードに興味深いセマンティック情報がない場合は、右クリックして [ 表示] * [シンボル ] (存在する場合) を選択すると、空白のプロパティ グリッドが表示されます。
セマンティック分析を実行するための API の詳細については、セマンティクスの 操作 の概要に関するドキュメントを参照してください。
構文ビジュアライザーを閉じる
ビジュアライザー ウィンドウを使用してソース コードを調べない場合は、ウィンドウを閉じることができます。 構文ビジュアライザーは、コード内を移動し、ソースを編集および変更するときに、その表示を更新します。 使用していないと気が散る可能性があります。
.NET