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?