# 画面設計書 44-ステータスクリック

## 概要

本ドキュメントは、Lua Language Serverの内部LSP機能「ステータスクリック」の画面設計書です。エディタのステータスバーに表示されるLua Language Serverのステータスアイコンをクリックした際に、診断実行やサーバー管理などのアクションメニューを表示する機能です。

### 本画面の処理概要

**業務上の目的・背景**：ユーザーがLua Language Serverの状態を確認し、必要に応じて診断の再実行やサーバーの操作を行えるようにするためのインターフェースを提供します。VS Codeのステータスバーに表示されるLuaアイコンをクリックすると、利用可能なアクションのリストが表示され、ユーザーは診断の実行、サーバーの再起動、ガベージコレクションなどの操作を選択できます。開発者モード（DEVELOP）が有効な場合は、追加の開発者向けオプションも表示されます。

**画面へのアクセス方法**：VS Codeのステータスバーに表示されるLua Language Serverのステータスアイコンをクリックすることでアクセスします。これにより、内部LSPリクエスト `$/status/click` がサーバーに送信されます。

**主要な操作・処理内容**：
1. クライアントからLSPリクエスト `$/status/click` を受信する
2. 利用可能なアクションのリストを構築する（通常モード/開発者モード）
3. クライアントにメッセージダイアログを表示するリクエストを送信する
4. ユーザーの選択を受け取る
5. 選択されたアクションに応じて処理を実行する
   - 診断実行: 全ワークスペースの診断を実行
   - サーバー再起動: 診断をクリアしてサーバーを終了（開発者モード）
   - ノードキャッシュクリア: VM のノードキャッシュをクリア（開発者モード）
   - GC: ガベージコレクションを実行（開発者モード）

**画面遷移**：ステータスバークリック → アクションメニュー表示 → 選択したアクションの実行。アクションによっては、診断結果の表示やサーバーの再起動が行われます。

**権限による表示制御**：グローバル変数 `DEVELOP` が設定されている場合（開発者モード）は、追加の開発者向けオプション（「Restart Server」「Clear Node Cache」「GC」）が表示されます。通常モードでは「診断」オプションのみが表示されます。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 30 | 構文診断 | 遷移先機能 | 全ワークスペースの診断実行 |
| 80 | Doctorモード | 遷移先機能 | 環境診断と問題レポート |

## 画面種別

LSP内部リクエスト（ステータスバー連携）

## URL/ルーティング

LSPメソッド: `$/status/click`

## 入出力項目

| 項目名 | 入出力 | 型 | 必須 | 説明 |
|--------|--------|-----|------|------|
| (なし) | 入力 | - | - | パラメータなし |
| (なし) | 出力 | - | - | 明示的なレスポンスなし |

## 表示項目

メッセージダイアログに表示されるアクション選択肢：

| 項目名 | 表示条件 | 説明 |
|--------|---------|------|
| 診断タイトル | 常時 | 全ワークスペースの診断を実行 |
| Restart Server | 開発者モード | サーバーを再起動 |
| Clear Node Cache | 開発者モード | VM のノードキャッシュをクリア |
| GC | 開発者モード | ガベージコレクションを実行 |

## イベント仕様

### 1-ステータスクリック

LSPリクエスト `$/status/click` を受信すると、以下の処理が行われます：

1. `script/provider/provider.lua` の `$/status/click` ハンドラが呼び出される（1225-1257行目）
2. 言語リソースから診断タイトルを取得する
3. アクション選択肢を構築する（開発者モードの場合は追加オプションを含む）
4. `client.awaitRequestMessage()` でユーザーに選択ダイアログを表示する
5. ユーザーの選択に応じて処理を実行する

### 2-診断実行アクション

ユーザーが「診断」を選択した場合：

1. `provider/diagnostic` モジュールをrequireする
2. 全てのワークスペースフォルダに対して `diagnostic.diagnosticsScope()` を呼び出す
3. 診断結果がエディタに通知される

### 3-サーバー再起動アクション（開発者モード）

ユーザーが「Restart Server」を選択した場合：

1. `provider/diagnostic` モジュールをrequireする
2. `diag.clearAll()` で全ての診断をクリアする
3. `os.exit(0, true)` でサーバーを終了する（クライアントが自動で再起動）

### 4-ノードキャッシュクリアアクション（開発者モード）

ユーザーが「Clear Node Cache」を選択した場合：

1. `vm` モジュールをrequireする
2. `vm.clearNodeCache()` でノードキャッシュをクリアする
3. `collectgarbage()` を2回呼び出してメモリを解放する

### 5-GCアクション（開発者モード）

ユーザーが「GC」を選択した場合：

1. `collectgarbage()` を2回呼び出してガベージコレクションを実行する

## データベース更新仕様

本機能はデータベースを使用しません。

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| - | - | - | データベース操作なし |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|---------|
| WINDOW_LUA_STATUS_DIAGNOSIS_TITLE | 選択肢タイトル | 診断タイトル（多言語対応） | 常時 |
| WINDOW_LUA_STATUS_DIAGNOSIS_MSG | メッセージ本文 | 診断メッセージ（多言語対応） | 常時 |

## 例外処理

| 例外条件 | 処理内容 | レスポンス |
|---------|---------|-----------|
| ユーザーがダイアログをキャンセル | 処理を中断 | なし |
| ユーザーが選択肢を選ばない | 処理を中断 | なし |

## 備考

- 本機能は `$/` プレフィックスで始まるLSP仕様外の拡張リクエストです
- sumneko.lua VS Code拡張機能専用の機能です
- ステータスバーの表示/非表示は `Lua.window.statusBar` 設定で制御されます
- 開発者モードは `DEVELOP` グローバル変数で有効化されます
- ステータスバーの表示は `$/status/show` および `$/status/hide` 通知で制御されます

---

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

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

### 推奨読解順序

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

まず、ステータス表示と設定の関係を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | provider.lua | `script/provider/provider.lua` | `refreshStatusBar()` 関数（1629-1645行目）でステータスバーの表示制御ロジックを理解 |
| 1-2 | language.lua | `script/language.lua` | `lang.script.WINDOW_LUA_STATUS_*` でメッセージリソースの構造を理解 |

**読解のコツ**: ステータスバーの表示は設定 `Lua.window.statusBar` に依存し、`$/status/show` や `$/status/hide` 通知でクライアントに制御を指示します。

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

処理の起点となるLSPハンドラを特定します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | provider.lua | `script/provider/provider.lua` | `$/status/click` ハンドラの登録（1225-1257行目）がエントリーポイント |

**主要処理フロー**:
1. **1226行目**: 非同期関数の定義開始
2. **1228行目**: `lang.script.WINDOW_LUA_STATUS_DIAGNOSIS_TITLE` で診断タイトルを取得
3. **1229-1234行目**: `client.awaitRequestMessage()` でアクション選択ダイアログを表示
4. **1235-1237行目**: 選択がない場合は処理を中断
5. **1238-1242行目**: 「診断」選択時の処理 - 全ワークスペースを診断
6. **1243-1246行目**: 「Restart Server」選択時の処理（開発者モード）
7. **1247-1251行目**: 「Clear Node Cache」選択時の処理（開発者モード）
8. **1252-1255行目**: 「GC」選択時の処理（開発者モード）

#### Step 3: ステータスバー表示制御を理解する

ステータスバーの表示/非表示制御ロジックを理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | provider.lua | `script/provider/provider.lua` | `refreshStatusBar()` 関数（1629-1645行目）で表示制御を理解 |
| 3-2 | provider.lua | `script/provider/provider.lua` | 設定変更監視（1647-1652行目）でリアクティブな更新を理解 |
| 3-3 | provider.lua | `script/provider/provider.lua` | `$/status/refresh` ハンドラ（1654行目）で外部からの更新トリガーを理解 |

**主要処理フロー**:
- **1629-1632行目**: クライアントの `statusBar` オプションをチェック
- **1633-1639行目**: 全ワークスペースの `Lua.window.statusBar` 設定を確認
- **1640-1644行目**: 設定に応じて `$/status/show` または `$/status/hide` を送信

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

```
$/status/click handler [provider.lua:1225]
    │
    ├─ lang.script.WINDOW_LUA_STATUS_DIAGNOSIS_TITLE [1228行目]
    │
    ├─ client.awaitRequestMessage() [1229行目]
    │      │
    │      └─ ユーザーがアクションを選択
    │
    ├─ [選択: 診断]
    │      │
    │      ├─ require 'provider.diagnostic' [1239行目]
    │      │
    │      └─ diagnostic.diagnosticsScope(scp.uri, true, true) [1241行目]
    │             │
    │             └─ 全ワークスペースをループ処理
    │
    ├─ [選択: Restart Server] ※開発者モード
    │      │
    │      ├─ require 'provider.diagnostic' [1244行目]
    │      │
    │      ├─ diag.clearAll(nil, true) [1245行目]
    │      │
    │      └─ os.exit(0, true) [1246行目]
    │
    ├─ [選択: Clear Node Cache] ※開発者モード
    │      │
    │      ├─ require 'vm' [1248行目]
    │      │
    │      ├─ vm.clearNodeCache() [1249行目]
    │      │
    │      └─ collectgarbage() x2 [1250-1251行目]
    │
    └─ [選択: GC] ※開発者モード
           │
           └─ collectgarbage() x2 [1253-1254行目]
```

### データフロー図

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

ステータスバー
クリック ───▶ LSPリクエスト $/status/click
                     │
                     ▼
              アクション選択肢構築
                     │
                     ▼
              client.awaitRequestMessage() ───▶ ダイアログ表示
                     │                              │
                     │◀─────────────────────────────┘
                     │        ユーザー選択
                     ▼
              選択されたアクション実行
                     │
    ┌────────────────┼────────────────┐
    ▼                ▼                ▼
診断実行      サーバー操作       メモリ操作
    │                │                │
    ▼                ▼                ▼
診断結果通知    サーバー終了      GC実行
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| provider.lua | `script/provider/provider.lua` | ソース | LSPリクエストハンドラ（1225-1257行目）、ステータスバー制御（1629-1654行目） |
| diagnostic.lua | `script/provider/diagnostic.lua` | ソース | 診断処理の実行（diagnosticsScope, clearAll） |
| client.lua | `script/client.lua` | ソース | クライアント通信（awaitRequestMessage, setConfig） |
| language.lua | `script/language.lua` | ソース | 多言語対応メッセージリソース |
| workspace.lua | `script/workspace/init.lua` | ソース | ワークスペース管理（folders） |
| vm.lua | `script/vm/init.lua` | ソース | 仮想マシン管理（clearNodeCache） |
| config.lua | `script/config.lua` | ソース | 設定管理（Lua.window.statusBar） |
