# 機能設計書 49-設定変更 (workspace/didChangeConfiguration)

## 概要

本ドキュメントは、Lua Language Serverにおける設定変更通知機能（workspace/didChangeConfiguration）の設計仕様を記述する。この機能は、クライアントからの設定変更通知を受け、サーバー内の設定を更新する。

### 本機能の処理概要

設定変更通知機能は、LSPクライアント（VSCode等）で設定が変更された際に通知を受け、サーバー内の設定を更新する。これにより、エディタの設定変更がリアルタイムでLanguage Serverの動作に反映される。

**業務上の目的・背景**：ユーザーはエディタの設定画面でLua Language Serverの動作を細かくカスタマイズできる（診断の有効/無効、型チェックのレベル、ワークスペースのライブラリパスなど）。設定を変更した際に、エディタを再起動することなく即座に反映されることが望ましい。この機能により、設定変更のライブリロードが実現される。

**機能の利用シーン**：
- VSCodeの設定画面でLua関連設定を変更した場合
- .luarc.jsonまたは.luarc.jsoncファイルを編集した場合
- ワークスペース固有の設定を変更した場合

**主要な処理内容**：
1. クライアントからdidChangeConfiguration通知を受信
2. CONFIGPATHが設定されている場合は何もしない（ファイル監視で対応）
3. m.updateConfig()を呼び出して設定を再読み込み

**関連システム・外部連携**：
- 設定ローダー（script/config/loader.lua）
- ファイル監視（script/filewatch.lua）
- LSPクライアントとのJSON-RPC通信

**権限による制御**：特に権限による制御は行われない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 31 | 設定変更 | 主機能 | Lua設定を変更するコマンド処理 |

## 機能種別

設定管理 / ワークスペース管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| settings | object | No | 変更された設定（通常は空） | - |

### 入力データソース

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

## 出力仕様

### 出力データ

本機能は通知（notification）であり、レスポンスを返さない。

### 出力先

- サーバー内部の設定状態の更新

## 処理フロー

### 処理シーケンス

```
1. 通知受信
   └─ workspace/didChangeConfigurationメッセージを受信

2. CONFIGPATH確認
   └─ CONFIGPATHが設定されていれば処理終了

3. 設定更新
   └─ m.updateConfig()呼び出し
```

### フローチャート

```mermaid
flowchart TD
    A[通知受信] --> B{CONFIGPATH設定あり?}
    B -->|Yes| C[処理終了]
    B -->|No| D[m.updateConfig]
    D --> E[設定再読み込み完了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-49-01 | CONFIGPATHスキップ | CONFIGPATHが設定されている場合は通知を無視 | CONFIGPATH!=nil |
| BR-49-02 | 動的登録 | 初期化時に動的登録（dynamicRegistration）を行う | クライアントが対応している場合 |

### 計算ロジック

該当なし。

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

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

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

## エラー処理

### エラーケース一覧

本機能は通知であり、エラー応答は返さない。

### リトライ仕様

該当なし（通知のため）。

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

該当なし（メモリ内処理のみ）

## パフォーマンス要件

- 設定更新は非同期で実行
- 必要に応じてワークスペースのリロードをトリガー

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

- 特になし

## 備考

- initializeでdynamicRegistrationが有効な場合、client/registerCapabilityで登録
- .luarc.json/.luarc.jsoncの監視はfilewatch.eventで行う（この機能とは別経路）

---

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

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

### 推奨読解順序

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

LSP通知ハンドラを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | provider.lua | `script/provider/provider.lua` | didChangeConfigurationの登録（181-188行目） |

**主要処理フロー**:
1. **181行目**: ハンドラ登録
2. **183-185行目**: CONFIGPATH確認とreturn
3. **186行目**: m.updateConfig()呼び出し

#### Step 2: 動的登録を理解する

initialized内での動的登録を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | provider.lua | `script/provider/provider.lua` | initialized内の登録処理（148-159行目） |

**主要処理フロー**:
- **148行目**: dynamicRegistrationチェック
- **150-153行目**: registrationsへの追加
- **156-159行目**: client/registerCapability呼び出し

#### Step 3: updateConfigを理解する

設定更新ロジックを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | provider.lua | `script/provider/provider.lua` | m.updateConfig関数（32-69行目） |

**主要処理フロー**:
- **33行目**: json.nullをnullSymbolとして追加
- **34-41行目**: 指定設定ファイルの読み込み
- **43-61行目**: 各フォルダの設定読み込み
- **63-68行目**: フォールバック設定の読み込み

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

```
provider.lua (m.register 'workspace/didChangeConfiguration')
    │
    ├─ CONFIGPATH確認
    │      └─ 設定されていれば早期return
    │
    └─ m.updateConfig()
           │
           ├─ config.addNullSymbol(json.null)
           │
           ├─ 指定設定ファイル (CONFIGPATH)
           │      └─ cfgLoader.loadLocalConfig()
           │
           ├─ 各フォルダの設定
           │      ├─ cfgLoader.loadClientConfig()
           │      └─ cfgLoader.loadRCConfig()
           │             ├─ .luarc.json
           │             └─ .luarc.jsonc
           │
           └─ config.update(scope, ...)
```

### データフロー図

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

LSP通知                   provider.lua
  └─ settings     ───▶    │
  (通常空)                 ├─ CONFIGPATH確認
                          │
                          ▼
                    m.updateConfig()
                          │
                    ┌─────┴─────┐
                    ▼           ▼
            指定ファイル    フォルダ設定
                    │           │
                    └─────┬─────┘
                          ▼
                    config.update()
                          │
                          ▼
                    設定状態更新 ────────▶ サーバー内部設定
                          │
                          ▼
                    ワークスペースリロード（必要時）
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| provider.lua | `script/provider/provider.lua` | ソース | LSP通知ハンドラの登録・実行 |
| config.lua | `script/config/config.lua` | ソース | 設定管理 |
| loader.lua | `script/config/loader.lua` | ソース | 設定ファイルの読み込み |
| filewatch.lua | `script/filewatch.lua` | ソース | ファイル監視 |
| workspace.lua | `script/workspace/workspace.lua` | ソース | ワークスペース管理・リロード |
