hikari 静的検査 (hikari check) 仕様
本書は hikari check の仕様を定める。起動ディスパッチ全体と終了コードの共通表は hikari-command.md、検査そのものの規則は static-analysis.md を参照。
指定した各 .hikari を起点 (entry) に、評価せず 静的検査 (static-analysis.md §1) のみを実行する。entry とそこから到達可能なモジュールグラフ全体を構文検査し、結果に応じた終了コードを返す。CI や保存時フックでの利用を想定する。check / fmt / lint の住み分けは hikari-command.md §1.2。
構文
hikari check [--strict] <path>...
引数は .hikari ファイルまたはディレクトリを 1 個以上。ディレクトリは配下の .hikari を再帰収集する (fmt (format.md) / lint (lint.md) と同じパス展開)。収集した各ファイルをそれぞれ entry として検査する。1 件の検査単位は到達可能なモジュールグラフ全体であり、lint の「ファイル単位・import 解決なし」とは異なる (hikari-command.md §1.2)。
検査内容
ファイル実行 (hikari-command.md §5) の開始前に走るものと同一の検査 (同じ internal/analyze)。検出対象は static-analysis.md §1 を参照。
hikari check は構文・import 解決層 (前段) に加えて、健全な静的型検査 (static-analysis.md §2) を行う。検出するのは「実行すれば確実に型不一致 panic になる」ことが静的に確定する箇所だけで (誤検出を出さない)、確定しない箇所は素通しする (漸進的型付け)。関数結果の越境照合 (再帰関数を含む。static-analysis.md §2.13/§2.17)・演算子レベルの型不一致 (同 §2.8〜§2.10)・型注釈位置の未定義型名 (同 §2.2) も通常モードの検出対象に含む。残る将来段階・対象外は static-analysis.md §2.17 を参照。型検査は hikari check と LSP 診断でのみ走り、通常モードの hikari <path> / hikari build には適用しない (実行時照合が backstop)。
strict 型検査 (--strict)
hikari check --strict <path>... は、「検査内容」の健全・漸進検査に strict 規則 (static-analysis.md §3) を上乗せして検査する。越境・契約まわりで追加検出するのは次の 3 点:
- 名前付き関数の結果型の暗黙 Any を禁止: 名前に束縛された関数 (body 非空) で、結果型注釈を省略して本体推論がネスト位置に `Any` を含む (
List(Any)・Result(Any)・record の Any フィールド等。空[]/extensible[]が該当。bare な top-levelAnyは規則 13 と同じく対象外) と型エラー。Anyを意図する場合は束縛注釈add: {Int, Int | Any} := …/内部名注釈{ inner self: {Int, Int | Any} | … }で明示すればオプトインとして許容し、body 末尾アスクリプション{x, y | expr: Any}のAnyは禁止する (language-spec.md §17.3・許否は static-analysis.md §3 のマトリクス)。 - 名前付き関数のパラメータ型必須化: 名前に束縛された関数 (body 非空) の各パラメータ型が、インライン注釈・宣言関数型の対応位置 (非
Any)・推論可能なデフォルトのいずれでも確定しなければ型エラー。インラインx: Anyは動的型へのオプトインとして充足する (型変数の無い hikari で真に多相な関数を書く唯一の手段)。bare パラメータと関数型注釈位置のAnyは充足とみなさない (static-analysis.md §3)。 - 宣言結果型を契約とした越境照合: 完全適用
f(args)の結果型を宣言から確定し、x: T := f(args)等の照合に用いる。
加えて、分岐の収束系診断 (static-analysis.md §3 規則 (4)-(6)) も strict で報告する: if/match の分岐結果型が確実に割れる場合、closed variant の match の被覆漏れ (非網羅)、および到達しえないアーム・冗長な catch-all (不要 default)。
strict は hikari <path> --strict (hikari-command.md §5.5) と同じ規則。実効 strict もファイル単位で、entry が header #{hikari strict} / #[hikari strict] を宣言していれば --strict 無しでもその entry は strict として検査される (実効 strict = 「CLI --strict」OR「entry header の strict 属性」)。複数 entry のときは entry ごとに独立に判定する。診断・終了コードの形式は「出力と終了コード」と同じ (型エラーは exit 1)。LSP は hikari lsp --strict (lsp.md「起動」)、ビルドは hikari build --strict (build.md「strict 型検査」) で strict 診断に対応する。
import 解決規則はファイル実行 (hikari-command.md §5.3) と同じ (caller ディレクトリ基準、OS filepath ベース)。各 entry は独立に検査するため、複数 entry が同じモジュールを import する場合そのモジュールは複数回検査される (診断は冪等)。
出力と終了コード
- 全 entry の検査がクリーンな場合は 何も出力せず exit code
0。 - 静的エラーがある場合は各診断を
<file>:<line>:<col>: <msg>形式で stderr に出す。 - 複数 entry のときは全 entry を検査し、終了コードはそれらの最大値を返す (いずれかに静的エラーがあれば
1、いずれかの読み取りに失敗すれば2)。
| 状況 | code |
|---|---|
| 静的エラーなし | 0 |
| 静的エラーあり | 1 |
読み取り失敗 / 引数不正 / .hikari 不在 |
2 |