# 機能設計書 54-Scala

## 概要

本ドキュメントは、space-vimにおけるScala言語サポート機能の設計を定義する。vim-scalaプラグインを利用したScalaファイルの構文ハイライトとScaladocインデント設定を提供する。

### 本機能の処理概要

Scala言語でのVim開発体験を向上させるため、構文ハイライトの拡張とScaladocコメントのインデント最適化を提供する機能である。

**業務上の目的・背景**：ScalaはJVM上で動作するオブジェクト指向と関数型プログラミングを融合した言語であり、Apache Spark、Akka、Play Frameworkなどの大規模分散システム開発で広く利用されている。型推論、パターンマッチング、トレイトなどの独自構文を持つため、専用のプラグインによる構文ハイライト強化が重要である。

**機能の利用シーン**：Scalaプロジェクト（sbt、Mill等）の開発時、`.scala`、`.sbt`ファイルを編集する際に自動的に有効化される。Scaladocコメント記述時にはインデントが自動調整され、整形されたドキュメンテーションが容易になる。

**主要な処理内容**：
1. Scala構文のシンタックスハイライト
2. Scaladocコメントのインデント最適化
3. ファイルタイプ自動検出（.scala, .sbt）
4. インデント処理の最適化

**関連システム・外部連携**：vim-scalaプラグインと連携。Metals（Scala Language Server）やcoc.nvimと組み合わせることでより高度なLSP機能が利用可能。

**権限による制御**：特になし。レイヤー有効化によりすべての機能が利用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | Vimエディタ画面 | 主画面 | Scalaファイル編集時の構文ハイライト表示 |

## 機能種別

構文解析 / 構文ハイライト / 言語サポート

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:scala_scaladoc_indent | Number | No | Scaladocインデントの有効化 | 0または1 |

### 入力データソース

- Scalaソースファイル（.scala, .sbt）のバッファ内容
- Vim設定変数（g:scala_*）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 構文ハイライト | 視覚表示 | Scala固有キーワードのカラー表示 |
| インデント | 整形 | Scaladocコメントの自動インデント |

### 出力先

- Vimエディタ画面（バッファ表示）

## 処理フロー

### 処理シーケンス

```
1. レイヤー読み込み
   └─ +lang/scalaレイヤーが有効化される
2. プラグイン読み込み
   └─ vim-scalaプラグインがvim-plugにより読み込まれる（遅延読み込み）
3. 設定適用
   └─ config.vimの設定変数が適用される
4. ファイル検出
   └─ .scalaファイルオープン時にfiletypeがscalaに設定される
5. 構文ハイライト適用
   └─ vim-scalaの構文定義に基づきハイライトが適用される
```

### フローチャート

```mermaid
flowchart TD
    A[Vim起動] --> B{scalaレイヤー有効?}
    B -->|Yes| C[vim-scalaプラグイン登録]
    B -->|No| Z[終了]
    C --> D[設定変数適用]
    D --> E{.scalaファイルを開く?}
    E -->|Yes| F[filetype=scala設定]
    E -->|No| G[待機]
    G --> E
    F --> H[vim-scala読み込み]
    H --> I[構文ハイライト適用]
    I --> J[Scaladocインデント有効化]
    J --> K[編集可能状態]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-54-01 | レイヤー依存 | +lang/scalaレイヤーの有効化が必要 | .spacevimファイルでレイヤー指定時 |
| BR-54-02 | ファイルタイプ検出 | .scala, .sbtファイルで自動有効化 | ファイルオープン時 |
| BR-54-03 | 遅延読み込み | scalaファイルタイプでのみプラグインロード | for: 'scala'指定 |
| BR-54-04 | Scaladocインデント | g:scala_scaladoc_indent=1でインデント有効 | デフォルト有効 |

### 計算ロジック

特になし（構文ハイライトとインデントのみの機能）

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

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

該当なし（データベース操作を行わない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | プラグイン未インストール | vim-plugによるインストール未完了 | :PlugInstall実行 |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- 大規模Scalaファイル（数千行）でも構文ハイライトが遅延なく適用されること
- ファイルオープン時のレイテンシ：100ms以下

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

- 外部通信なし
- ローカルファイルの読み取りのみ

## 備考

- Metals LSPとcoc.nvimを併用することで、定義ジャンプ、リファレンス検索、自動補完などの高度な機能が利用可能
- build.sbtファイルはsbtファイルタイプとして認識される

---

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

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

### 推奨読解順序

#### Step 1: データ構造を理解する

Scalaレイヤーは設定変数とプラグイン登録で構成される。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.vim | `layers/+lang/scala/config.vim` | Scaladocインデント設定の確認 |

**読解のコツ**: コメント`" vim-scala {`は設定ブロックの開始を示す。Vim scriptのコメントは`"`で始まる。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | packages.vim | `layers/+lang/scala/packages.vim` | MPマクロによるプラグイン登録を確認 |

**主要処理フロー**:
1. **1行目**: `MP 'derekwyatt/vim-scala', { 'for': 'scala' }` - vim-scalaプラグインを遅延読み込み登録

#### Step 3: 設定ファイルを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.vim | `layers/+lang/scala/config.vim` | Scaladocインデント設定 |

**主要処理フロー**:
- **2行目**: `let g:scala_scaladoc_indent = 1` - Scaladocコメントのインデントを有効化

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

```
.spacevim (ユーザー設定)
    │
    └─ Layer '+lang/scala' 有効化
           │
           ├─ packages.vim
           │      └─ MP 'derekwyatt/vim-scala' (遅延読み込み登録)
           │
           └─ config.vim
                  └─ g:scala_scaladoc_indent = 1 (インデント設定)
```

### データフロー図

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

.spacevim ───▶ レイヤーシステム ───▶ プラグイン登録
                     │
                     ▼
              config.vim読み込み
                     │
                     ▼
.scalaファイル ───▶ vim-scala ───▶ 構文ハイライト表示
                     │
                     ▼
Scaladocコメント ───▶ インデント処理 ───▶ 整形されたコメント
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+lang/scala/packages.vim` | 設定 | vim-scalaプラグインの登録 |
| config.vim | `layers/+lang/scala/config.vim` | 設定 | Scaladocインデント設定 |
| LAYERS.md | `layers/LAYERS.md` | ドキュメント | レイヤー一覧とプラグイン情報 |
