# serve-d

## 概要

serve-d は、[D言語](https://dlang.org) 向けの [Microsoft Language Server Protocol (LSP)](https://github.com/Microsoft/language-server-protocol) 実装です。Visual Studio Code 拡張機能 [code-d](https://github.com/Pure-D/code-d) のバックエンドとして動作し、LSP をサポートする任意のエディタに対して D言語の IDE 機能（補完、定義ジャンプ、リファクタリング、リンティングなど）を提供します。

## 主な機能

| 機能カテゴリ | 説明 |
| --- | --- |
| コード補完 | DCD（D Completion Daemon）を利用したインテリジェントな補完候補の提示。コンテキストスニペット・デフォルトスニペットにも対応 |
| 定義ジャンプ / 参照検索 | シンボルの定義元や参照箇所への遷移 |
| コードアクション | インターフェース/抽象クラスのメソッド自動実装、インポート追加・ソートなど |
| リンティング / 診断 | D-Scanner によるコード解析・警告表示 |
| フォーマット | dfmt を利用したコード自動整形 |
| リネーム | シンボルの一括リネーム |
| コードレンズ / インレイヒント | コード上にインライン情報を表示 |
| シンボル検索 | ワークスペース内のシンボル検索・ファイル検索 |
| ビルドタスク | DUB ベースのビルド・テスト・リビルドタスクの提供 |
| マルチワークスペース対応 | 複数のワークスペースフォルダを同時に管理 |
| vibe.d / DlangUI サポート | diet テンプレートや DML ファイルの補完・診断 |
| カスタムLSPリクエスト | `served/*` / `coded/*` による拡張リクエスト・通知の独自プロトコル |

## 技術スタック

### コア

- 言語: D
- プロトコル: Microsoft Language Server Protocol (LSP)
- ビルドシステム: DUB
- ライセンス: MIT

### 主要ライブラリ

- **DCD** (v0.16.2): D Completion Daemon — 補完・定義ジャンプの中核エンジン
- **D-Scanner** (v0.16.0-beta.5): D言語の静的解析・リンティングツール
- **dfmt** (v0.15.2): D言語コードフォーマッタ
- **libdparse** (v0.25.1): D言語パーサーライブラリ
- **libddoc** (v0.8.0): DDoc ドキュメント処理
- **DUB** (v1.40.0): D言語パッケージマネージャ・ビルドツール（依存関係管理に使用）
- **diet-complete** (v0.0.3): diet テンプレートの補完サポート
- **emsi_containers** (v0.9.0): 高効率コンテナライブラリ
- **fuzzymatch** (v1.0.0): ファジーマッチングライブラリ
- **sdlfmt** (v0.1.1): SDL 形式のフォーマッタ
- **mir-algorithm** (v3.22.4): 高性能アルゴリズムライブラリ
- **silly** (v1.1.1): テストランナー（ユニットテスト用）

## ディレクトリ構成

```
serve-d-master/
├── source/                  # メインのサーバー実装
│   ├── app.d                # エントリーポイント（コマンドライン処理、RPC起動）
│   └── served/
│       ├── extension.d      # LSP拡張・初期化ロジック
│       ├── types.d          # 共通型定義
│       ├── info.d           # バージョン情報
│       ├── commands/        # LSPリクエスト/コマンドハンドラ
│       │   ├── complete.d       # コード補完
│       │   ├── definition.d     # 定義ジャンプ
│       │   ├── references.d     # 参照検索
│       │   ├── code_actions.d   # コードアクション
│       │   ├── code_lens.d      # コードレンズ
│       │   ├── rename.d         # リネーム
│       │   ├── format.d         # フォーマット
│       │   ├── dub.d            # DUBビルドタスク
│       │   ├── symbol_search.d  # シンボル検索
│       │   ├── file_search.d    # ファイル検索
│       │   ├── folding.d        # コード折り畳み
│       │   ├── highlight.d      # シンタックスハイライト
│       │   ├── color.d          # カラー処理
│       │   ├── calltips.d       # コールチップ
│       │   ├── inlay_hints.d    # インレイヒント
│       │   ├── dcd_update.d     # DCDの更新処理
│       │   └── test_provider.d  # テストランナー連携
│       ├── linters/         # リンティング統合
│       │   ├── dscanner.d       # D-Scanner連携
│       │   ├── dfmt.d           # dfmt連携
│       │   ├── dub.d            # DUBビルド診断
│       │   └── diagnosticmanager.d  # 診断管理
│       ├── backend/         # バックエンド処理
│       ├── io/              # I/O処理（HTTP、ファイルリーダー）
│       ├── utils/           # ユーティリティ（翻訳、トレース、プロファイル等）
│       └── workers/         # ワーカースレッド処理
├── lsp/                     # LSPプロトコル型定義・RPC基盤
├── serverbase/              # LSPサーバー基盤（汎用LSPサーバー構築用）
├── dcd/                     # DCD直接通信クライアント（低遅延）
├── workspace-d/             # D言語コア機能（libdparse, dfmt, D-Scanner, DCD連携）
├── http/                    # HTTPダウンロード処理（WinHTTP / requestsライブラリ）
├── protocol/                # プロトコルシリアライゼーション
├── views/                   # テンプレートファイル（string imports）
├── test/                    # 統合テスト
│   ├── runtests.sh              # テスト実行スクリプト
│   ├── tc_dub/                  # DUBテストケース
│   ├── tc_implement_interface/  # インターフェース実装テスト
│   ├── tc_integrated_dfmt/      # dfmt統合テスト
│   ├── tc_integrated_dscanner/  # D-Scanner統合テスト
│   └── ...
├── ci/                      # CI用ビルドスクリプト
├── null_server/             # 最小限のLSPサーバー実装（テスト・リファレンス用）
├── null_server_test/        # null_serverのテスト
├── dub.json                 # プロジェクト設定・依存関係定義
├── dub.selections.json      # 依存関係のロックファイル
├── reggaefile.d             # Reggaeビルドシステム設定
├── release.sh               # リリースビルドスクリプト（Linux）
├── release.bat              # リリースビルドスクリプト（Windows）
└── editor-*.md              # 各エディタ向け設定ガイド
```

## セットアップ

### 必要条件

- **D言語コンパイラ**: DMD または LDC（LDC推奨、リリースビルド用）
- **DUB**: D言語パッケージマネージャ（D言語コンパイラに同梱）

### プリビルトバイナリの取得

- [安定版・プレリリース版（GitHub Releases）](https://github.com/Pure-D/serve-d/releases)
- [ナイトリービルド](https://github.com/Pure-D/serve-d/releases/tag/nightly)

### ソースからのビルド

```bash
# 通常ビルド
dub build

# リリースビルド（LDC使用）
dub build --compiler=ldc2 --build=release
```

### エディタ設定

serve-d を利用するには、LSP をサポートするエディタが必要です。

| エディタ | 設定方法 |
| --- | --- |
| Visual Studio Code | [code-d](https://marketplace.visualstudio.com/items?itemName=webfreak.code-d) 拡張をインストール |
| Vim / Neovim | [editor-vim.md](../../editor-vim.md) を参照 |
| Sublime Text | [editor-st.md](../../editor-st.md) を参照 |
| Emacs | [editor-emacs.md](../../editor-emacs.md) を参照 |
| Helix | [editor-helix.md](../../editor-helix.md) を参照 |
| Nova | [editor-nova.md](../../editor-nova.md) を参照 |
| Lite-XL | [editor-lite-xl.md](../../editor-lite-xl.md) を参照 |

### コマンドラインオプション

| オプション | デフォルト | 説明 |
| --- | --- | --- |
| `-r` / `--require` | [] | 必須機能セットの指定。未対応の場合は起動時にクラッシュ |
| `-p` / `--provide` | [] | エディタ拡張機能フラグ（http, implement-snippets, context-snippets 等） |
| `-v` / `--version` | n/a | バージョン情報の表示 |
| `--logfile` | n/a | ログ出力先ファイルの指定 |
| `--loglevel` | verbose(debug) / info(release) | ログレベルの設定 |
| `--lang` | en | GUI メッセージの言語設定 |
| `--wait` | false | 起動前に1秒待機（デバッグ用） |

## 開発

### ユニットテストの実行

```bash
# 全体のユニットテスト
dub test

# サブパッケージ個別のテスト
dub test :workspace-d
dub test :protocol
dub test :dcd
dub test :lsp
dub test :serverbase
```

### 統合テストの実行

```bash
cd test
./runtests.sh
```

### CI

GitHub Actions によるCI/CDパイプラインが構成されており、以下のワークフローが実行されます。

- **Run Unittests** (`unittest.yml`): push・PR 時にユニットテスト・統合テストを実行（Ubuntu / Windows / macOS、DMD / LDC）
- **Deploy Nightly** (`nightly.yml`): ナイトリービルドの自動デプロイ
- **Releases** (`releases.yml`): リリースビルドの自動デプロイ

### ビルドシステム

- **DUB**: 標準のビルド・テスト（`dub build`, `dub test`）
- **Reggae**: 代替ビルドシステムとして `reggaefile.d` が用意されており、Ninja/make との連携が可能
