Files
hakorune/tools/hako_check
nyash-codex e948bcb4f8 feat(hako_check): Phase 154-170 hako_check dead code detection & JSON library design
🎉 Phase 154-170 完了!hako_check に死んだコード検出を統合

📋 Phase 154: MIR CFG 統合 & HC020 設計
- DeadBlockAnalyzerBox(570行) - 箱化モジュール化
- ブロックレベルの unreachable 検出設計
- テストケース4本、スモークテスト

🔧 Phase 155: MIR CFG データブリッジ(MVP)
- src/runner/mir_json_emit.rs: MIR JSON に CFG を追加
- tools/hako_check/analysis_consumer.hako: 空のCFG構造体追加
- Phase 156 の準備完成

🌉 Phase 156: hako_check MIR パイプライン統合
- hako_check.sh: MIR JSON 生成ステップ追加
- cli.hako: --mir-json-content 引数処理
- analysis_consumer.hako: ~320行の手動JSON パーサー実装
- HC020 が実際にブロックを検出!

📐 Phase 170: .hako JSON ライブラリ設計
- 既存 JSON 利用箇所インベントリ(Program/MIR/CFG)
- Phase 156 JSON パーサの詳細分析(289行)
- JsonParserBox API 草案確定
- 利用予定マッピング(96%削減見込み)

🏗️ 設計原則:
- 箱化モジュール化パターン(Phase 153継承)
- Rust 層変更最小化(.hako + シェルスクリプト優先)
- セルフホスティング対応設計

📊 期待効果:
- hako_check JSON パーサ: 289行 → ~10行(96%削減)
- JsonParserBox 共通ライブラリ化(Phase 171+)
- hako_check/selfhost/デバッグツール で共通利用

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 16:16:56 +09:00
..

Hako Check — Diagnostics Contract (MVP)

This tool lints .hako sources and emits diagnostics.

Diagnostics schema (typed)

  • Map fields:
    • rule: string like "HC011"
    • message: string (human-readable, one line)
    • file: string (path)
    • line: int (1-based)
    • severity: string ("error"|"warning"|"info"), optional (default: warning)
    • quickFix: string, optional

Backwards compatibility

  • Rules may still out.push("[HCxxx] ...") with a single-line string.
  • The CLI accepts both forms. String diagnostics are converted to typed internally.

Suppression policy

  • HC012 (dead static box) takes precedence over HC011 (unreachable method).
  • If a box is reported by HC012, HC011 diagnostics for methods in that box are suppressed at aggregation.

Quiet / JSON output

  • When --format json-lsp is used, output is pure JSON (pretty). Combine with NYASH_JSON_ONLY=1 in the runner to avoid extra lines.
  • Non-JSON formats print human-readable lines per finding.

Planned AST metadata (parser_core.hako)

  • boxes[].span_line: starting line of the static box declaration.
  • methods[].arity: parameter count as an integer.
  • boxes[].is_static: boolean.

Notes

  • Prefer AST intake; text scans are a minimal fallback.
  • For tests, use tools/hako_check/run_tests.sh.

Analyzer policy (plugins)

  • Tests/CI/Analyzer run without plugins by default: NYASH_DISABLE_PLUGINS=1 and NYASH_JSON_ONLY=1.
  • File I/O is avoided by passing source text via --source-file <path> <text>.
  • When plugins are needed (dev/prod), set NYASH_FILEBOX_MODE=auto and provide [libraries] in nyash.toml.

Default test env (recommended)

  • NYASH_DISABLE_PLUGINS=1 avoid dynamic plugin path and noise
  • NYASH_BOX_FACTORY_POLICY=builtin_first prefer builtin/ring1 for stability
  • NYASH_DISABLE_NY_COMPILER=1 and HAKO_DISABLE_NY_COMPILER=1 disable inline compiler in tests
  • NYASH_JSON_ONLY=1 stdout is pure JSON (logs go to stderr)

Known Limitations

HC017: Non-ASCII Quotes Detection (Temporarily Skipped)

Status: ⏸️ Skipped until UTF-8 support is available

Reason: This rule requires UTF-8 byte-level manipulation to detect smart quotes (" " ' ') in source code. Nyash currently lacks:

  • Byte array access for UTF-8 encoded strings
  • UTF-8 sequence detection capabilities (e.g., detecting 0xE2 0x80 0x9C for ")
  • Unicode character property inspection methods

Technical Requirements: One of the following implementations is needed:

  • Implement ByteArrayBox with UTF-8 encoding/decoding methods (to_bytes(), from_bytes())
  • Add built-in Unicode character property methods to StringBox (e.g., is_ascii(), char_code_at())
  • Provide low-level byte access methods like string.get_byte(index) or string.byte_length()

Re-enable Timeline: Planned for Phase 22 (Unicode Support Phase) or when ByteArrayBox lands

Test Files:

Implementation File: rules/rule_non_ascii_quotes.hako - Currently returns 0 (disabled) in _has_fancy_quote()

Current Workaround: The test is automatically skipped in run_tests.sh to prevent CI failures until UTF-8 support is implemented.


Rules

  • Core implemented (green): HC011 Dead Methods, HC012 Dead Static Box, HC015 Arity Mismatch, HC016 Unused Alias, HC018 Toplevel local, HC021 Analyzer IO Safety, HC022 Stage3 Gate, HC031 Brace Heuristics
  • Temporarily skipped: HC017 NonASCII Quotes (UTF-8 support required)
  • Pending fixtures update: HC013 Duplicate Method, HC014 Missing Entrypoint

CLI options

  • --rules a,b,c limit execution to selected rules.
  • --skip-rules a,b skip selected.
  • --no-ast (default) avoids AST parser; --force-ast enables AST path (use sparingly while PHI is under polish).

Tips

  • JSON-only output: set NYASH_JSON_ONLY=1 to avoid log noise in stdout; diagnostics go to stdout, logs to stderr.
  • For multiline --source-file payloads, CLI also provides HEX-escaped JSON in NYASH_SCRIPT_ARGS_HEX_JSON for robust transport; the VM prefers HEX→JSON→ARGV.