Нормальный вывод ошибок с proc macro attribute [Rust]
Я делал свои собственные макросы-атрибуты, и заметил проблему.
При добавлении макроса
#[GET("/")]
fn index() {
load!("../static/index.html")
}
С появлением ошибки, она скрывается за макросом, без точного вывода строки и места с ошибкой
error[E0308]: mismatched types
--> src\main.rs:3:1
|
3 | #[GET("/")]
| ^^^^^^^^^^^
| |
| expected `u8`, found `&str`
| expected due to this
|
= note: this error originates in the attribute macro `GET` (in Nightly builds, run with -Z macro-backtrace for more info)
Какими средствами можно это исправить?
Ответы (1 шт):
Я понял что не так.
В реализации макроса, я несколько раз конвертировал ввод между типами String/TokenStream. От этого вывод считался компилятором ошибкой в РЕАЛИЗАЦИИ макроса, а не в его вводе.
Во избежание этого, нужные части Block храните в исходном виде. А нужные реализации можно модифицировать через парсинг в структуры с syn.
Но при этом даже после парсинга в структуру из syn, и последующим конвертацией через quote!, трейсинг ошибок остается, и ошибки в блок-кодах выводиться правильно.
Поэтому стоит частично отказаться от злоупотреблением Regex, в пользу ручной конфигурации.