Как извлечь код из ящика / модуля / функций? - PullRequest
0 голосов
/ 10 мая 2018

Насколько я знаю, Rust поддерживает атрибут #[derive] для генерации кода во время компиляции из структур данных. Как я могу сгенерировать код для целого ящика, модуля или функций? Атрибут #[derive] здесь недопустим.

Я хочу создать функцию, которая включает несколько элементов (структуры / перечисления / функции) в проекте.

Например, для данного примера модуля здесь

#[derive(MyAgg)]
mod AAA {
    struct BBB {}
    struct CCC {}
    fn ddd() {}
}

Я хочу произвести это.

fn example1() {
    print("{:?}", AAA::BBB {});
    print("{:?}", AAA::CCC {});
    AAA::ddd()
}

Этот пример не имеет смысла, но я думаю, что он дает смысл.

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Я нашел обходной путь. Вы можете запустить анализатор языка Rust и разобрать исходный код самостоятельно.

Сначала добавьте зависимость к Cargo.toml.

[dependencies]
syntex_syntax = "0.59.1"

И добавить эти строки в src/main.rs.

extern crate syntex_syntax;

use std::path::*;
use syntex_syntax::parse::*;
use syntex_syntax::codemap::*;

fn main() {
    let f = file!(); // Get absolute path to this file.
    let p = Path::new(f);
    let m = FilePathMapping::empty();
    let s = ParseSess::new(m);
    let r = parse_crate_from_file(&p, &s);
    println!("{:?}", r);
}

Теперь у вас есть проанализированный AST.


Обновление

После нескольких недель попыток я узнал, что расширение макроса выполняется на этапе синтаксического анализа. Поскольку он выполняется до этапа анализа типов, я не могу запрашивать полностью разрешенные пути для каждого типа, поэтому стабильная ссылка нескольких типов из нескольких модулей становится очень сложной или невозможной. Наконец, я отказался от макроэкономического подхода.

0 голосов
/ 10 мая 2018

Атрибут #[derive] недопустим для модулей, только для структур, перечислений и объединений:

error: `derive` may only be applied to structs, enums and unions
 --> src/main.rs:1:1
  |
1 | #[derive(MyAgg)]
  | ^^^^^^^^^^^^^^^^

Детская площадка

Дополнительную информацию о расширении макроса #[derive] можно найти в Процедурные макросы (и пользовательское извлечение) в книге Rust.

Однако вы можете создать свой собственный процедурный макрос. Вы можете обратиться к RFC , чтобы понять proc-macros . Не мешало бы взглянуть и на другие ящики, такие как Serde или Производная .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...