# 画面設計書 63-DScanner設定取得（served/getDscannerConfig）

## 概要

本ドキュメントは、serve-d LSPサーバーのカスタムリクエスト `served/getDscannerConfig` の画面設計書である。指定されたドキュメントURIに対する現在のDScanner設定（静的解析チェック項目の有効/無効状態）を返却する。

### 本画面の処理概要

本リクエストは、DScanner（D言語の静的解析ツール）の設定をクライアントに返却する機能を提供する。

**業務上の目的・背景**：DScannerは多数の静的解析チェック項目を持ち、それぞれが有効（enabled）・無効（disabled）・テスト外スキップ（skip-unittest）の状態を持つ。エディタ拡張はこの情報を取得して、ユーザーにDScannerの設定状態を表示したり、設定の変更UIを提供する必要がある。dscanner.iniファイルの内容がプロジェクトやディレクトリごとに異なる場合もあるため、指定ドキュメントに対する正確な設定を取得できることが重要である。

**画面へのアクセス方法**：LSPクライアントから `served/getDscannerConfig` カスタムリクエストを送信することでアクセスする。テキストドキュメントのURIをパラメータとして指定する。

**主要な操作・処理内容**：
1. クライアントからテキストドキュメント識別子（URI）を受信する
2. 指定URIに最適なDscannerComponentを持つバックエンドインスタンスを取得する
3. ドキュメントURIに対応するdscanner.iniファイルのパスを解決する
4. DscannerComponentからINI設定を読み込む
5. 設定セクションとその中の各チェック項目（名前・説明・有効状態）を構造化して返却する

**画面遷移**：
- 遷移元：エディタのDScanner設定表示UI
- 遷移先：なし（設定情報の返却のみ）

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 40 | DScanner設定取得 (served/getDscannerConfig) | 主機能 | 指定ドキュメントに対する現在のD-Scanner設定を返却する |

## 画面種別

カスタムLSPリクエスト（設定情報返却型）

## URL/ルーティング

LSPカスタムメソッド: `served/getDscannerConfig`

## 入出力項目

### リクエストパラメータ

| 項目名 | 型 | 必須 | 説明 |
|--------|------|------|------|
| textDocument | TextDocumentIdentifier | はい | 対象ドキュメントのURI |

### レスポンス

| 項目名 | 型 | 説明 |
|--------|------|------|
| (戻り値) | DScannerIniSection[] | DScanner設定セクションの配列 |

### DScannerIniSection構造

| 項目名 | 型 | 説明 |
|--------|------|------|
| name | string | セクション名 |
| description | string | セクションの説明 |
| features | DScannerIniFeature[] | チェック項目の配列 |

### DScannerIniFeature構造

| 項目名 | 型 | 説明 |
|--------|------|------|
| name | string | チェック項目名（例: "dscanner.bugs.backwards_slices"） |
| description | string | チェック項目の説明 |
| enabled | string | 有効状態（"enabled", "disabled", "skip-unittest"） |

## 表示項目

クライアント側でDScanner設定の一覧表示UIに使用される。各チェック項目の名前・説明・有効/無効状態が表示される。

## イベント仕様

### 1-DScanner設定取得リクエスト受信

1. クライアントから `served/getDscannerConfig` リクエストを受信する
2. `backend.getBestInstance!DscannerComponent` で指定URIに最適なインスタンスを取得する
3. インスタンスが見つからない場合はnullを返却する
4. ドキュメントURIに対する `dscanner.ini` ファイルのパスを `getDscannerIniForDocument` で解決する（URIが空の場合はデフォルトの "dscanner.ini" を使用）
5. `DscannerComponent.getConfig(ini)` で設定を読み込む
6. 設定の各フィールドについて、`DScannerIniFeature` 構造体を生成する
7. セクション情報と共に `DScannerIniSection` 配列として返却する

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

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

本リクエストはデータベースへの更新を行わない。ファイルシステム上のdscanner.iniの読み取りのみを実施する。

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| DScanner設定取得リクエスト | dscanner.ini | SELECT（読み取り） | dscanner.ini設定ファイルの読み込み |

## メッセージ仕様

| メッセージID | 種別 | 表示条件 | メッセージ内容 |
|-------------|------|---------|--------------|
| なし | - | - | 本リクエストはエラーメッセージを直接クライアントに表示しない |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| DscannerComponentを持つインスタンスが存在しない | nullを返却する |
| dscanner.iniが存在しない | デフォルト設定を返却する |

## 備考

- 設定セクションの名前と説明は、D言語のUDA（User-Defined Attributes）からコンパイル時に取得される
- 現在の実装では単一のセクション（StaticAnalysisConfig）のみを返却する
- チェック項目の名前はフィールド識別子から取得され、説明はUDAのmsg属性から取得される

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | extension.d | `source/served/extension.d` | DScannerIniSection, DScannerIniFeature構造体の定義（要grep） |

**読解のコツ**: DScannerIniSectionとDScannerIniFeatureはレスポンスの構造体。DscannerComponentのgetConfigメソッドはworkspace-dライブラリ側で定義されている。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | extension.d | `source/served/extension.d` | `getDscannerConfig` 関数（行1189-1224）がエントリーポイント |

**主要処理フロー**:
1. **行1189-1190**: `@protocolMethod("served/getDscannerConfig")` で定義。パラメータは `SimpleTextDocumentIdentifierParams`
2. **行1194-1195**: `backend.getBestInstance!DscannerComponent` でインスタンス取得
3. **行1197-1198**: インスタンスがnullならnull返却
4. **行1200-1202**: dscanner.iniのパス解決。URIがある場合は `getDscannerIniForDocument` を使用
5. **行1204**: `instance.get!DscannerComponent.getConfig(ini)` で設定読み込み
6. **行1206-1208**: セクション情報の構築（UDAからdescriptionとnameを取得）
7. **行1211-1220**: 各フィールドのループ処理でDScannerIniFeatureを構築

#### Step 3: dscanner.ini解決ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | dscanner.d | `source/served/linters/dscanner.d` | `getDscannerIniForDocument` 関数 |

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

```
served/getDscannerConfig リクエスト
    |
    +-- getDscannerConfig(SimpleTextDocumentIdentifierParams)  [extension.d:1190]
           |
           +-- backend.getBestInstance!DscannerComponent()
           |
           +-- getDscannerIniForDocument()                     [dscanner.d]
           |
           +-- DscannerComponent.getConfig(ini)                [workspace-d]
           |
           +-- __traits(getAttributes, ...)                    [UDAからメタデータ取得]
```

### データフロー図

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

textDocument(URI) --------> getDscannerConfig()             --> DScannerIniSection[]
                               |                                    |
                               +-- dscanner.ini解決                 +-- name
                               +-- INI設定読み込み                   +-- description
                               +-- UDAメタデータ取得                 +-- features[]
                                                                       +-- name
                                                                       +-- description
                                                                       +-- enabled
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| extension.d | `source/served/extension.d` | ソース | getDscannerConfig関数の実装 |
| dscanner.d | `source/served/linters/dscanner.d` | ソース | getDscannerIniForDocument関数の提供 |
| types.d | `source/served/types.d` | ソース | 共通型定義 |
