#macro-expansion #cargo #macro #cargo-subcommand #subcommand

app cargo-expand

rustc -Zunpretty=expanded 的包装器。显示宏展开和 #[derive] 展开的结果。

142 个版本 (89 个稳定版)

1.0.89 2024 年 7 月 31 日
1.0.85 2024 年 4 月 19 日
1.0.81 2024 年 3 月 29 日
1.0.78 2023 年 12 月 30 日
0.1.2 2016 年 6 月 9 日

Cargo 插件 中排名 26

Download history 11196/week @ 2024-05-04 12645/week @ 2024-05-11 14066/week @ 2024-05-18 11800/week @ 2024-05-25 13860/week @ 2024-06-01 12519/week @ 2024-06-08 10457/week @ 2024-06-15 10408/week @ 2024-06-22 9778/week @ 2024-06-29 11132/week @ 2024-07-06 11224/week @ 2024-07-13 11034/week @ 2024-07-20 12024/week @ 2024-07-27 13121/week @ 2024-08-03 11830/week @ 2024-08-10 9486/week @ 2024-08-17

每月下载量 48,155
4 个 crate 中使用

许可协议 MIT/ApacheLGPL-3.0-or-later

54KB
1K SLoC

cargo-expand

github crates.io build status

安装后,以下命令将打印出当前 crate 应用的宏展开和 #[derive] 展开的结果。

$ cargo expand

这是对更冗长的编译器命令的包装

$ cargo rustc --profile=check -- -Zunpretty=expanded

安装

使用 cargo install cargo-expand 安装。

此命令可选地使用 rustfmt 格式化展开后的输出。结果代码通常比编译器生成的代码更易读。如果 rustfmt 不可用,则展开的代码不会格式化。使用 rustup component add rustfmt 安装 rustfmt。

Cargo expand 依赖于不稳定的编译器标志,因此需要安装 nightly 工具链,尽管不需要将其作为默认工具链或执行 cargo expand 的工具链。如果默认工具链不是 nightly,运行 cargo expand 也会找到并使用 nightly。

示例

$ cat src/main.rs

#[derive(Debug)]
struct S;

fn main() {
    println!("{:?}", S);
}

$cargo expand

#![feature(prelude_import)]
#[prelude_import]
use std::prelude::v1::*;
#[macro_use]
extern crate std;
struct S;
#[automatically_derived]
#[allow(unused_qualifications)]
impl ::core::fmt::Debug for S {
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match *self {
            S => {
                let mut debug_trait_builder = f.debug_tuple("S");
                debug_trait_builder.finish()
            }
        }
    }
}
fn main() {
    {
        ::std::io::_print(::core::fmt::Arguments::new_v1(
            &["", "\n"],
            &match (&S,) {
                (arg0,) => [::core::fmt::ArgumentV1::new(arg0, ::core::fmt::Debug::fmt)],
            },
        ));
    };
}

选项

查看 cargo expand --help 以获取完整的选项列表,其中大多数与其他 Cargo 子命令保持一致。以下是一些在 cargo expand 上下文中常用的选项。

展开特定的测试目标

$cargo expand --测试测试_something

不使用rustfmt进行展开

$cargo expand --难看

仅展开特定的模块、类型或函数

$cargo expand path::to::module

cargo expand punctuated::printing cargo expand token::FatArrow

配置

cargo expand 命令会读取 $CARGO_HOME/config.toml 文件中的 [expand] 部分(通常是 ~/.cargo/config.toml),如果存在的话。

使用 theme 设置来设置默认的语法高亮主题

[expand]
theme = "TwoDark"

运行 cargo expand --themes 来打印可用主题列表。使用 theme = "none" 来禁用颜色。

使用 color 设置来更改默认的颜色显示设置(通常是 auto

[expand]
color = "always"

使用 pager 设置来启用输出分页

[expand]
pager = true

免责声明

请注意,宏展开到文本是一个有损的过程。这仅是一个调试辅助工具。不应期望展开后的代码能够成功编译,或者如果编译成功,则其行为与原始代码相同。

例如,以下函数在通过Rust常规编译时返回 3,但展开后的代码编译并返回 4

fn f() -> i32 {
    let x = 1;

    macro_rules! first_x {
        () => { x }
    }

    let x = 2;

    x + first_x!()
}

有关宏卫生的更多考虑,请参阅《The Book》


许可

根据您的选择,此软件受Apache License, Version 2.0MIT许可的许可。
除非您明确声明,否则根据Apache-2.0许可证定义,您提交给此crate的任何有意贡献都应如上所述双许可,不附加任何额外条款或条件。

依赖

~17–29MB
~456K SLoC