Files
hakorune/tools/hako_check
nyash-codex 3d366f5cb8 Implement HC018: Top-level local declaration detection
## Overview
Detects top-level `local` declarations (outside of methods/boxes), which are cleanup omissions in Hakorune code.

## Implementation Details
- **Rule**: `rule_top_level_local.hako` following box principles
- **Detection Method**: Text-based scanning with context tracking
  - Tracks box/method entry/exit via brace depth
  - Identifies `local` statements outside method scope
  - Filters out comments (lines starting with `//`)
- **Integration**: Added to cli.hako in text-based rules section

## Technical Approach
- **Context Tracking**: Maintains `in_box` and `in_method` flags
- **Brace Depth Counter**: Tracks `{` and `}` to determine scope boundaries
- **Line-by-line Analysis**: Checks each line for `local ` prefix when not in method
- **Comment Filtering**: Ignores commented-out local declarations

## Test Cases
- **ok.hako**: All `local` declarations inside methods → no warnings
  - Helper.calculate() and Helper.process() both referenced from Main.main()
  - Avoids HC011 (unreachable method) warnings
- **ng.hako**: Top-level `local global_temp` outside any method → HC018 warning

## Test Results
```
[TEST/OK] HC011_dead_methods
[TEST/OK] HC012_dead_static_box
[TEST/OK] HC013_duplicate_method
[TEST/OK] HC014_missing_entrypoint
[TEST/OK] HC016_unused_alias
[TEST/OK] HC017_non_ascii_quotes
[TEST/OK] HC018_top_level_local ← NEW
[TEST/SUMMARY] all green
```

## Diagnostic Format
```
[HC018] top-level local declaration (not allowed): <path>:<line>
```

## Architecture
- Box-first design: RuleTopLevelLocalBox with single responsibility
- Helper methods: _trim(), _is_comment(), _split_lines(), _itoa()
- Clean separation of concerns: parsing, context tracking, reporting

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 03:14:22 +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.