# 機能設計書 73-C/C++言語サポート

## 概要

本ドキュメントは、Doom EmacsにおけるC/C++/Objective-C言語の開発サポート機能について記述する。ヘッダーファイルの自動モード検出、LSP統合（clangd/ccls）、CMakeサポート、GLSL/CUDAサポートなど、システムプログラミングに必要な包括的な開発環境を提供する。

### 本機能の処理概要

**業務上の目的・背景**：C/C++はシステムプログラミング、組み込み開発、ゲーム開発、高性能コンピューティングなど幅広い分野で使用される言語である。これらの言語はヘッダーファイルの扱いが複雑であり、適切なモード検出やインクルードパス管理が生産性に直結する。本モジュールはこれらの課題を解決し、モダンなC/C++開発環境を提供する。

**機能の利用シーン**：C/C++/Objective-Cプロジェクトの開発時に、ソースコードの編集、ヘッダーファイルとソースファイル間のナビゲーション、コード補完、静的解析、CMakeプロジェクトの管理などの場面で利用される。

**主要な処理内容**：
1. cc-modeによるC/C++/Objective-Cソースファイルの編集サポート
2. .hファイルの自動モード検出（C/C++/Objective-C）
3. Tree-sitterによる高度な構文解析（c-ts-mode、c++-ts-mode）
4. LSP統合（clangd推奨、cclsもサポート）
5. CMakeモードによるビルドシステムサポート
6. GLSLモードによるシェーダー開発サポート
7. CUDAモードによるGPUプログラミングサポート
8. find-file-at-point（ffap）統合によるヘッダーファイルジャンプ

**関連システム・外部連携**：
- clangd: C/C++ Language Server（推奨）
- ccls: 代替Language Server
- CMake: ビルドシステム
- compile_commands.json: コンパイルデータベース

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | C/C++ソースバッファ | 主画面 | ソースファイルの編集 |
| - | *CMake Help*バッファ | 結果表示画面 | CMakeドキュメント表示 |
| - | *ccls inheritance*バッファ | 結果表示画面 | クラス継承階層表示 |

## 機能種別

言語サポート / 開発環境統合

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| +lsp | フラグ | No | LSPサポートを有効化 | doom!ブロックで指定 |
| +tree-sitter | フラグ | No | Tree-sitterサポートを有効化 | doom!ブロックで指定 |

### 入力データソース

- C/C++ソースファイル（*.c, *.cc, *.cpp, *.h, *.hpp）
- Objective-Cファイル（*.m, *.mm）
- CMakeLists.txt, *.cmake
- GLSLファイル（*.glsl, *.vert, *.frag）
- CUDAファイル（*.cu, *.cuh）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| モード判定結果 | シンボル | c-mode, c++-mode, objc-mode のいずれか |
| 継承階層 | テキスト | *ccls inheritance*バッファに出力 |
| CMakeヘルプ | テキスト | *CMake Help*バッファに出力 |

### 出力先

- エディタバッファ: シンタックスハイライト、インデント
- ミニバッファ: エラーメッセージ、補完候補
- ヘルプバッファ: ドキュメント表示

## 処理フロー

### 処理シーケンス

```
1. C/C++ファイルを開く
   └─ .h ファイルの場合は +cc-c-c++-objc-mode でモード判定
2. モード初期化
   └─ cc-mode の "doom" スタイル適用
3. LSPモード有効時
   └─ clangd または ccls に接続
4. ffap統合
   └─ +cc-init-ffap-integration-h でインクルードパス設定
```

### フローチャート

```mermaid
flowchart TD
    A[C/C++ファイルを開く] --> B{.h ファイル?}
    B -->|Yes| C[+cc-c-c++-objc-mode]
    B -->|No| D[拡張子でモード判定]
    C --> E{隣接ファイル確認}
    E -->|.cpp/.cc存在| F[c++-mode]
    E -->|.m/.mm存在| G[objc-mode]
    E -->|キーワード検出| H[モード決定]
    E -->|フォールバック| I[+cc-default-header-file-mode]
    D --> J[モード起動]
    F --> J
    G --> J
    H --> J
    I --> J
    J --> K{+lsp?}
    K -->|Yes| L[clangd/ccls接続]
    K -->|No| M[基本編集モード]
    L --> N[開発作業]
    M --> N
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | ヘッダーモード検出 | .hファイルは隣接する.cpp/.ccまたは.m/.mmの存在でモード決定 | .hファイルオープン時 |
| BR-02 | C++キーワード検出 | namespace, class, template等のキーワードでC++判定 | ヘッダーファイル解析時 |
| BR-03 | Objective-Cキーワード検出 | @class, @interface, #import等でObjective-C判定 | ヘッダーファイル解析時 |
| BR-04 | インクルードパス解決 | +cc-default-include-paths に基づきffapパスを設定 | C/C++モード有効化時 |
| BR-05 | LSP優先度 | clangdがcclsより優先（ccls優先度: -2） | LSP初期化時 |

### 計算ロジック

**インデントスタイル "doom"**:
- `c-basic-offset`: tab-width と同値
- サブステートメント: 追加インデントなし
- caseラベル: +1インデント
- アクセス修飾子: -1インデント

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

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

データベース操作なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | eglot--error | ccls階層情報が取得できない | "Hierarchy unavailable" エラー表示 |

### リトライ仕様

リトライ機能なし

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

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

## パフォーマンス要件

- clangdのスレッド数は `(doom-system-cpus) / 2` に制限（CPU過負荷防止）
- cclsのインデックススレッド数も同様に制限

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

- .ccls-cache ディレクトリはprojectileのグローバル除外対象
- compile_commands.json はプロジェクトルート検出に使用

## 備考

- `cpp-mode` は `c++-mode` のエイリアスとして定義
- macOSでは Xcode CommandLineTools のインクルードパスが自動設定される

---

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

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

### 推奨読解順序

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

設定変数とスタイル定義を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.el | `modules/lang/cc/config.el` | +cc-default-include-paths, +cc-default-header-file-mode 変数 |

**読解のコツ**: これらの変数はカスタマイズポイントとなり、ユーザー設定で上書き可能。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.el | `modules/lang/cc/config.el` | cc-mode の use-package! 設定 |

**主要処理フロー**:
1. **20-23行目**: `cc-mode` のモード設定（.mm, .h ファイル）
2. **27-28行目**: ffap統合フックの設定
3. **31-37行目**: Tree-sitter設定（c-ts-mode, c++-ts-mode）
4. **52-56行目**: docsetsとelectric設定
5. **90-118行目**: "doom"インデントスタイル定義

#### Step 3: ヘッダーファイルモード検出を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | autoload.el | `modules/lang/cc/autoload.el` | +cc-c-c++-objc-mode 関数 |

**主要処理フロー**:
- **46-84行目**: `+cc-c-c++-objc-mode` - ヒューリスティクスによるモード判定
  - 隣接ファイル確認（.cpp, .cc, .m, .mm）
  - Objective-Cキーワード検出
  - C++キーワード検出
  - フォールバック処理

#### Step 4: LSP統合を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | config.el | `modules/lang/cc/config.el` | LSPおよびccls設定 |

**主要処理フロー**:
- **187-215行目**: LSPフック設定、clangdスレッド数制限
- **217-269行目**: cclsパッケージ設定、優先度設定、macOS対応

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

```
cc-mode (c-mode / c++-mode / objc-mode)
    │
    ├─ +cc-c-c++-objc-mode (.h ファイル用)
    │      ├─ file-exists-p! (隣接ファイル確認)
    │      ├─ +cc--re-search-for (キーワード検出)
    │      └─ major-mode-remap
    │
    ├─ +cc-init-ffap-integration-h
    │      └─ +cc-resolve-include-paths
    │
    ├─ LSP統合
    │      ├─ clangd
    │      │      └─ lsp-clients-clangd-args (スレッド制限)
    │      └─ ccls
    │             ├─ ccls-navigate
    │             └─ +cc/ccls-show-* (各種参照表示)
    │
    └─ cmake-mode
           └─ +cc-cmake-lookup-documentation-fn
```

### データフロー図

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

.hファイル ─────────────▶ +cc-c-c++-objc-mode ─────▶ 適切なメジャーモード
                               │
                               ├─ 隣接ファイル確認
                               ├─ キーワード検出
                               └─ フォールバック

C/C++ソースファイル ───▶ cc-mode ─────────────────▶ シンタックスハイライト
        │                   │
        │                   ▼
        └──────────────▶ clangd/ccls ────────────▶ コード補完/エラー検出

インクルードパス ──────▶ +cc-init-ffap-integration-h ▶ ffap-c-path/ffap-c++-path
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.el | `modules/lang/cc/config.el` | ソース | モジュール設定、LSP設定、スタイル定義 |
| autoload.el | `modules/lang/cc/autoload.el` | ソース | モード検出、ccls関数、ffap統合 |
| packages.el | `modules/lang/cc/packages.el` | ソース | 依存パッケージ定義 |
| doctor.el | `modules/lang/cc/doctor.el` | ソース | 環境診断スクリプト |
