2016-05-11 61 views
5

Tôi đang cố gắng xây dựng tiện ích mở rộng cú pháp mở rộng thuộc tính thành các cuộc gọi. Trước:Làm thế nào để sửa đổi tất cả các mục của một thùng trong một plugin trình biên dịch?

#[flame] 
fn flamed() { 
    .. 
} 

Sau:

fn flamed() { 
    flame::start_guard("flamed"); 
    .. 
} 

này đã works. Tuy nhiên, tôi cũng muốn nó hoạt động nếu tôi có thuộc tính #[flame] ở cấp độ thùng (như #![flame]). Điều này có thể và nếu có, làm thế nào?

+0

Chính xác những gì bạn mong đợi thuộc tính thùng để làm gì? Chèn cuộc gọi vào mọi chức năng của thùng? –

+2

Bạn đã thử bắt 'ItemKind :: Mod' trong https://github.com/llogiq/flamer/blob/f4828cc91768109fa66f8cbbe57a285c0477c436/src/lib.rs#L29 và lặp lại nội dung của nó (đệ quy)? – huon

+0

@Lukas Kalbertodt: chính xác. – llogiq

Trả lời

2

@ bình luận Huon của

Bạn đã thử bắt ItemKind :: Mod trong github.com/llogiq/flamer/blob/... và iterating trên nội dung của nó (đệ quy)?

đã được bật - Tôi vừa thêm một cam kết xử lý các mục và đặc điểm bằng cách đi bộ. Tôi cũng sẽ có thể thêm mã để đi bộ chức năng để xử lý các mục bên trong và fns.

Mã này trông như thế này:

fn flame_item(i: &Item) -> Item { 
    let base = i.clone(); 
    Item { 
     node: match i.node { 
      ItemKind::Mod(ref m) => 
       ItemKind::Mod(flame_mod(m)), 
      ItemKind::Trait(unsafety, ref generic, ref bounds, ref tis) => 
       ItemKind::Trait(unsafety, 
           generic.clone(), 
           bounds.clone(), 
           flame_items(tis)), 
     .. // other item types as usual: items, traitimpls, implitems 

      _ => return base 
     }, 
     ..base 
    } 
} 

fn flame_mod(m: &Mod) -> Mod { 
    Mod { 
     inner: m.inner, 
     items: m.items.iter().map(|i| P(flame_item(i))).collect() 
    } 
} 

fn flame_items(items: &[TraitItem]) -> Vec<TraitItem> { 
    items.iter().map(flame_trait_item).collect() 
} 
Các vấn đề liên quan