Описание тега 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! "работает", но не элегантно и не отображает сообщение об ошибке для пользователя. Я знаю, что могу с…
27 янв '19 в 20:44
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<String>", Как я могу получить только "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() -> Option<Self>; } я использую 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 определить цель вызывающей компиляции?
Процедурные макросы хранятся в своих собственных ящиках, которые скомпилированы для машины разработки (так, чтобы их можно было запускать при компиляции ящиков, которые их используют). Любые директивы условной компиляции в крейтах процедурных макрос…
01 окт '19 в 02:57
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