F# 言語サポート

F# は SharpLsp における 第一級市民 です。Rust LSP ホストは、F# のセマンティックリクエストを、F# Compiler Service(FCS)を基盤とする長時間稼働の .NET 10 サイドカーへルーティングします。SharpLsp には Fantomas 連携と独自の FCS ベースのアナライザーも含まれますが、以下ではホストによってルーティングされ、サポート対象として通知される機能だけを利用可能と記載しています。

Ionide を支えるエンジンである FsAutoComplete(FSAC)が、同等性の目標です。SharpLsp は現在、広範な機能が動作しますが、完全な FSAC 同等性を まだ宣言していません。

ナレーション、オリジナル音楽、字幕付き。VS Code で FsStorefront プロジェクトを使って収録:すべての答えは F# Compiler Service から届きます。早送りの部分は画面上に表示されます。 単独のページで見る

機能の対応状況

機能 状態 現在の動作
補完 一部対応 メンバーとスコープ内のシンボルは動作します。開かれていない名前空間からの候補と open の自動挿入は未対応です
ホバー 対応済み ライブバッファから取得した FCS シグネチャと XML ドキュメント
シグネチャヘルプ 対応済み オーバーロードとアクティブなパラメーターの選択
定義、型定義、宣言 対応済み ソースとメタデータへのナビゲーション
実装 一部対応 現在は選択したシンボル自身の宣言を返し、具体的な実装やオーバーライドは列挙しません
参照の検索 対応済み 読み込まれた F# プロジェクト内でプロジェクト全体を検索
ドキュメントハイライト 対応済み 現在の文書内の参照
名前の変更 対応済み Prepare と、プロジェクト全体にわたる複数文書の編集
ドキュメントシンボル/アウトライン 対応済み 入れ子構造を持つ FCS ナビゲーション項目
ワークスペースシンボル 対応済み F# 文書を FCS 経由で検索
コードアクション/クイックフィックス 対応済み 以下に挙げるコンパイラー駆動および生成アクション
コードレンズ 対応済み トップレベル定義の参照数
インレイヒント 対応済み 型、パラメーター名、パイプライン型のヒント
セマンティックトークン 対応済み Full、range、delta の各レスポンス
診断 対応済み FCS コンパイラー診断と SharpLsp アナライザー
呼び出し階層 対応済み 呼び出し元と呼び出し先
型階層 一部対応 サイドカーとホストのハンドラーは存在しますが、クライアント機能としての通知はまだ未対応です
フォーマット(Fantomas) 非公開 サイドカーには実装されていますが、ホストが意図的にサポート対象として通知せず、ルーティングもしていません
折りたたみ/選択範囲 対応済み Rust ホストは、両方の構文機能に F# の tree-sitter 文法を使用します
F# Interactive 対応済み コードの送信、FSI の起動、シグネチャ生成を行う VS Code コマンド
CPU とメモリのプロファイリング 対応済み .fs の行のヒートバー、名前で示されるクロージャーとパイプラインのステージ、組み立てた行に塗られるレコードと共用体

IntelliSense

補完

FCS の GetDeclarationListInfo が補完候補を提供します。. の後のメンバー補完と、すでにスコープ内にあるシンボルは現在動作します。SharpLsp は FSAC の外部自動補完エンティティインデックスをまだ備えていないため、開かれていない名前空間にあるすべてのシンボルを候補として提示したり、resolve 時に対応する open を追加したりすることはできません。

ホバーとシグネチャヘルプ

ホバーは F# のシグネチャとドキュメントを Markdown としてレンダリングします。シグネチャヘルプは FCS のメソッドグループ情報を使用し、オーバーロードとアクティブなパラメーターを表示します。didOpen と didChange のテキストが F# サイドカーへ同期されるため、どちらも未保存のエディター内容を対象に動作します。

インレイヒント

SharpLsp は次のヒントを提供します。

  • バインディングの推論型ヒント
  • 呼び出し箇所のパラメーター名ヒント
  • |> を通って流れる値のパイプライン型ヒント

VS Code の設定 sharplsp.inlayHints.typeInference、sharplsp.inlayHints.parameterNames、sharplsp.inlayHints.pipelineTypes は公開されていますが、製品版の拡張機能ではまだ適用されていません。そのため、設定値にかかわらず、生成されたすべての種類のヒントが表示される場合があります。

ナビゲーションと名前の変更

定義、型定義、宣言、参照、ハイライト、名前の変更は、FCS のシンボル情報を通じて解決されます。実装検索のハンドラーも存在しますが、現在は選択したシンボル自身の宣言を返すだけで、具体的な実装やオーバーライドまでは検索しません。参照と名前の変更は、読み込まれた F# プロジェクトを走査し、複数ファイルの編集を返すことができます。BCL または NuGet パッケージのメタデータシンボルでは、生成された読み取り専用の逆コンパイルソースを開くことができます。

言語をまたぐ階層エッジには、共有シンボルインデックスがまだ必要です。読み込んだ F# ソリューションには複数の .fsproj プロジェクトを含めることができ、プロジェクト参照はメモリ上のソースから検査されます。

VS Code では、ワークスペースにソリューションが一つだけある場合は自動的に開きます。複数の .sln または .slnx ファイルがある場合は選択を求め、選んだソリューションを F# と C# の両方のサイドカーに読み込みます。

コードアクションとクイックフィックス

F# サイドカーは現在、コンテキストが有効な場合に次のアクションを公開します。

トリガーまたはコンテキスト アクション
FS0039 未解決の名前 FCS が名前空間を提供した場合、名前を解決する open 宣言を追加
FS1182 未使用の値 バインディングの先頭に _ を追加
FS0020 無視された結果 `
FS0025 不完全なパターンマッチ ワイルドカードアームを追加
FS0026 冗長なケース 冗長なパターンを削除
FS0001 対応している型の不一致 既知の変換を挿入
判別共用体のパターンマッチ 不足しているユニオンケースを生成
レコード式 不足しているレコードフィールドを生成
インターフェイスの実装 メンバースタブを生成
SLSPF0102 未使用の open を削除
SLSPF0103 冗長な修飾名を簡略化

コンパイラーの入力ミス候補と、FSAC の「new を追加」修正はまだ実装されていません。

診断とアナライザー

FCS コンパイラー診断は SharpLsp のアナライザーと組み合わされます。

アナライザー コード スコープ
未使用のシンボル/デッドコード SLSPF0101 プロジェクト全体
未使用の open SLSPF0102 現在のファイル
冗長な修飾子 SLSPF0103 現在のファイル

[analyzers] dead_code = true でデッドコード解析が有効になります。monorepo = false の場合、到達不能な private/internal シンボルは警告となり、public シンボルは外部 API の可能性があるものとして扱われます。monorepo = true の場合、未使用の public シンボルも報告され、エラーへ引き上げられます。

FSharpLint は依存関係として存在しますが、まだ診断パイプラインに接続されていません。

フォーマット

SharpLsp は LSP フォーマットをサポート対象として通知しません。F# サイドカーには Fantomas の文書および範囲フォーマットコードが含まれますが、ホストは意図的にこれを隔離しています。ルーティングが有効になるまでは、専用の Fantomas 連携を使用してフォーマットしてください。

F# Interactive

VS Code 拡張機能は次の機能を提供します。

コマンド アクション
F# Interactive: Send Selection 現在の選択範囲を評価
F# Interactive: Load File アクティブなファイルを読み込む
F# Interactive: Start New Session ターミナルを使用するセッションを開始、またはフォーカス
F#: Generate Signature File (.fsi) .fsi シグネチャファイルを生成

FSI は、拡張機能のアクティベーション中に検出またはインストールされた .NET 10 SDK を使用します。追加引数は、信頼されたワークスペースでの VS Code 設定 sharplsp.fsi.extraArgs から取得します。sharplsp.toml からは読み取りません。

プロファイリング

SharpLsp のプロファイラーは実行中の任意の .NET プロセスにアタッチするので、F# のプログラムでも再起動なしで CPU プロファイリング、ヒープのスナップショット、リークの疑いが得られます。F# のコンパイル後のコードも読み解きます。クロージャーとパイプラインのステージはコンパイラーが付けた名前で示され、レコードと共用体ケースはそれを組み立てる行に塗られ、リークを保持するモジュール値はソースのとおりの名前で示されます。F# のプロファイリングを参照してください。

ナレーション、オリジナル音楽、字幕付き。VS Code で収録した FsStorefront デモでの F# の一連の流れ:Profile CPU と .fs の行のヒートマップ、Track Memory、組み立てた行に塗られるレコードと共用体ケース、モジュール値をルートとする保持グラフ、修正の入力、そして再実行。早送りの部分は画面上に表示されます。 単独のページで見る

エディター非依存プロトコル

SharpLsp は、補完、ホバー、ナビゲーション、シンボル、診断、コードレンズ、階層に標準 LSP メソッドを優先します。現在サポートされているクライアントは VS Code です。ほかのエディターとの連携は、まだ準備中です。

現在残っている同等性の差

F# で残っている主な差は次のとおりです。

  • 開かれていない名前空間からの補完と open の自動追加
  • ホスト経由の Fantomas フォーマット
  • FSharpLint 診断
  • .fsx の完全なセマンティック同等性と FSAC のドキュメントエンドポイント
  • 言語をまたぐ階層
  • 標準クライアントへの型階層機能の通知