2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rust+LLVMでコンパイラを作る:#6 エラー表示の整備

Posted at

本連載のバックナンバー

はじめに

この連載も1年ぶりになってしまいました。
今回はリポジトリのメンテナンスも兼ねて、ちょっとした作業を行っておきます。
具体的には、今まではエラーを扱うために、定番である anyhow を使用していましたが、将来を考えて mietteというライブラリへの差し替えを行います。

miettethiserroranyhow との高い互換性があり、かつ美しくユーザフレンドリなエラー表示を行ってくれるライブラリです。

その前にまずは恒例となった、リポジトリが使用するLLVMの更新を行いましょう。

(ほぼ)最新のLLVMへのアップデート

2024-12-31現在、LLVMは19が最新版ですが、使用しているLLVMラッパーであるinkwellが未サポートです。

LLVM19をサポートするPRが送られてはいるので、これがマージされるまではLLVM18を使用することにしましょう。

Cargo.tomlinkewll の行を以下のように変更します。

inkwell = { version = "0.5.0", features = ["llvm18-0"] }

また、LLVMのバージョンを上げたことにより、deprecation warningが発生しています。その対応としてcodegen.rs の 56行目の .i8_type() を行ごと消しておきます。

これが終わったら miette の追加です。

miette の追加

mietteanyhow との高い互換性を維持しており、機械的な置き換えと多少の修正だけで anyhow からの乗り換えが完了します。

まず Cargo.tomlanyhow の行を消し、その代わりに以下の行を追加します。

miette = { version = "7.4.0", features = ["fancy"] }

また、すべてのコードの

use anyhow::{anyhow, Result};

という行(anyhowResultが逆になっているところもあるかもしれません)を

use miette::{miette, Result, IntoDiagnostic};

に書き換えます。

次に、コード中の anyhow という文字列を miette という文字列に一括置換します。そして最後に、エディタ上でエラーになっている ?.into_diagnostic()? で置き換えるだけで、とりあえずの乗り替えが完了します。

終わりに

今回は久々ということで、リポジトリのメンテナンスだけに終始してしまいました。
次回以降で気が向いたら、エラー箇所の表示やそのための各 Node のコード上での位置の保存など、この miette の長所を生かすような変更をいれたいと思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?