use syntax::ast::TokenTree;
use syntax::ast::Delimited;
use syntax::parse::token::Lit;
use syntax::parse::token::Token;
use syntax::parse::token::BinOpToken;
use syntax::parse::token::IdentStyle;
use syntax::parse::token::DelimToken;
use syntax::parse::token::intern;
use syntax::ast;
use syntax::codemap::DUMMY_SP;
use std::rc::Rc;
pub fn build_millefeuille_ffi_map(input: &[(ast::Ident,ast::Ident)]) -> ast::MacroDef {
let mut match_body = vec![];
for &(modname,fname) in input {
let compound = format!(
"{}::{}",
&modname.name.as_str(),
&fname.name.as_str(),
);
match_body.push(
TokenTree::Token(DUMMY_SP,
Token::Literal(
Lit::Str_(
intern(
&*compound
)
),
None
)
),
);
match_body.push(
TokenTree::Token(DUMMY_SP, Token::FatArrow),
);
match_body.push(
TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("Some")), IdentStyle::Plain)),
);
match_body.push(
TokenTree::Delimited(DUMMY_SP, Rc::new(Delimited {
delim: DelimToken::Paren,
open_span: DUMMY_SP,
close_span: DUMMY_SP,
tts: vec![
TokenTree::Token(DUMMY_SP, Token::Ident(modname, IdentStyle::Plain)),
TokenTree::Token(DUMMY_SP, Token::ModSep),
TokenTree::Token(DUMMY_SP, Token::Ident(fname, IdentStyle::Plain)),
],
})
)
);
match_body.push(
TokenTree::Token(DUMMY_SP, Token::Comma),
);
}
match_body.push(TokenTree::Token(DUMMY_SP, Token::Underscore));
match_body.push(TokenTree::Token(DUMMY_SP, Token::FatArrow));
match_body.push(TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("None")), IdentStyle::Plain)));
match_body.push(TokenTree::Token(DUMMY_SP, Token::Comma));
ast::MacroDef {
ident: ast::Ident::with_empty_ctxt(intern("millefeuille_ffi_map")),
attrs: vec![],
id: ast::DUMMY_NODE_ID,
span: DUMMY_SP,
imported_from: None,
export: true,
use_locally: true,
allow_internal_unstable: false,
body: vec![
TokenTree::Delimited(DUMMY_SP, Rc::new(Delimited {
delim: DelimToken::Paren,
open_span: DUMMY_SP,
close_span: DUMMY_SP,
tts: vec![],
})
),
TokenTree::Token(DUMMY_SP, Token::FatArrow),
TokenTree::Delimited(DUMMY_SP, Rc::new(Delimited {
delim: DelimToken::Brace,
open_span: DUMMY_SP,
close_span: DUMMY_SP,
tts: vec![
TokenTree::Token(DUMMY_SP, Token::BinOp(BinOpToken::Or)),
TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("x")), IdentStyle::Plain)),
TokenTree::Token(DUMMY_SP, Token::BinOp(BinOpToken::Or)),
TokenTree::Token(DUMMY_SP, Token::RArrow),
TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("Option")), IdentStyle::Plain)),
TokenTree::Token(DUMMY_SP, Token::Lt),
TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("fn")), IdentStyle::Plain)),
TokenTree::Delimited(DUMMY_SP, Rc::new(Delimited {
delim: DelimToken::Paren,
open_span: DUMMY_SP,
close_span: DUMMY_SP,
tts: vec![
TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("Packet")), IdentStyle::Plain)),
],
})
),
TokenTree::Token(DUMMY_SP, Token::RArrow),
TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("Packet")), IdentStyle::Plain)),
TokenTree::Token(DUMMY_SP, Token::Gt),
TokenTree::Delimited(DUMMY_SP, Rc::new(Delimited {
delim: DelimToken::Brace,
open_span: DUMMY_SP,
close_span: DUMMY_SP,
tts: vec![
TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("match")), IdentStyle::Plain)),
TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("x")), IdentStyle::Plain)),
TokenTree::Delimited(DUMMY_SP, Rc::new(Delimited {
delim: DelimToken::Brace,
open_span: DUMMY_SP,
close_span: DUMMY_SP,
tts: match_body,
})
),
],
})
),
],
})
),
TokenTree::Token(DUMMY_SP, Token::Semi),
],
}
}