executable-line-validation.md•3.48 kB
# Executable Line Validation Feature
## 概要
ブレークポイントを設定できない行(空行、コメント行など)に設定しようとすると、エラーメッセージと最も近い実行可能な行を提案する機能を実装しました。
## 実装内容
### 1. 新しいユーティリティ関数(`src/mcp_debug_tool/utils.py`)
#### `get_executable_lines(file_path: Path) -> set[int]`
- Pythonの`dis`モジュールを使用してバイトコードから実行可能な行を抽出
- 空行、コメント行、実行されない構文(`else:`など)を除外
- シンタックスエラーがある場合は空のセットを返す
#### `validate_file_and_line(file_path: Path, line: int, check_executable: bool = True)`
- 従来の検証(ファイル存在、行番号範囲)に加えて、実行可能行チェックを追加
- `check_executable=True`(デフォルト)で実行可能行検証を有効化
- エラーメッセージに最も近い実行可能行を含める
#### `find_nearest_executable_line(target: int, executable_lines: set[int]) -> int | None`
- 指定した行番号に最も近い実行可能行を見つける
- ユーザーへのヘルプメッセージ生成に使用
### 2. 統合
既存の`sessions.py`では`validate_file_and_line`を呼び出しているため、自動的に新機能が有効になります。
## テスト
### ユニットテスト(12個)
- `tests/unit/test_executable_lines.py`
- 空行、コメント行、関数定義、制御構文など様々なケースをカバー
- 全テストパス ✅
### 手動テスト
```bash
uv run python manual_test/test_executable_validation.py
```
## 動作例
### ❌ 空行にブレークポイントを設定しようとした場合
```
ValueError: Line 16 does not contain executable code. Nearest executable line: 15
```
### ❌ コメント行にブレークポイントを設定しようとした場合
```
ValueError: Line 17 does not contain executable code. Nearest executable line: 18
```
### ✅ 実行可能な行にブレークポイントを設定した場合
```
Breakpoint hit successfully!
Locals captured: ['data_list', 'total', 'special_squares', 'processed_items', 'i', 'num']
```
## 利点
1. **ユーザーエクスペリエンスの向上**: 無効なブレークポイント設定を事前に防ぐ
2. **明確なエラーメッセージ**: 最も近い有効な行を提案
3. **デバッグ効率の向上**: 無駄な試行錯誤を削減
4. **後方互換性**: `check_executable=False`で従来の動作に戻せる
## バイトコードによる判定の仕組み
Pythonの`dis.findlinestarts()`は、コンパイルされたコードオブジェクトから実際にバイトコード命令が生成される行番号を抽出します。
**実行可能な行の例:**
- 変数代入: `x = 1`
- 関数呼び出し: `print("Hello")`
- ループ: `for i in range(10):`
- 条件分岐: `if x > 0:`
- return文: `return value`
**実行不可能な行の例:**
- 空行
- コメント行: `# This is a comment`
- `else:`, `elif:`, `except:`, `finally:` などの単独のキーワード行
- docstring(実行されるが停止できない)
## 制限事項
- 構文エラーがあるファイルでは実行可能行を判定できない(空セットを返す)
- マルチライン文字列の途中行など、一部のエッジケースでは判定が不正確な場合がある