Files
hakorune/tools/hako_check_deadcode_smoke.sh

90 lines
3.0 KiB
Bash
Raw Permalink Normal View History

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
#!/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