# 機能設計書 49-Java

## 概要

本ドキュメントは、space-vimにおけるJava言語サポート機能の設計仕様を定義する。本機能はvim-javacomplete2プラグインを統合し、Javaファイル編集時のコード補完機能を提供する。

### 本機能の処理概要

本機能は、Javaファイル（.java）の編集時に、オムニ補完機能を提供する。vim-javacomplete2プラグインにより、クラス、メソッド、フィールドの補完候補を表示する。

**業務上の目的・背景**：Javaはエンタープライズアプリケーション、Androidアプリケーション開発で広く使用されているプログラミング言語である。Vim上でのJava開発を効率化し、IDEに近い補完機能を提供することで、開発生産性の向上を実現する。

**機能の利用シーン**：
- Javaソースファイルの作成・編集
- クラス・メソッド・フィールドの補完
- インポート文の自動追加

**主要な処理内容**：
1. Javaファイルタイプ検出時のプラグイン遅延読み込み
2. InsertEnter時のvim-javacomplete2読み込み
3. オムニ補完機能の提供

**関連システム・外部連携**：
- artur-shaik/vim-javacomplete2 プラグイン
- Java Development Kit (JDK)

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 8 | 補完ポップアップ | 参照画面 | Javaコードの補完候補表示 |

## 機能種別

言語サポート / コード補完

## 入力仕様

### 入力パラメータ

本機能には特別な設定パラメータはない。

### 入力データソース

- Javaソースファイル（.java）
- クラスパス上のライブラリ

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 補完候補 | List | クラス・メソッド・フィールドの補完候補 |

### 出力先

- 補完ポップアップウィンドウ

## 処理フロー

### 処理シーケンス

```
1. Javaファイルオープン
   └─ ファイルタイプ検出（java）

2. プラグイン登録（遅延読み込み）
   └─ vim-javacomplete2 { 'on': [] }

3. InsertEnter イベント発火
   └─ s:invoke_javacomplete() 呼び出し

4. ファイルタイプ確認
   └─ java の場合のみプラグイン読み込み

5. オムニ補完利用可能
   └─ Ctrl-X Ctrl-O で補完
```

### フローチャート

```mermaid
flowchart TD
    A[Javaファイルオープン] --> B[プラグイン登録（遅延）]
    B --> C[InsertEnterイベント待機]
    C --> D{ファイルタイプ = java?}
    D -->|Yes| E[vim-javacomplete2読み込み]
    D -->|No| F[何もしない]
    E --> G[オムニ補完有効]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-49-01 | 遅延読み込みルール | InsertEnterイベント発火時にプラグインを読み込み | 挿入モード開始時 |
| BR-49-02 | ファイルタイプ確認ルール | javaファイルタイプの場合のみプラグインを読み込み | InsertEnter時 |

### 計算ロジック

該当なし

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | JDK未インストール | Javaコンパイラが見つからない | JDKインストール案内 |
| - | クラスパス未設定 | 外部ライブラリが見つからない | クラスパス設定案内 |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- InsertEnter時の遅延読み込みにより起動時間を最適化

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

- 外部ツール（JDK）はローカル環境のものを使用

## 備考

- vim-javacomplete2は古いプラグインであり、モダンな開発ではcoc.nvim + coc-java等の利用を推奨
- LSPベースの補完（Eclipse JDT Language Server等）との併用も可能

---

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

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

### 推奨読解順序

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

vim-javacomplete2プラグインの登録方法を把握する。

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

**読解のコツ**: `{ 'on': [] }` は遅延読み込みを意味し、autocmdで明示的にロードする。

**主要処理フロー**:
1. **1行目**: vim-javacomplete2 登録（遅延読み込み）
2. **3-8行目**: `s:invoke_javacomplete()` 関数定義
3. **5-7行目**: javaファイルタイプの場合のみ plug#load 呼び出し
4. **10-13行目**: InsertEnter autocmd でロード関数を呼び出し

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

config.vimは空のため、設定は packages.vim のautocmdで完結。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.vim | `layers/+lang/java/config.vim` | 追加設定（空ファイル） |

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

```
Javaファイルオープン
    │
    ├─ layers/+lang/java/packages.vim
    │      └─ vim-javacomplete2 登録 { 'on': [] }
    │
    └─ InsertEnter イベント発火
           └─ s:invoke_javacomplete()
                  ├─ ファイルタイプ確認
                  └─ plug#load('vim-javacomplete2')
```

### データフロー図

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

Javaソースコード ───▶ InsertEnter ──────────────▶ プラグイン読み込み
     │                      │
     └─────────────────▶ Ctrl-X Ctrl-O ────────▶ 補完候補表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+lang/java/packages.vim` | 設定 | プラグイン登録・遅延読み込みロジック |
| config.vim | `layers/+lang/java/config.vim` | 設定 | 追加設定（空ファイル） |
