# 機能設計書 48-C#

## 概要

本ドキュメントは、space-vimにおけるC#言語サポート機能の設計仕様を定義する。本機能はOmniSharp-vimおよび関連プラグインを統合し、C#ファイル編集時のコード補完、リファクタリング、ビルド、テスト、デバッグ等の包括的な開発支援機能を提供する。

### 本機能の処理概要

本機能は、C#ファイル（.cs）の編集時に、IDE相当の開発支援機能を提供する。OmniSharp-Roslynサーバーと連携し、IntelliSense、コードアクション、定義ジャンプ、リファレンス検索等の高度な機能を実現する。

**業務上の目的・背景**：C#はMicrosoftが開発した汎用プログラミング言語であり、.NETフレームワーク、Unity、Webアプリケーション開発で広く使用されている。Vim上でのC#開発を効率化し、Visual Studio相当のIntelliSense機能を提供することで、開発生産性の向上を実現する。

**機能の利用シーン**：
- C#ソースファイルの作成・編集
- IntelliSenseによるコード補完
- コードアクション（リファクタリング、クイックフィックス）
- 定義ジャンプ・リファレンス検索
- プロジェクトビルド・テスト実行・デバッグ
- vim-which-key連携によるキーバインド表示

**主要な処理内容**：
1. C#ファイルタイプ検出時のOmniSharpプラグイン読み込み
2. OmniSharp-Roslynサーバーへの接続
3. vim-which-key連携によるC#固有キーマッピング
4. vim-clap/fzf連携によるシンボル検索
5. Vista連携によるシンボルアウトライン表示
6. vimspector連携によるデバッグ機能

**関連システム・外部連携**：
- OmniSharp/omnisharp-vim プラグイン
- nickspoons/vim-sharpenup プラグイン
- nickspoons/vim-cs プラグイン
- OmniSharp-Roslyn サーバー
- .NET SDK

**権限による制御**：特になし（全ユーザー共通機能）

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 2 | Which-Key（キーバインド表示画面） | 参照画面 | OmniSharp固有キーマッピングの表示 |
| 7 | Vista（シンボルアウトライン） | 参照画面 | ctagsベースのシンボル一覧表示 |
| 8 | 補完ポップアップ | 参照画面 | IntelliSenseによるコード補完 |
| 9 | LSP診断画面 | 参照画面 | コンパイルエラー・警告の表示 |

## 機能種別

言語サポート / コード補完 / リファクタリング / ビルド / テスト / デバッグ

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:OmniSharp_popup_position | String | No | ポップアップ位置 | 'peek'/'center' |
| g:OmniSharp_popup_options | Dict | No | ポップアップオプション | ディクショナリ |
| g:OmniSharp_popup_mappings | Dict | No | ポップアップキーマッピング | ディクショナリ |
| g:OmniSharp_highlight_groups | Dict | No | ハイライトグループ設定 | ディクショナリ |
| g:OmniSharp_selector_findusages | String | No | 使用箇所検索セレクター | 'clap'等 |
| g:OmniSharp_autoselect_existing_sln | Number | No | 既存slnの自動選択 | 0または1 |
| g:OmniSharp_highlighting | Number | No | セマンティックハイライト | 0-3 |
| g:OmniSharp_diagnostic_exclude_paths | List | No | 診断除外パス | パス文字列のリスト |
| g:OmniSharp_code_format | Bool | No | 保存時自動フォーマット | v:true/v:false |

### 入力データソース

- C#ソースファイル（.cs）
- .slnファイル（ソリューション）
- .csprojファイル（プロジェクト）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 補完候補 | List | IntelliSenseによる補完候補 |
| 診断結果 | List | コンパイルエラー・警告の一覧 |
| コードアクション | List | 利用可能なリファクタリング・フィックス |
| シンボル情報 | List | 定義・参照箇所の一覧 |
| ビルド結果 | String | ビルド成否とエラー情報 |
| テスト結果 | String | テスト実行結果 |

### 出力先

- 補完ポップアップウィンドウ
- サインカラム（エラー・警告表示）
- Quickfix/Location List
- ポップアップウィンドウ（ホバー情報、シグネチャヘルプ）

## 処理フロー

### 処理シーケンス

```
1. C#ファイルオープン
   └─ ファイルタイプ検出（cs）

2. OmniSharpプラグイン読み込み
   └─ omnisharp-vim, vim-sharpenup, vim-cs

3. OmniSharp-Roslynサーバー起動/接続
   └─ プロジェクト情報のキャッシュ

4. vim-which-key連携設定
   └─ SPC l にOmniSharpキーマップ登録

5. Vista連携設定
   └─ g:vista_executive_for['cs'] = 'ctags'

6. 開発機能利用可能
   └─ 補完、ナビゲーション、ビルド、テスト、デバッグ
```

### フローチャート

```mermaid
flowchart TD
    A[C#ファイルオープン] --> B[OmniSharpプラグイン読み込み]
    B --> C[OmniSharp-Roslyn接続]
    C --> D{サーバー起動成功?}
    D -->|Yes| E[プロジェクト情報キャッシュ]
    D -->|No| F[エラー表示]
    E --> G[vim-which-key連携]
    G --> H[Vista連携]
    H --> I[開発機能有効]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-48-01 | ファイルタイプ読み込み | csファイルタイプでプラグインを読み込み | ファイルオープン時 |
| BR-48-02 | ポップアップ位置ルール | 画面幅80以上で'peek'、それ以外で'center' | ポップアップ表示時 |
| BR-48-03 | 自動sln選択 | 複数slnがある場合は自動で既存のものを選択 | OmniSharp起動時 |
| BR-48-04 | 診断除外ルール | Temp, obj, .nugetディレクトリは診断対象外 | 診断実行時 |
| BR-48-05 | vim-which-key連携 | csファイルでのみOmniSharpキーマップを表示 | which-keyロード時 |

### 計算ロジック

該当なし

## データベース操作仕様

### 操作別データベース影響一覧

本機能はデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | OmniSharpサーバー起動失敗 | .NET SDK未インストール | .NET SDKインストール案内 |
| - | sln未検出 | ソリューションファイルがない | プロジェクト構成の確認 |

### リトライ仕様

OmniSharpサーバー接続失敗時は自動再接続を試みる。

## トランザクション仕様

該当なし

## パフォーマンス要件

- OmniSharp-Roslynによる非同期処理でエディタの応答性を維持
- プロジェクト情報はバッファごとにキャッシュ

## セキュリティ考慮事項

- OmniSharp-Roslynサーバーはローカル環境で動作
- 信頼できるプロジェクトのみでOmniSharpを使用

## 備考

- vim-sharpenup は OmniSharp のキーマッピングを強化
- g:OmniSharp_code_format = v:false がデフォルト（自動フォーマット無効）
- vimspector連携でデバッグ設定を自動生成可能

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: プラグイン登録を理解する

C#関連プラグインの登録方法を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.vim | `layers/+lang/csharp/packages.vim` | プラグイン登録 |

**主要処理フロー**:
1. **1行目**: omnisharp-vim 登録（csファイルタイプ）
2. **2行目**: vim-sharpenup 登録（キーマッピング強化）
3. **3行目**: vim-cs 登録（構文サポート）

#### Step 2: 設定を理解する

OmniSharp設定を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.vim | `layers/+lang/csharp/config.vim` | OmniSharp詳細設定 |

**主要処理フロー**:
- **1-73行目**: OmniSharp設定（omnisharp-vim）
- **2-17行目**: ポップアップ設定（位置、オプション、マッピング）
- **23-29行目**: ハイライトグループ設定
- **31-36行目**: セレクター・診断除外設定
- **39-48行目**: 自動フォーマット設定
- **50-65行目**: プロジェクト情報キャッシュ
- **67-73行目**: Vista連携設定
- **76-159行目**: vim-sharpenup設定
- **78-89行目**: キーマッピング設定
- **91-159行目**: vim-which-key連携（OmniSharpキーマップ）

### プログラム呼び出し階層図

```
C#ファイルオープン
    │
    ├─ layers/+lang/csharp/packages.vim
    │      ├─ omnisharp-vim 登録 { 'on_ft': 'cs' }
    │      ├─ vim-sharpenup 登録 { 'on_ft': 'cs' }
    │      └─ vim-cs 登録 { 'on_ft': 'cs' }
    │
    └─ layers/+lang/csharp/config.vim
           ├─ OmniSharp設定
           │      ├─ ポップアップ設定
           │      ├─ ハイライト設定
           │      ├─ セレクター設定
           │      └─ 自動フォーマット設定
           │
           ├─ vim-sharpenup設定
           │      └─ キーマッピング無効化（独自設定のため）
           │
           ├─ vim-which-key連携
           │      └─ s:whichkey_omnisharp_integration()
           │
           └─ Vista連携
                  └─ g:vista_executive_for['cs'] = 'ctags'
```

### データフロー図

```
[入力]                    [処理]                         [出力]

C#ソースコード ─────▶ OmniSharp-Roslyn ────────▶ IntelliSense補完
     │                      │
     ├─────────────────▶ コードアクション ─────▶ リファクタリング
     │                      │
     ├─────────────────▶ 診断 ─────────────────▶ エラー・警告表示
     │                      │
     └─────────────────▶ ビルド/テスト ────────▶ Quickfix表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+lang/csharp/packages.vim` | 設定 | プラグイン登録 |
| config.vim | `layers/+lang/csharp/config.vim` | 設定 | OmniSharp・sharpenup・which-key連携設定 |
