Wie schreibe ich ein benutzerdefiniertes Attribut, das Code in eine Funktion einfügt?

Ich bin so weit gekommen, dass das benutzerdefinierte Attribut aufgerufen wird:

#[plugin_registrar]
pub fn registrar(reg: &mut rustc::plugin::Registry) {
  use syntax::parse::token::intern;
  use syntax::ext::base;

  // Register the `#[dummy]` attribute.
  reg.register_syntax_extension(intern("dummy"),
  base::ItemDecorator(dummy_expand));
}

// Decorator for `dummy` attribute
pub fn dummy_expand(context: &mut ext::base::ExtCtxt, span: codemap::Span, meta_item: Gc<ast::MetaItem>, item: Gc<ast::Item>, push: |Gc<ast::Item>|) {
  match item.node {
    ast::ItemFn(decl, ref style, ref abi, ref generics, block) => {
      trace!("{}", decl);
      // ...? Add something here.
    }
    _ => {
      context.span_err(span, "dummy is only permissiable on functions");
    }
  }
}

Invoked via:

#![feature(phase)]

#[phase(plugin)]
extern crate dummy_ext;

#[test]
#[dummy]
fn hello() {
  println!("Put something above this...");
}

... und ich habe ein paar Beispiele von Dingen gesehen, die @ verwendquote_expr!( ... ) um dies zu tun, aber ich verstehe sie nicht wirklich.

Angenommen, ich möchte diese Anweisung (oder ist es ein Ausdruck?) An die Spitze einer Funktion mit dem Tag @ setze#[dummy]:

println!("dummy");

Wie erreiche ich das?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage