Skip to content

エラーコード仕様

Strand のコンパイラ(@strand/compiler)が報告する診断は、パースエラー型検査エラーの 2 系統に分かれる。本書は両者を正規(normative)に列挙する。実装側でコードを追加・変更した場合は、本書も同時に更新しなければならない。

エラーの形

型検査エラーは StrandError として表現される:

ts
type StrandError = {
  code: string;   // "E0103" のような安定識別子
  kind: string;   // "undef-slot" のような機械可読な分類
  message: string; // 人間向けメッセージ(対象名を含む)
  pos: Pos;        // { line, col }
};

code は永続的な契約であり、一度割り当てたら意味を変えない。kind は同一 code 配下の細分類で、診断ロジックの分岐に使う。

パースエラーは ParseErrormessage + pos)として throw される。パース段は最初のエラーで停止するため、コードは付与されない。

コード体系

領域
E00xxアプリ構造(ルーティングの必須要件など)
E01xx名前解決(未定義の参照)
E02xx型の不一致
E03xxケイパビリティと純粋性
E06xxreducer の書き込み規則
E07xxアクセシビリティ(a11y)
E08xxランタイムハザード(コンパイルは通るが実行で壊れる書き方)

E00xx — 構造

E0001 missing-404

app.routes を宣言したアプリは、/404 パターンのルートを必ず含めなければならない。未マッチのパスはここへフォールバックする。

app.routes must include a "/404" entry

修正route "/404" -> NotFound のような 404 用 tile へのルートを追加する。詳細は ./routing.md

E01xx — 名前解決

E0102 undef-reducer

イベントハンドラ引数 / prop が、存在しない reducer 名を指している。

Reference to undefined reducer "<name>"

修正:reducer 名の綴りを確認する。strand fix が近い名前を提案できる(→ ./ai-edit.md)。

E0103 undef-ref / undef-slot

  • undef-ref:式中で未定義の名前を参照した。

    Reference to undefined name "<name>"

  • undef-slot:reducer 本体で未定義の slot へ代入した。

    Assignment to undefined slot "<name>"

修正:参照先の slot / 束縛が宣言済みか確認する。

E0104 undef-effect

emit の対象が未定義の effect を指している。

Reference to undefined effect "<name>"

E0105 undef-tile

tile 参照、またはルート定義のターゲットが未定義の tile を指している。

Reference to undefined tile "<name>"Route "<path>" targets undefined tile "<name>"

E02xx — 型

E0201 type-mismatch

イベントハンドラの引数 / prop が reducer 名でなければならないのに、別種の値だった。

Event handler arg "<name>" must be a reducer nameEvent handler prop "<name>" must be a reducer name

E03xx — ケイパビリティと純粋性

E0301 missing-capability

effect が要求するケイパビリティが app.caps で宣言されていない。

Effect "<effect>" requires capability "<cap>" which is not declared in app.caps

修正app.caps に必要なケイパビリティを追加する。能力モデルの詳細は ./lifecycle.md

E0305 fn-impurity

fn(純粋関数)が slot を読み取っている。fn は引数のみに依存しなければならない。

fn "<name>" must not read slot "<name>"

修正:必要な slot 値を引数として渡す。

E06xx — reducer の書き込み規則

E0601 duplicate-write

同一 reducer 内で、同じ slot パス形状(lvalue shape)へ複数回書き込んでいる。1 reducer 1 書き込み(パス形状粒度)の規則に反する。

Slot path "<shape>" is written more than once in this reducer

補足:粒度はパス形状である。issues[id].statusissues[id].updatedAt は別形状とみなされ共存できるが、count への二重代入は禁止される。理由は ../design-notes/rationale.md

E07xx — アクセシビリティ(a11y)

a11y 検査は check(program, { strictA11y: true }) で有効化される。

E0701 a11y-button

button must have a text= argument or aria-label prop

E0702 a11y-image

image must have an alt prop

link must have inner text or aria-label

修正:可視テキストか、aria-label / alt を付与する。フォーム全般の指針は ./forms.md

E08xx — ランタイムハザード

型は通るが実行時に壊れる「書き方」を、check の段階で静的に捕まえるための帯。検証の3層モデルは ./testing.md §8.10 を参照。

E0801 unimplemented-method

obj.method(...) 形式のメソッド呼び出しが、ランタイム/コード生成の実装するメソッド集合に存在しない。綴り間違い(.fitler)や、仕様には載っていても未実装のメソッド、別の型のメソッドの誤用(Option.to-result など)で起こる。

Method ".<name>" is not implemented by the runtime

補足:実装されているメソッド集合は @strand/compilerKNOWN_METHODS(コード生成の methodCallJs と同期)が唯一の正。引数なしメソッドを () 付きで呼んだ場合もこの帯で捕捉される。標準ライブラリのメソッド一覧は ./stdlib.md

修正:正しいメソッド名に直すか、その操作を match / fold など実装済みの手段で書き換える。未実装の仕様メソッドが必要なら、packages/ に実装して examples/ に動く例を足す。