| name | compile-fix |
| description | Flixコンパイルエラーを診断し、既知の落とし穴と照合して修正を提案する |
| allowed-tools | Read, Grep, Glob, Bash |
Flix コンパイルエラー診断
コンパイルエラーが発生した場合、このスキルで原因を特定し修正する。
手順
- エラーメッセージを確認する(ユーザー提示 or
devbox run -- java -jar bin/flix.jar test を実行)
- 下記の「既知の落とし穴リスト」と照合する
- 該当する場合は修正方法を提示する
- 該当しない場合は、エラー箇所のコードを読んで一般的な診断を行う
既知の落とし穴リスト(Flix 0.71.0)
1. 予約語の使用(パースエラー)
症状: Unexpected token / Parse error が変数名や import 文で発生
原因: Flix の予約語を識別子として使っている
予約語一覧(特にハマりやすいもの):
handler — エフェクトハンドラで使用
do — エフェクト呼び出しで使用
resume — エフェクトハンドラで使用
spawn — 並行処理で使用
region — リージョンで使用
inject / project / solve — Datalog で使用
修正: 別の単語を使うか、2単語以上で命名する(例: handler → actionHandler, eventAction)
2. import の位置(スコープエラー)
症状: Java クラスが見つからない / Unresolved type
原因: Java の import がモジュールのトップレベルにない
修正: import 文をモジュール直下(関数の外)に移動する
mod MyModule {
import java.util.ArrayList // ← ここに書く
pub def foo(): ... =
// import をここに書くとエラー
...
}
3. Channel API の引数(型エラー)
症状: Channel.buffered で型が合わない / Region 関連エラー
原因: 0.71.0 では Channel.buffered(size) は Region を受け取らない
修正: Channel.buffered(rc) → Channel.buffered(size) に変更。戻り値は (Sender[t], Receiver[t])。
4. try-catch の例外型(型エラー)
症状: ##java.io.IOException が見つからない
原因: 0.71.0 では ## プレフィックスは不要。import してからクラス名で使う。
修正:
import java.io.IOException
try { ... } catch {
case _: IOException => ...
}
5. レコード更新の構文(型エラー)
症状: レコードのフィールド更新で型が合わない
原因: Flix のレコード更新は {field = newValue | record} だが、型が異なると動かない
修正: レコード更新構文のパイプ右側がレコード変数であること、型が一致することを確認。
6. エフェクトの伝播忘れ(型エラー)
症状: 関数の戻り値型でエフェクトが合わない
原因: 呼び出し先のエフェクトを関数シグネチャに含めていない
修正: 関数の型注釈にエフェクトを追加する(\ IO + ef など)。不明なら型注釈を外して推論に任せる。
7. パターンマッチの網羅性(警告/エラー)
症状: Non-exhaustive match
原因: enum の全ケースを網羅していない
修正: 不足している case を追加するか、case _ => を追加。
8. List/Set/Map リテラルの型推論失敗
症状: Unable to unify / 空リテラルで型が決まらない
原因: Nil や Set.empty() だけでは型が推論できないことがある
修正: 型注釈を付ける(例: (Nil: List[Int32]))、または要素付きで初期化。
9. NodeKind のパターンマッチ不一致
症状: SceneTree の Node 操作で型エラー
原因: NodeKind の case と実際のデータ型が不一致
修正: SceneTree.flix の NodeKind enum を確認して正しい case とデータ型を使う。
10. Float32 リテラルのサフィックス忘れ
症状: Expected Float32 but got Float64
原因: 1.0 は Float64。Float32 が必要な箇所では 1.0f32 と書く必要がある。
修正: 全ての浮動小数点リテラルに f32 サフィックスを付ける。
一般的な診断フロー
上記に該当しない場合:
- エラーメッセージの行番号から該当ファイルを
Read で確認
- 型エラーの場合 → 関連する型定義を
Grep で探す
- 未解決シンボルの場合 →
Glob + Grep で定義箇所を探す
- 修正案を提示し、
/verify で確認する