我可以重写这个宏吗!宏是否可以与rustfmt一起使用?

我可以重写这个宏吗!宏是否可以与rustfmt一起使用?,rust,rust-macros,Rust,Rust Macros,我想使用宏为多个具体类型生成相同的impl块。我的代码当前看起来像这样: macro\u规则!impl_方法{ ($ty:ty,{$($method:item);+})=>{ impl$ty{$($method)+} }; ($ty:ty,$($more:ty),+{$($method:item);+})=>{ impl_方法!($ty,{$($method);+}); impl_方法!($($more),+,{$($method);+}); }; } 结构Hi; 结构你好; 简单的方法!(嗨,

我想使用宏为多个具体类型生成相同的
impl
块。我的代码当前看起来像这样:

macro\u规则!impl_方法{
($ty:ty,{$($method:item);+})=>{
impl$ty{$($method)+}
};
($ty:ty,$($more:ty),+{$($method:item);+})=>{
impl_方法!($ty,{$($method);+});
impl_方法!($($more),+,{$($method);+});
};
}
结构Hi;
结构你好;
简单的方法!(嗨,你好{
///“真的”如果行得通,那就好了
fn工作良好(自我)->bool{
真的
};
///如果rustfmt正在工作,则为'true'
fn获取\u rustfmt(&self)->bool{
假的
}
});
断言!(Hi.works_good()&&Hello.works_good());
断言!(!(Hi.gets_rustfmt()| Hello.gets_rustfmt());
这已经足够好了(impl已经生成),但是它有一个令人沮丧的问题;宏中定义的方法不会被
rustfmt
格式化

这是一个小问题,但已经够烦人的了,我很想知道一个解决方案。我知道rustfmt将格式化宏的内容,如果这些内容具有某种形式(是表达式吗?),因此,例如,将格式化以下宏的内容:

macro_rules! fmt_me {
    ($inner:item) => {
        $inner
    };
}

fmt_me!(fn will_get_formatted() -> bool { true });
所以我希望有一种方法可以写我的宏,比如

impl\u方法!(嗨,你好{
fmt_me!(fn我的方法(&self)->bool{true});
fmt_me!(fn my_other_method(&self)->bool{false});
});
并让每种方法都被rustfmt覆盖

这可能吗?有没有什么神奇的咒语能给我我想要的可爱的格式

答复 感谢下面的答案(来自@seiichi uchida),我可以通过以下代码实现这一点:

macro\u规则!impl_方法{
($ty:ty,{$($method:item)+})=>{
impl$ty{$($method)+}
};
($ty:ty,$($more:ty),+,{$($method:item)+})=>{
impl_方法!($ty,{$($method)+});
impl_方法!($($more),+,{$($method)+});
};
}
宏规则!fmt!{
($inner:item)=>{
$inner
};
}
//被称为:
简单的方法!(你好{
fmt_me!(fn这是一种方法(&self)->bool{true});
fmt_me!(fn这是另一种方法(&self)->bool{true});
});

在最后一个类型和impl块之间添加逗号应该可以做到:

impl\u方法!(你好{
fmt_me!(fn我的方法(&self)->bool{true});
fmt_me!(fn my_other_method(&self)->bool{false});
});
这将被格式化为:

 impl_methods!(Hi, Hello, {
-    fmt_me!(fn my_method(&self) -> bool { true });
-    fmt_me!(fn my_other_method(&self) -> bool { false });
+    fmt_me!(
+        fn my_method(&self) -> bool {
+            true
+        }
+    );
+    fmt_me!(
+        fn my_other_method(&self) -> bool {
+            false
+        }
+    );
 });
通常,rustfmt只能格式化宏调用,这些宏调用的参数可以解析为有效的Rust AST节点(有些例外)