# 機能設計書 2-初期化完了 (initialized)

## 概要

本ドキュメントは、lua-language-serverにおけるLSP初期化完了通知の処理を記載したものである。`initialize`リクエスト後にクライアントから送信される`initialized`通知を受信し、設定ファイルの読み込みやワークスペースの準備を完了する。

### 本機能の処理概要

**業務上の目的・背景**：LSPプロトコルでは、`initialize`リクエストとレスポンスの交換後、クライアントは`initialized`通知を送信してサーバーに準備完了を伝える。この通知を受けてサーバーは、設定ファイルの読み込み、動的機能登録、ワークスペースのスキャンなど、実際の言語サービス提供に必要な初期化処理を開始する。

**機能の利用シーン**：エディタがLSPサーバーとの接続を確立した直後に自動的に呼び出される。ユーザーが明示的に操作することはなく、バックグラウンドで実行される。

**主要な処理内容**：
1. 進捗表示の開始（初期化中の表示）
2. 設定ファイル（.luarc.json、.luarc.jsonc）の読み込み
3. クライアント設定の取得（workspace/configuration）
4. 動的機能登録（workspace/didChangeConfiguration等）の登録
5. クライアントReady状態への移行
6. ワークスペースの初期化（ファイルスキャン等）

**関連システム・外部連携**：LSPクライアント、設定ファイルシステム、ファイル監視システム

**権限による制御**：特になし

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 本機能は直接的な画面表示を持たない |

## 機能種別

通知処理 / 初期化完了

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| luarcParentUri | string | No | .luarc.doc.jsonファイルが存在するフォルダのURI | 有効なURI形式 |

### 入力データソース

LSPクライアントからのJSON-RPC通知

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| (戻り値) | boolean | 処理成功時はtrue |

### 出力先

LSPクライアントへの通知レスポンス（オプション）

## 処理フロー

### 処理シーケンス

```
1. initialized通知の受信
   └─ JSON-RPCでクライアントから通知を受信

2. 進捗表示の開始
   └─ progress.createで"Initializing..."を表示

3. 設定ファイルの読み込み
   └─ m.updateConfig(params.luarcParentUri)を実行
   └─ .luarc.json、.luarc.jsonc、クライアント設定を読み込み

4. 動的機能登録
   └─ workspace/didChangeConfigurationの動的登録をリクエスト
   └─ client/registerCapabilityを送信

5. クライアントReady状態への移行
   └─ client.setReady()を実行

6. ワークスペースの初期化
   └─ workspace.init()を実行
   └─ ファイルスキャン、ライブラリ読み込み等
```

### フローチャート

```mermaid
flowchart TD
    A[initialized通知受信] --> B[進捗表示開始]
    B --> C[updateConfig実行]
    C --> D{動的登録サポート?}
    D -->|Yes| E[client/registerCapability送信]
    D -->|No| F[client.setReady実行]
    E --> F
    F --> G[workspace.init実行]
    G --> H[trueを返却]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | 設定ファイル優先順位 | 指定CONFIGPATH > .luarc.json > .luarc.jsonc > クライアント設定 | 設定読み込み時 |
| BR-002 | 動的登録条件 | didChangeConfiguration.dynamicRegistrationがtrueの場合のみ動的登録 | 機能登録時 |
| BR-003 | 進捗表示 | 0.5秒以上かかる場合のみ進捗表示 | 処理中 |

### 計算ロジック

特になし

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

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

本機能はデータベースを使用しない（インメモリ処理のみ）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 設定ファイル読み込みエラー | .luarc.jsonの構文エラー | エラーログ出力、デフォルト設定で継続 |
| - | 設定取得エラー | workspace/configurationの失敗 | エラーログ出力、デフォルト設定で継続 |

### リトライ仕様

設定読み込みエラー時は、デフォルト設定で処理を継続

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

トランザクション管理なし

## パフォーマンス要件

初期化完了処理は、ワークスペースサイズに応じて時間がかかる場合があるが、進捗表示でユーザーに通知

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

- 設定ファイルはワークスペース内のみから読み込み
- 設定値のバリデーションを実施

## 備考

- この通知は`initialize`レスポンス後に1回のみ送信される
- 非同期処理（async）として実装されている

---

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

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

### 推奨読解順序

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

設定ファイルの構造とスコープの概念を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | scope.lua | `script/workspace/scope.lua` | ワークスペーススコープの管理 |
| 1-2 | config/init.lua | `script/config/init.lua` | 設定値の管理構造 |

**読解のコツ**: スコープには`folders`（ワークスペースフォルダ）、`fallback`（デフォルト）、`override`（上書き）の3種類がある。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | provider.lua | `script/provider/provider.lua` | `m.register 'initialized'`でハンドラを登録 |

**主要処理フロー**:
1. **140-165行目**: `initialized`ハンドラの定義
2. **143行目**: 進捗表示の開始（0.5秒遅延）
3. **145行目**: `m.updateConfig(params.luarcParentUri)`で設定読み込み
4. **148-160行目**: 動的機能登録のリクエスト
5. **161行目**: `client.setReady()`でReady状態に移行
6. **162行目**: `workspace.init()`でワークスペース初期化

#### Step 3: 設定読み込み処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | provider.lua | `script/provider/provider.lua` | `m.updateConfig()`関数 |
| 3-2 | loader.lua | `script/config/loader.lua` | 設定ファイルのロード処理 |

**主要処理フロー**:
- **32-69行目**: `m.updateConfig(uri)`関数
- **34-41行目**: 指定CONFIGPATHからの設定読み込み
- **43-61行目**: 各ワークスペースフォルダの設定読み込み
- **53-58行目**: .luarc.json/.luarc.jsoncの読み込み

#### Step 4: ワークスペース初期化を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | workspace.lua | `script/workspace/workspace.lua` | ワークスペース初期化処理 |

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

```
m.register 'initialized' (provider.lua:140-165)
    |
    +-- progress.create() (progress.lua)
    |       └─ 進捗表示の作成
    |
    +-- m.updateConfig(uri) (provider.lua:32-69)
    |       +-- cfgLoader.loadLocalConfig() - 指定設定ファイル読み込み
    |       +-- cfgLoader.loadClientConfig() - クライアント設定取得
    |       +-- cfgLoader.loadRCConfig() - .luarc.json読み込み
    |       +-- config.update() - 設定の適用
    |
    +-- proto.awaitRequest('client/registerCapability')
    |       └─ 動的機能登録
    |
    +-- client.setReady() (client.lua:638-641)
    |       └─ Ready状態への移行
    |
    +-- workspace.init() (workspace.lua)
            +-- ファイルスキャン
            +-- ライブラリ読み込み
```

### データフロー図

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

InitializedParams ──────> provider.lua                      true
  - luarcParentUri         m.register 'initialized'
                           |
設定ファイル ────────────>+-- m.updateConfig()
  - .luarc.json            |     +-- loadLocalConfig()
  - .luarc.jsonc           |     +-- loadClientConfig()
  - クライアント設定        |     +-- loadRCConfig()
                           |
                           +-- proto.awaitRequest()
                           |     (動的機能登録)
                           |
                           +-- client.setReady()
                           |     (Ready状態移行)
                           |
                           +-- workspace.init()
                                 (ワークスペース初期化)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| provider.lua | `script/provider/provider.lua` | ソース | LSP通知ハンドラの登録・実行 |
| loader.lua | `script/config/loader.lua` | ソース | 設定ファイルのロード処理 |
| config/init.lua | `script/config/init.lua` | ソース | 設定値の管理 |
| workspace.lua | `script/workspace/workspace.lua` | ソース | ワークスペース管理 |
| scope.lua | `script/workspace/scope.lua` | ソース | スコープ管理 |
| client.lua | `script/client.lua` | ソース | クライアント状態管理 |
| progress.lua | `script/progress.lua` | ソース | 進捗表示管理 |
| proto.lua | `script/proto/proto.lua` | ソース | LSPプロトコル通信処理 |
