VS Code での定義へ移動

ナビゲーション

SharpLsp は、C# と F# の両方で LSP のナビゲーション機能群を実装しています。C# のクエリには読み込まれたソリューション全体を対象に Roslyn を使用し、F# のクエリには読み込まれた F# プロジェクト全体を対象に FCS を使用します。

メソッド

LSP メソッド 結果
textDocument/definition シンボルのソース宣言
textDocument/typeDefinition シンボルの型の宣言
textDocument/declaration 基底宣言またはインターフェイス宣言が別に存在する場合は、その宣言
textDocument/implementation C# では具象実装またはオーバーライド。F# では現在、選択したシンボル自身の宣言
textDocument/references 読み込まれたソリューションまたはプロジェクト内でのシンボルの使用箇所
textDocument/documentHighlight 現在のドキュメント内での使用箇所

SharpLsp はナビゲーション用のキーバインドを提供しません。エディター標準の LSP キーバインドが適用されます。

名前の変更、コール階層、ワークスペースシンボルは、同じサイドカーのシンボル情報を基盤としますが、それぞれ独自の LSP メソッドを使用します。

ソースの範囲

  • C#: 定義、実装、参照、名前の変更には、MSBuildWorkspace によって読み込まれた Roslyn ソリューションを使用します。
  • F#: ナビゲーションと名前の変更には FCS のプロジェクトチェックを使用します。参照と名前の変更の範囲は、現在読み込まれている F# プロジェクト全体です。実装検索はまだ具体的な実装やオーバーライドを列挙せず、選択したシンボル自身の宣言を返します。
  • 未保存のファイル: クエリを実行する前に、現在のエディターバッファーが両方のサイドカーに送信されます。

複数プロジェクトにまたがる F# の状態と、言語間をまたぐ完全な階層エッジは、現在も実装が進められています。

メタデータをソースとして表示

シンボルが BCL または参照アセンブリに由来する場合、両方のサイドカーは共有の ICSharpCode.Decompiler 統合機能を使用して読み取り専用のソースファイルを生成し、該当する宣言へ移動できます。これにより、ソースドキュメントが読み込まれていない多くのフレームワークおよび NuGet シンボルに対応します。

失敗時の動作

指定位置からシンボルを解決できない場合、または必要なサイドカーを利用できない場合、ナビゲーションは位置情報を返しません。C# では tree-sitter によってコメントと文字列を事前検証できます。ホストに F# の tree-sitter 文法がないため、F# は現在 FCS に依存しています。