Merge pull request #962 from ethcore/ipc-nested-interfaces

IPC RPC codegen extra feature
This commit is contained in:
Arkadiy Paronyan 2016-04-15 17:46:30 +02:00
commit ca4ddfb963
3 changed files with 64 additions and 32 deletions

View File

@ -466,7 +466,6 @@ fn implement_client_method(
{ {
let _sp = ext_cx.call_site(); let _sp = ext_cx.call_site();
let mut tt = ::std::vec::Vec::new(); let mut tt = ::std::vec::Vec::new();
tt.push(::syntax::ast::TokenTree::Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of("pub"), ::syntax::parse::token::Plain)));
tt.push(::syntax::ast::TokenTree::Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of("fn"), ::syntax::parse::token::Plain))); tt.push(::syntax::ast::TokenTree::Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of("fn"), ::syntax::parse::token::Plain)));
tt.extend(::quasi::ToTokens::to_tokens(&method_name, ext_cx).into_iter()); tt.extend(::quasi::ToTokens::to_tokens(&method_name, ext_cx).into_iter());
tt.push(::syntax::ast::TokenTree::Token(_sp, ::syntax::parse::token::OpenDelim(::syntax::parse::token::Paren))); tt.push(::syntax::ast::TokenTree::Token(_sp, ::syntax::parse::token::OpenDelim(::syntax::parse::token::Paren)));
@ -595,8 +594,7 @@ fn push_client_implementation(
let client_ident = client_qualified_ident(builder, interface_map); let client_ident = client_qualified_ident(builder, interface_map);
let where_clause = &generics.where_clause; let where_clause = &generics.where_clause;
let implement = quote_item!(cx, let handshake_item = quote_impl_item!(cx,
impl $generics $client_ident $where_clause {
pub fn handshake(&self) -> Result<(), ::ipc::Error> { pub fn handshake(&self) -> Result<(), ::ipc::Error> {
let payload = BinHandshake { let payload = BinHandshake {
protocol_version: $item_ident::protocol_version().to_string(), protocol_version: $item_ident::protocol_version().to_string(),
@ -619,18 +617,52 @@ fn push_client_implementation(
} }
} }
else { Err(::ipc::Error::HandshakeFailed) } else { Err(::ipc::Error::HandshakeFailed) }
} }).unwrap();
let socket_item = quote_impl_item!(cx,
#[cfg(test)] #[cfg(test)]
pub fn socket(&self) -> &::std::cell::RefCell<S> { pub fn socket(&self) -> &::std::cell::RefCell<S> {
&self.socket &self.socket
}
$items
}).unwrap(); }).unwrap();
let generic_items = vec![P(handshake_item), P(socket_item)];
if interface_map.impl_trait.is_some() {
let trait_ty = builder.id(
::syntax::print::pprust::path_to_string(
&interface_map.impl_trait.as_ref().unwrap().path));
let implement_trait =
quote_item!(cx,
impl $generics $trait_ty for $client_ident $where_clause {
$items
}
).unwrap();
push(Annotatable::Item(implement_trait));
let implement =
quote_item!(cx,
impl $generics $client_ident $where_clause {
$generic_items
}
).unwrap();
push(Annotatable::Item(implement)); push(Annotatable::Item(implement));
} }
else {
let pub_items = items.iter().map(|item| {
let pub_item = item.clone();
pub_item.map(|mut val| { val.vis = ast::Visibility::Public; val })
}).collect::<Vec<P<ast::ImplItem>>>();
let implement = quote_item!(cx,
impl $generics $client_ident $where_clause {
$pub_items
$generic_items
}).unwrap();
push(Annotatable::Item(implement));
}
}
/// implements dispatching of system handshake invocation (method_num 0) /// implements dispatching of system handshake invocation (method_num 0)
fn implement_handshake_arm( fn implement_handshake_arm(

View File

@ -18,7 +18,7 @@
mod tests { mod tests {
use super::super::service::*; use super::super::service::*;
use super::super::nested::DBClient; use super::super::nested::{DBClient,DBWriter};
use ipc::*; use ipc::*;
use devtools::*; use devtools::*;
use semver::Version; use semver::Version;

View File

@ -24,7 +24,7 @@ pub struct DB<L: Sized> {
pub holdings: L, pub holdings: L,
} }
trait DBWriter { pub trait DBWriter {
fn write(&self, data: Vec<u8>) -> Result<(), DBError>; fn write(&self, data: Vec<u8>) -> Result<(), DBError>;
} }