Files
hakorune/tools/hako_check_deadcode_smoke.sh
nyash-codex c85d67c92e feat(hako_check): Phase 153 - Dead code detection revival (JoinIR version)
Implement comprehensive dead code detection for hako_check with JoinIR
integration, following Phase 133/134/152 box-based modularity pattern.

## Key Achievements

1. **Comprehensive Inventory** (`phase153_hako_check_inventory.md`):
   - Documented current hako_check architecture (872 lines)
   - Analyzed existing HC011/HC012 rules
   - Confirmed JoinIR-only pipeline (Phase 124)
   - Identified Phase 153 opportunities

2. **DeadCodeAnalyzerBox** (`rule_dead_code.hako`):
   - Unified HC019 rule (570+ lines)
   - Method-level + box-level dead code detection
   - DFS reachability from entrypoints
   - Text-based analysis (no MIR JSON dependency for MVP)
   - Heuristic-based false positive reduction

3. **CLI Integration** (`cli.hako`):
   - Added `--dead-code` flag for comprehensive mode
   - Added `--rules dead_code` for selective execution
   - Compatible with --format (text/json-lsp/dot)

4. **Test Infrastructure**:
   - HC019_dead_code test directory (ng/ok/expected.json)
   - `hako_check_deadcode_smoke.sh` with 4 test cases

## Technical Details

- **Input**: Analysis IR (MapBox with methods/calls/boxes/entrypoints)
- **Output**: HC019 diagnostics
- **Algorithm**: Graph-based DFS reachability
- **Pattern**: Box-based modular architecture
- **No ENV vars**: CLI flags only

## Files Modified

- NEW: docs/development/current/main/phase153_hako_check_inventory.md
- NEW: tools/hako_check/rules/rule_dead_code.hako
- MOD: tools/hako_check/cli.hako
- NEW: tools/hako_check/tests/HC019_dead_code/
- NEW: tools/hako_check_deadcode_smoke.sh
- MOD: CURRENT_TASK.md

## Next Steps

- Phase 154+: MIR CFG integration for block-level detection
- Phase 160+: Integration with .hako JoinIR/MIR migration

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 14:19:48 +09:00

90 lines
3.0 KiB
Bash

#!/usr/bin/env bash
# Phase 153: Dead Code Detection Smoke Test
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
BIN="${NYASH_BIN:-$ROOT/target/release/hakorune}"
if [ ! -x "$BIN" ]; then
echo "[ERROR] hakorune binary not found: $BIN" >&2
echo "Run: cargo build --release" >&2
exit 2
fi
echo "=== Phase 153: Dead Code Detection Smoke Test ===" >&2
# Test 1: Basic dead code detection with --dead-code flag
echo "[TEST 1] Testing --dead-code flag with dead method..." >&2
TEST1_FILE="$ROOT/tools/hako_check/tests/HC019_dead_code/ng.hako"
TEST1_OUTPUT=$(NYASH_DISABLE_PLUGINS=1 \
NYASH_BOX_FACTORY_POLICY=builtin_first \
NYASH_FEATURES=stage3 \
"$BIN" --backend vm "$ROOT/tools/hako_check/cli.hako" -- --dead-code --source-file "$TEST1_FILE" "$(cat "$TEST1_FILE")" 2>&1 || true)
if echo "$TEST1_OUTPUT" | grep -q "HC019.*unreachable method"; then
echo "[PASS] Test 1: Dead method detected" >&2
else
echo "[FAIL] Test 1: Dead method NOT detected" >&2
echo "Output: $TEST1_OUTPUT" >&2
exit 1
fi
if echo "$TEST1_OUTPUT" | grep -q "HC019.*dead static box"; then
echo "[PASS] Test 1: Dead static box detected" >&2
else
echo "[FAIL] Test 1: Dead static box NOT detected" >&2
echo "Output: $TEST1_OUTPUT" >&2
exit 1
fi
# Test 2: Clean code (no dead code)
echo "[TEST 2] Testing --dead-code flag with clean code..." >&2
TEST2_FILE="$ROOT/tools/hako_check/tests/HC019_dead_code/ok.hako"
TEST2_OUTPUT=$(NYASH_DISABLE_PLUGINS=1 \
NYASH_BOX_FACTORY_POLICY=builtin_first \
NYASH_FEATURES=stage3 \
"$BIN" --backend vm "$ROOT/tools/hako_check/cli.hako" -- --dead-code --source-file "$TEST2_FILE" "$(cat "$TEST2_FILE")" 2>&1 || true)
if echo "$TEST2_OUTPUT" | grep -q "HC019"; then
echo "[FAIL] Test 2: False positive detected" >&2
echo "Output: $TEST2_OUTPUT" >&2
exit 1
else
echo "[PASS] Test 2: No false positives" >&2
fi
# Test 3: --rules dead_code flag
echo "[TEST 3] Testing --rules dead_code..." >&2
TEST3_OUTPUT=$(NYASH_DISABLE_PLUGINS=1 \
NYASH_BOX_FACTORY_POLICY=builtin_first \
NYASH_FEATURES=stage3 \
"$BIN" --backend vm "$ROOT/tools/hako_check/cli.hako" -- --rules dead_code --source-file "$TEST1_FILE" "$(cat "$TEST1_FILE")" 2>&1 || true)
if echo "$TEST3_OUTPUT" | grep -q "HC019"; then
echo "[PASS] Test 3: --rules dead_code works" >&2
else
echo "[FAIL] Test 3: --rules dead_code did not work" >&2
echo "Output: $TEST3_OUTPUT" >&2
exit 1
fi
# Test 4: JSON-LSP format with --dead-code
echo "[TEST 4] Testing JSON-LSP format with --dead-code..." >&2
TEST4_OUTPUT=$(NYASH_DISABLE_PLUGINS=1 \
NYASH_BOX_FACTORY_POLICY=builtin_first \
NYASH_FEATURES=stage3 \
NYASH_JSON_ONLY=1 \
"$BIN" --backend vm "$ROOT/tools/hako_check/cli.hako" -- --format json-lsp --dead-code "$TEST1_FILE" 2>/dev/null || true)
if echo "$TEST4_OUTPUT" | grep -q '"rule":"HC019"'; then
echo "[PASS] Test 4: JSON-LSP format works" >&2
else
echo "[FAIL] Test 4: JSON-LSP format did not work" >&2
echo "Output: $TEST4_OUTPUT" >&2
exit 1
fi
echo "" >&2
echo "=== All Dead Code Detection Tests Passed ===" >&2
exit 0