# 機能設計書 71-Go言語サポート

## 概要

本ドキュメントは、Doom EmacsにおけるGo言語の開発サポート機能について記述する。Go言語ファイルの編集、テスト実行、コード生成、REPL操作などの包括的な開発環境を提供する。

### 本機能の処理概要

**業務上の目的・背景**：Go言語は現代のクラウドネイティブ開発やマイクロサービス開発において広く採用されている言語である。開発者がEmacs上でGo言語の開発を効率的に行うためには、シンタックスハイライト、コード補完、テスト実行、リンター統合などの機能が必要となる。本モジュールはこれらの機能を統合的に提供し、Go開発者の生産性向上を目的としている。

**機能の利用シーン**：Goプロジェクトの開発時に、ソースコードの編集、テストの実行、ベンチマークの実行、コード生成（go generate）、Go Playgroundへのコード送信などの場面で利用される。また、LSPを有効化することで高度なコード補完やエラー検出が可能となる。

**主要な処理内容**：
1. go-modeによるGoソースファイルの編集サポート（シンタックスハイライト、インデント）
2. go-ts-mode（Tree-sitter）による高度な構文解析とハイライト
3. テスト関連機能（単体テスト、ファイル内全テスト、ネストテスト、ベンチマーク）
4. コード生成機能（go generate）のファイル/ディレクトリ/プロジェクト単位での実行
5. gorepl-modeによるREPL環境の提供
6. flycheck-golangci-lintによる静的解析
7. LSPサポート（gopls）による高度なコード補完・エラー検出

**関連システム・外部連携**：
- gopls: Go Language Server
- golangci-lint: 静的解析ツール
- gore: Go REPL
- gotests: テスト生成ツール
- gomodifytags: 構造体タグ操作ツール

**権限による制御**：特になし。ただし、外部ツール（gopls、golangci-lintなど）がシステムにインストールされている必要がある。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | Goソースバッファ | 主画面 | Goファイルの編集、テスト実行、コード生成 |
| - | *compilation*バッファ | 結果表示画面 | テスト結果、ビルド結果の表示 |
| - | *gorepl*バッファ | 結果表示画面 | REPL実行結果の表示 |

## 機能種別

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

## 入力仕様

### 入力パラメータ

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

### 入力データソース

- Goソースファイル（*.go）
- go.modファイル
- go.workファイル（Emacs 30.1+）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| テスト結果 | テキスト | *compilation*バッファに出力 |
| ビルド結果 | テキスト | *compilation*バッファに出力 |
| REPL出力 | テキスト | *gorepl*バッファに出力 |

### 出力先

- *compilation*バッファ: テスト・ビルド結果
- *gorepl*バッファ: REPL実行結果
- ミニバッファ: エラーメッセージ、ステータス表示

## 処理フロー

### 処理シーケンス

```
1. Goファイルを開く
   └─ go-mode または go-ts-mode が起動
2. モード初期化
   └─ +go-common-config によりキーバインド、docsets、REPL、lookupハンドラを設定
3. LSPモード有効時
   └─ lsp! が呼び出され、goplsに接続
4. Tree-sitterモード有効時
   └─ go-ts-mode が go-mode をリマップ
5. テスト実行時
   └─ +go/test-* 関数が go test コマンドを compile で実行
```

### フローチャート

```mermaid
flowchart TD
    A[Goファイルを開く] --> B{+tree-sitter?}
    B -->|Yes| C[go-ts-mode起動]
    B -->|No| D[go-mode起動]
    C --> E[+go-common-config実行]
    D --> E
    E --> F{+lsp?}
    F -->|Yes| G[lsp!呼び出し]
    F -->|No| H[補完バックエンド設定]
    G --> I[開発作業]
    H --> I
    I --> J{操作種別}
    J -->|テスト| K[+go/test-* 実行]
    J -->|ビルド| L[go build 実行]
    J -->|生成| M[+go/generate-* 実行]
    K --> N[結果表示]
    L --> N
    M --> N
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | テストファイル検出 | テスト実行は *_test.go ファイルでのみ有効 | +go/test-single, +go/test-file 実行時 |
| BR-02 | テスト関数検出 | Test または Benchmark プレフィックスを持つ関数を検出 | テスト/ベンチマーク実行時 |
| BR-03 | プロジェクトルート検出 | projectile を使用してプロジェクトルートを検出 | +go/generate-all 実行時 |

### 計算ロジック

特になし

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

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

データベース操作なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | user-error | ファイルを開いていないバッファでテスト実行 | "Not in a file-visiting buffer" メッセージ表示 |
| - | user-error | テストファイル以外でテスト実行 | "Must be in a *_test.go file" メッセージ表示 |
| - | user-error | テスト関数が見つからない | "No detectable test at or after point" メッセージ表示 |
| - | user-error | プロジェクトルートが見つからない | "Not in a valid project" メッセージ表示 |

### リトライ仕様

リトライ機能なし

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

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

## パフォーマンス要件

- テスト実行は compile 関数を使用し非同期で実行される
- LSPモードは gopls サーバーの応答速度に依存

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

- 外部コマンド（go, gore, golangci-lint）の実行は shell-quote-argument でエスケープ
- Go Playground へのコード送信時はインターネット接続が必要

## 備考

- gore（Go REPL）がインストールされていない場合、REPL機能は利用不可
- gotests がインストールされていない場合、テスト生成機能は利用不可
- gomodifytags がインストールされていない場合、構造体タグ操作は利用不可

---

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

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

### 推奨読解順序

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

Go言語サポートモジュールでは、テスト実行履歴を保持する変数が中心的なデータ構造となる。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | autoload.el | `modules/lang/go/autoload.el` | +go-test-last 変数の定義と使用方法 |

**読解のコツ**: Emacs Lispの`defvar`は変数定義、`;;;###autoload`コメントは遅延ロードマーカーを示す。

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

モジュールの初期化は config.el で行われる。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.el | `modules/lang/go/config.el` | +go-common-config 関数がモード共通設定を行う |

**主要処理フロー**:
1. **6-44行目**: `+go-common-config` 関数定義 - docsets、REPL、lookup、キーバインドの設定
2. **47-48行目**: `go-mode` 用の設定適用
3. **51-67行目**: `go-ts-mode` の設定（Tree-sitter有効時）
4. **74-77行目**: `flycheck-golangci-lint` の設定

#### Step 3: テスト実行機能を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | autoload.el | `modules/lang/go/autoload.el` | テスト関連の関数群 |

**主要処理フロー**:
- **17-20行目**: `+go--run-tests` - テストコマンド生成と実行
- **23-28行目**: `+go/test-rerun` - 最後のテストを再実行
- **31-34行目**: `+go/test-all` - 全テスト実行
- **43-53行目**: `+go/test-single` - ポイント位置のテスト実行（正規表現でテスト関数を検出）
- **56-70行目**: `+go/test-file` - ファイル内全テスト実行

#### Step 4: コード生成機能を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | autoload.el | `modules/lang/go/autoload.el` | go generate 関連の関数群 |

**主要処理フロー**:
- **91-97行目**: `+go--generate` - go generate コマンドの実行
- **100-105行目**: `+go/generate-file` - 現在ファイルに対して実行
- **108-111行目**: `+go/generate-dir` - ディレクトリ全体に対して実行
- **114-125行目**: `+go/generate-all` - プロジェクト全体に対して実行

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

```
go-mode / go-ts-mode
    │
    ├─ +go-common-config
    │      ├─ set-docsets!
    │      ├─ set-repl-handler! → gorepl-run
    │      ├─ set-lookup-handlers! → godoc-at-point
    │      └─ map! (キーバインド設定)
    │
    ├─ テスト関連
    │      ├─ +go/test-rerun
    │      ├─ +go/test-all
    │      ├─ +go/test-single → +go--run-tests → +go--spawn → compile
    │      ├─ +go/test-file
    │      ├─ +go/test-nested
    │      └─ +go/bench-*
    │
    └─ 生成関連
           ├─ +go/generate-file
           ├─ +go/generate-dir → +go--generate → +go--spawn → compile
           └─ +go/generate-all
```

### データフロー図

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

Goソースファイル ───▶ go-mode/go-ts-mode ───▶ シンタックスハイライト
                            │
テスト実行要求 ─────────────┼──▶ +go/test-* ───▶ *compilation*バッファ
                            │
go generate要求 ────────────┼──▶ +go/generate-* ───▶ *compilation*バッファ
                            │
REPL要求 ───────────────────┴──▶ gorepl-run ───▶ *gorepl*バッファ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.el | `modules/lang/go/config.el` | ソース | モジュール設定、キーバインド定義 |
| autoload.el | `modules/lang/go/autoload.el` | ソース | 遅延ロード関数（テスト、生成、REPL） |
| packages.el | `modules/lang/go/packages.el` | ソース | 依存パッケージ定義 |
| doctor.el | `modules/lang/go/doctor.el` | ソース | 環境診断スクリプト |
