コンテンツにスキップ

11. Lint と制約検証

コンパイラは行番号付きの警告/エラーを返します。エラー報告の形式と粒度は仕様のファーストクラスの 要素で、メッセージは自己修正ループに乗る形でなければなりません (評価フレームワーク)。 「何が間違っているか / ターゲットで有効な候補 / 推奨される修正」の三つ組です。

  • 構文: 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 な修正案と 有効候補の全集合の両方を出力でカバーする形になります。

--format json 出力は所見ごとに以下の形のオブジェクトを 1 件返します。

フィールド備考
codestring安定した E_* / W_* 識別子。gcc スタイル出力と同じ文字列。
severitystring"error" または "warning"
lineintegerプライマリスパン先頭バイトの 1-based 行番号。
colinteger同先頭バイトの 1-based カラム (Unicode スカラー値で計上)。
end_lineintegerスパン終端 (排他) の 1-based 行番号。
end_colintegerスパン終端 (排他) の 1-based カラム。
primarystringテキスト出力でコードの後ろに続く人間向けメッセージ。
notesarray[{line?, col?, message}] 形式。任意 — 空のときはキーごと省略。
dataobject構造化ペイロード — 後述。任意 — 未指定のコードでは省略。

data はコードごとに開かれたオブジェクトで、kind で判別します。特定のキー集合に依存する消費者は primary を解析するのではなく (code, data.kind) で照合してください。コード追加は厳密に additive (既存出力は変えない) なので、未知の kind 値は失敗にせず無視する実装にしてください。 現時点のエントリ:

コードdata ペイロード
W_WALKWAY_BLOCKED{ "kind": "walkway_blocked", "skipped": <u64> } — L 字経路で既存構造と衝突してスキップされたセル数。

上の表に載っていないコードは data をまるごと省略します (JSON でも null ではなくキーごと存在しません)。 診断面の安定化に合わせて、data の新エントリは対応するコードと同時に追加されます。

  • 放置すると意図しない結果になるもの (概念の不在、未知 ID、ドメイン外の状態) は エラー (サイレント 置換と暗黙の削除は禁止)。
  • バージョン/エディション間の意味ドリフト、レッドストーン挙動の非保証などは 警告
  • autofix を提供するかは実装で定義します。

ゲーム内制約 (重力ブロック、取り付け条件、流体挙動、許容されない組み合わせなど) はカタログ化し、 バージョンごとに管理します (バージョンとエディション)。「額縁はガラス に掛けられない」のような制約はここに入ります。