VS Code でのホバー

Alpha 版 VS Code 拡張機能での C# ホバー情報。

ホバーとクイック情報

C# シンボルにマウスを重ねると、Roslyn サイドカーから型シグネチャとドキュメントが表示されます。F# ホバーは SharpLsp の方向性に含まれますが、現在のサイトのスクリーンショットは VS Code 拡張機能の alpha 状態を反映しています。

表示される内容

シンボルにホバーすると、SharpLsp は Markdown レンダリングされたツールチップを返します。

セクション 内容
シグネチャ 構文ハイライト付きの完全修飾シンボルシグネチャ
含まれる型 メンバーの ContainingType.Name
XML ドキュメント <summary><param><returns><remarks><example>
例外 XML ドキュメントの <exception> タグ
nullable nullable 注釈状態
アクセス修飾子 publicinternalprotected など
非推奨 警告付きの [Obsolete] メッセージ

C# ホバー(Roslyn)

C# サイドカーは SemanticModel.GetSymbolInfo() でシンボルを解決し、次の優先順位で XML ドキュメントをレンダリングします。

  1. ソースコードの /// コメント
  2. NuGet パッケージの XML ドキュメントファイル(アセンブリ横の .xml
  3. Roslyn の組み込みドキュメントプロバイダー

特殊ケース

ホバー対象 動作
var キーワード 推論された型を完全なシグネチャで表示
await unwrap された Task<T> 戻り値型を表示
nameof(Foo) 参照先シンボルを表示
文字列リテラル null を返す(ツールチップなし)
ラムダパラメーター 推論されたパラメーター型を表示
タプル要素 要素名と型を表示
パターン変数 パターンマッチされた型を表示
[Obsolete] メンバー 非推奨メッセージを表示

var result = Enumerable.Range(0, 10).Select(x => x * x).ToList();
//           ↑ ホバー表示:
// IEnumerable<int> Enumerable.Range(int start, int count)
// 指定された範囲内の整数シーケンスを生成します。
// Parameters:
//   start: シーケンス内の最初の整数の値。
//   count: 生成する連続した整数の数。

F# ホバー

F# ホバーは SharpLsp のロードマップとサイドカーアーキテクチャに含まれます。現在のサイトでは beta-ready な機能として扱っていません。

ソリューションエクスプローラーのホバー

ソリューションエクスプローラーのツリービューは、コードエディターと同じホバーパイプラインを使います。ツリー内のシンボルにホバーすると、コードエディターに表示されるものと同じツールチップが表示されます。

ツリーノード種別 ツールチップのソース
シンボル(クラス、メソッド、プロパティなど) LSP hover — コードエディターと同じ
名前空間 LSP hover — コードエディターと同じ
NuGet パッケージ パッケージ名 + バージョン
プロジェクト参照 参照名

キャッシュ

ホバー結果は Rust ホストにより salsa のインクリメンタル計算でキャッシュされます。

キャッシュキー 無効化されるタイミング
(document_uri, document_version, position) 文書が編集されたとき

キャッシュヒットは 1ms 未満で返ります。古い文書バージョンに対するホバーリクエストは即座にキャンセルされます。

パフォーマンス目標

指標 目標
ホバーレイテンシ(p50) <150ms
ホバーレイテンシ(p95) <300ms
キャッシュ済み位置 <1ms
tree-sitter 事前検証(空白をスキップ) <1ms

エラー処理

ホバーはエラーを返したり、エディターをブロックしたりしません。サイドカー未準備、シンボル解決失敗、IPC タイムアウトなど、どの失敗でも SharpLsp は null(ツールチップなし)を返します。サイドカーのクラッシュ時は 3 秒以内に自動復旧を開始します。