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>
90 lines
3.0 KiB
Bash
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
|