F# 言語サポート

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

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

機能の対応状況

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

IntelliSense

補完

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

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

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

インレイヒント

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

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

VS Code の設定 sharplsp.inlayHints.typeInferencesharplsp.inlayHints.parameterNamessharplsp.inlayHints.pipelineTypes は公開され、解析されますが、現在のプロバイダーはその値をまだ使用していません。これらの設定を変更しても、ヒントの表示は切り替わりません。

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

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

言語をまたぐ階層エッジと、複数プロジェクトにわたる F# ワークスペース状態は、まだ不完全です。

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

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

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

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

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