Описание тега rust-proc-macros

Используйте этот тег для вопросов о процедурных макросах, объявленных в ящиках типа proc-macro языка программирования Rust.
1 ответ

Конвертировать строку в TokenStream

Учитывая строку (str), как можно преобразовать это в TokenStream в ржавчине? Я пытался использовать quote! макро. let str = "4"; let tokens = quote! { let num = #str; }; // #str is a str not i32 Цель здесь - сгенерировать токены для некоторой неизве…
13 янв '19 в 00:28
1 ответ

Зависимость циклического пакета при реализации макроса proc

Я пытаюсь реализовать proc_macro Dump, который похож на serdes Serialize, Для этого у меня есть ящик foo который содержит мои "примитивные" структуры (P1 а также P2 в этом случае), который должен быть только самосвальным. Далее у меня есть foo_deriv…
08 янв '19 в 08:50
1 ответ

Как использовать пользовательский атрибут пространства-имени для макроса имен вместо типа внутри?

Я хотел бы создать собственный макрос-наследник, который использует новый синтаксис пространства имен: example::attr, Я смог заставить это работать с атрибутами в типе (например, в структурном поле или варианте enum), но не при применении к самому т…
27 фев '19 в 16:36
3 ответа

Как сообщить об ошибках в процедурном макросе, используя макрос цитаты?

Я пишу процедурный макрос, который работает нормально, но у меня возникают проблемы с сообщениями об ошибках эргономичным способом. С помощью panic! "работает", но не элегантно и не отображает сообщение об ошибке для пользователя. Я знаю, что могу с…
1 ответ

Невозможно вызвать функциональный процедурный макрос: не может быть расширен до операторов

Я пытаюсь разобраться в функциональных процедурных макросах и борюсь с основами. Для начала я попытался создать макрос, который просто печатает все токены и ничего не делает: extern crate proc_macro; extern crate syn; use proc_macro::TokenStream; #[…
14 янв '19 в 00:03
1 ответ

Что это за странный синтаксис, когда вариант enum используется как функция?

Ниже приведен пример, приведенный в документации мода syn::parse, enum Item { Struct(ItemStruct), Enum(ItemEnum), } struct ItemStruct { struct_token: Token![struct], ident: Ident, brace_token: token::Brace, fields: Punctuated<Field, Token![,]>…
21 фев '19 в 08:02
2 ответа

Как программно получить количество полей структуры?

У меня есть пользовательская структура, как показано ниже: struct MyStruct { first_field: i32, second_field: String, third_field: u16, } Можно ли получить число структурных полей программно (как, например, с помощью вызова метода) field_count()): le…
14 янв '19 в 07:44
0 ответов

Как определить свойства компиляции в процедурном макросе?

Я работаю над процедурным макросом, который выполняет много работы, которая может значительно замедлить компиляцию. Проделанная работа не влияет на семантику функции; то есть, если дан тот же набор аргументов, возвращаемое значение не изменяется в з…
21 май '19 в 06:01
1 ответ

Как сделать так, чтобы мой собственный производный макрос принимал общие параметры черты?

Я пытаюсь реализовать пользовательские макросы для своих черт, и они действительно работают! Однако у меня есть небольшая проблема. Я не могу найти способ включить общие параметры в черту. В частности, я хочу сделать что-то вроде этого: #[derive(MyC…
17 май '19 в 14:40
0 ответов

Какое подходящее место для хранения процедурных макро-артефактов, чтобы они были очищены с помощью функции "Очистка груза"?

Я работаю над процедурным макросом, которому нужно место для хранения состояния в системе, где он запускается. Государство должно быть очищено, когда cargo clean это запустить. В прошлом я предполагал, что target каталог это правильное место. Тем не…
20 май '19 в 06:36
2 ответа

Как я могу получить T из Option<T> при использовании syn?

Я использую syn разобрать код Rust. Когда я читаю тип именованного поля, используя field.tyЯ получаю syn::Type, Когда я печатаю это с помощью quote!{#ty}.to_string() я получил "Option&lt;String&gt;", Как я могу получить только "String"? Я хочу испол…
20 мар '19 в 23:56
1 ответ

Можно ли определить, является ли поле определенного типа или реализует определенный метод в процедурном макросе?

Я создал процедурный макрос, который реализует черту, но чтобы это работало, мне нужно получить необработанные байты для каждого поля. Проблема в том, как получить байты поля отличается в зависимости от типа поля. Есть ли способ проверить, существуе…
01 апр '19 в 08:53
2 ответа

Как найти правильный тип возвращаемого значения для syn::parse?

У меня есть TokenStream это происходит из определения функции Rust. Я хочу разобрать это с syn::parse (а также .unrwap()). Однако я не знаю, каким должен быть тип возвращаемого значения: let ast: ??? = syn::parse(token_stream_from_function_definitio…
04 авг '19 в 00:11
1 ответ

Преобразование вариантов перечисления с именованными данными в отдельные структуры с использованием процедурных макросов

Я пишу процедурный макрос, чтобы преобразовать варианты перечисления в отдельные структуры и реализовать некоторые черты для этой структуры. Это хорошо работает для единичных и безымянных вариантов, но варианты с именованными данными приведут к молч…
01 авг '19 в 00:31
0 ответов

Как обработать `Self` в процедурных макросах Rust?

Я пытаюсь создать производный макрос в Rust для создания экземпляров, в качестве примера, который должен реализовать следующую черту: pub trait MyTrait { fn my_default() -&gt; Option&lt;Self&gt;; } я использую syn а также quote проанализировать и сг…
01 авг '19 в 10:40
2 ответа

Можем ли мы получить местоположение исходного кода вызывающей стороны в атрибуте процедурного макроса?

У меня есть требование получить исходное местоположение вызывающего абонента каждого метода. Я пытаюсь создатьproc_macro_attribute чтобы запечатлеть местоположение и распечатать его. #[proc_macro_attribute] pub fn get_location(attr: TokenStream, ite…
15 мар '20 в 13:56
2 ответа

Могут ли макросы proc определить цель вызывающей компиляции?

Процедурные макросы хранятся в своих собственных ящиках, которые скомпилированы для машины разработки (так, чтобы их можно было запускать при компиляции ящиков, которые их используют). Любые директивы условной компиляции в крейтах процедурных макрос…
2 ответа

Как создать процедурный макрос, похожий на функцию?

Как должен a_proc_macro быть определенным так, чтобы он "возвращал" 5? fn main() { let a = a_proc_macro!(); assert!(a == 5); }
18 ноя '19 в 23:06
1 ответ

Вывести имя вызывающего ящика для заполнения документации в процедурном макросе

Я создаю процедурный макрос, который автоматически генерирует библиотеку из некоторого файла конфигурации (это макет регистра, но это не важно для вопроса). Я хотел бы, чтобы библиотека автоматически генерировала документацию, сопровождающую автомат…
29 окт '19 в 14:22
2 ответа

Как я могу создать гигиенические идентификаторы в коде, созданном с помощью процедурных макросов?

При написании декларативного (macro_rules!) макрос, мы автоматически получаем макросигиену. В этом примере я объявляю переменную с именемf в макросе и передать идентификатор f которая становится локальной переменной: macro_rules! decl_example { ($tn…
06 янв '20 в 22:59