首页 > 解决方案 > 在编译时转换 proc_macro::Literal

问题描述

如何将 a 转换proc_macro::Literal为内部值?例如我有

use proc_macro::{ TokenStream, TokenTree };

#[proc_macro]
pub fn xtest(items: TokenStream) -> TokenStream {
    if let Some(TokenTree::Literal(l)) = items.into_iter().next() {
        println!("{:?}", l);
        // output: Literal { kind: Integer, symbol: "0x42", suffix: None, span: #0 bytes(52..56) }

        // how can I convert 'l'?
        // assert_eq!(l, 0x42);
    }

    TokenStream::new()
}

并像使用它一样

#[test]
fn test_fn() {
    xtest!(0x42);
}

xtest宏中,我需要知道对其运行操作的值。

目前,对数字文字的支持就足够了(在“1”、“0x10”、“1_000”等变体中)。对左右的解释1 << 2会很好,但可以手动实现(当Literal转换已解决时)。

背景

我想模拟 C 的指定初始化程序;例如写类似的东西

const VECTORS: vectors!(DefaultHandler, {
  23 => UartHandler,
  42 => AdcHandler,
}

扩展到

static VECTORS: [HandlerType; 43] = {
  DefaultHandler, 
  DefaultHandler,
  ...
  UartHandler /* at index 23 */,
  ...
  AdcHandler /* at index 42 */
}

标签: rustrust-proc-macros

解决方案


推荐阅读