如何在proc-macros中禁用Clippy的write_literal警告?
解决EnumFlags派生触发Clippy write_literal警告的问题
遇到这种proc宏生成代码触发Clippy警告但直接加属性无效的情况,核心原因是你给枚举加的属性不会自动传递给宏生成的内部代码——EnumFlags派生宏会生成额外的实现(比如Debug、Display相关代码),这些代码里出现了空格式字符串的写法,才触发了write_literal警告。
下面是两种精准解决的方法,不需要全局禁用该规则:
方法1:模块级精准禁用警告
把枚举放在一个单独的小模块里,然后给模块添加Clippy的allow属性,这样只会让该模块内的代码(包括宏生成的部分)忽略write_literal警告,不会影响其他代码:
#[cfg_attr(feature = "cargo-clippy", allow(clippy::write_literal))] mod flag_definitions { use enumflags::EnumFlags; use enumflags_derive::EnumFlags; #[derive(Copy, Clone, EnumFlags)] pub enum MyFlags { FirstFlag, SecondFlag, ThirdFlag, } } // 外部正常使用该枚举 use flag_definitions::MyFlags;
方法2:直接给枚举添加属性(部分场景有效)
有些情况下,直接给枚举添加#[allow(clippy::write_literal)]也能生效,不需要额外模块。你可以试试这种更简洁的写法:
use enumflags::EnumFlags; use enumflags_derive::EnumFlags; #[derive(Copy, Clone, EnumFlags)] #[allow(clippy::write_literal)] pub enum MyFlags { FirstFlag, SecondFlag, ThirdFlag, }
如果这种写法无效,说明宏没有把属性传递给生成的代码,那方法1的模块级方案就是最可靠的选择。
内容的提问来源于stack exchange,提问作者Tim Diekmann
相关产品推荐
相关产品推荐

