11. Lint と制約検証
コンパイラは行番号付きの警告/エラーを返します。エラー報告の形式と粒度は仕様のファーストクラスの 要素で、メッセージは自己修正ループに乗る形でなければなりません (評価フレームワーク)。 「何が間違っているか / ターゲットで有効な候補 / 推奨される修正」の三つ組です。
11.1 カテゴリ
Section titled “11.1 カテゴリ”- 構文: parse / 型 /
key=valueの妥当性。 - ジオメトリ: AABB 展開で「壁の外の窓」「空中に浮くドア」などを検出。
- attachment: 額縁/絵画/看板/ボタン/レバー/松明が有効な取り付け面に乗っているか (空気への取り 付けを検出)。
- entity_aabb: armor_stand/villager/display が壁/通路にめり込んでいないか、ドアの開閉弧を塞いで いないか、エンティティの過密 (密度)。
- support: 吊りランタン、松明、キャンプファイア、砂利などの重力ブロックの支持条件。
- fluid: 水源 / 流れ / waterlogged の整合性。
- version_caps / parity: 状態/エンティティのスキーマがターゲットで使えるか (バージョンとエディション)。
- edit_stability:
intent_stateの変更が無関係なメンバのresolved_stateに波及しないか。 - redstone: 合成された回路を tick 単位でシミュレートし、宣言された真理値表/時相アサーションと 突き合わせる。タイミング衝突、QC 依存、配線輻輳 (レッドストーン)。
- AABB 干渉: 重なった場合は優先マージか lint エラーで拒否する。境界ブロックステートの再解決 (内角階段など) は IR 層の責務。
クローズドな語彙に対して識別子を拒絶する診断 (未知の文キーワード、未知の mat_slot= 名、未知の
--target バージョン) には、入力長でスケールする Damerau-Levenshtein 距離 (1〜3 文字なら 1 編集
以下、4〜6 文字なら 2、それ以上は 3) の閾値内に候補があるとき did you mean \X`?の note を 付与します。閾値を超える場合はexpected one of: …` の候補列挙だけが残り、targeted な修正案と
有効候補の全集合の両方を出力でカバーする形になります。
11.2 機械可読ペイロード
Section titled “11.2 機械可読ペイロード”--format json 出力は所見ごとに以下の形のオブジェクトを 1 件返します。
| フィールド | 型 | 備考 |
|---|---|---|
code | string | 安定した E_* / W_* 識別子。gcc スタイル出力と同じ文字列。 |
severity | string | "error" または "warning"。 |
line | integer | プライマリスパン先頭バイトの 1-based 行番号。 |
col | integer | 同先頭バイトの 1-based カラム (Unicode スカラー値で計上)。 |
end_line | integer | スパン終端 (排他) の 1-based 行番号。 |
end_col | integer | スパン終端 (排他) の 1-based カラム。 |
primary | string | テキスト出力でコードの後ろに続く人間向けメッセージ。 |
notes | array | [{line?, col?, message}] 形式。任意 — 空のときはキーごと省略。 |
data | object | 構造化ペイロード — 後述。任意 — 未指定のコードでは省略。 |
data はコードごとに開かれたオブジェクトで、kind で判別します。特定のキー集合に依存する消費者は
primary を解析するのではなく (code, data.kind) で照合してください。コード追加は厳密に
additive (既存出力は変えない) なので、未知の kind 値は失敗にせず無視する実装にしてください。
現時点のエントリ:
| コード | data ペイロード |
|---|---|
W_WALKWAY_BLOCKED | { "kind": "walkway_blocked", "skipped": <u64> } — L 字経路で既存構造と衝突してスキップされたセル数。 |
上の表に載っていないコードは data をまるごと省略します (JSON でも null ではなくキーごと存在しません)。
診断面の安定化に合わせて、data の新エントリは対応するコードと同時に追加されます。
11.3 エラーと警告の区分
Section titled “11.3 エラーと警告の区分”- 放置すると意図しない結果になるもの (概念の不在、未知 ID、ドメイン外の状態) は エラー (サイレント 置換と暗黙の削除は禁止)。
- バージョン/エディション間の意味ドリフト、レッドストーン挙動の非保証などは 警告。
- autofix を提供するかは実装で定義します。
11.4 制約カタログ
Section titled “11.4 制約カタログ”ゲーム内制約 (重力ブロック、取り付け条件、流体挙動、許容されない組み合わせなど) はカタログ化し、 バージョンごとに管理します (バージョンとエディション)。「額縁はガラス に掛けられない」のような制約はここに入ります。