Merge branch 'ipc-update-syntax-libs' into numbers-serde-bin

This commit is contained in:
NikVolf 2016-04-12 18:41:38 +03:00
commit 6149423e47
4 changed files with 37 additions and 21 deletions

View File

@ -14,14 +14,14 @@ nightly-testing = ["clippy"]
with-syntex = ["quasi/with-syntex", "quasi_codegen", "quasi_codegen/with-syntex", "syntex", "syntex_syntax"] with-syntex = ["quasi/with-syntex", "quasi_codegen", "quasi_codegen/with-syntex", "syntex", "syntex_syntax"]
[build-dependencies] [build-dependencies]
quasi_codegen = { version = "^0.8.0", optional = true } quasi_codegen = { version = "*", optional = true }
syntex = { version = "^0.30.0", optional = true } syntex = { version = "*", optional = true }
[dependencies] [dependencies]
aster = { version = "^0.14.0", default-features = false } aster = { version = "^0.15.0", default-features = false }
clippy = { version = "^0.*", optional = true } clippy = { version = "^0.*", optional = true }
quasi = { version = "^0.8.0", default-features = false } quasi = { version = "*", default-features = false }
quasi_macros = { version = "^0.8.0", optional = true } quasi_macros = { version = "*", optional = true }
syntex = { version = "^0.30.0", optional = true } syntex = { version = "*", optional = true }
syntex_syntax = { version = "^0.30.0", optional = true } syntex_syntax = { version = "*", optional = true }
"ethcore-ipc" = { path = "../rpc"} "ethcore-ipc" = { path = "../rpc"}

View File

@ -282,15 +282,14 @@ fn implement_dispatch_arms(
/// generates client type for specified server type /// generates client type for specified server type
/// for say `Service` it generates `ServiceClient` /// for say `Service` it generates `ServiceClient`
fn push_client_struct(cx: &ExtCtxt, builder: &aster::AstBuilder, item: &Item, push: &mut FnMut(Annotatable)) { fn push_client_struct(cx: &ExtCtxt, builder: &aster::AstBuilder, item: &Item, push: &mut FnMut(Annotatable)) {
let proxy_ident = builder.id(format!("{}Client", item.ident.name.as_str())); let (_, client_ident) = get_item_idents(builder, item);
let client_struct_item = quote_item!(cx,
let proxy_struct_item = quote_item!(cx, pub struct $client_ident <S: ::ipc::IpcSocket> {
pub struct $proxy_ident <S: ::ipc::IpcSocket> {
socket: ::std::cell::RefCell<S>, socket: ::std::cell::RefCell<S>,
phantom: ::std::marker::PhantomData<S>, phantom: ::std::marker::PhantomData<S>,
}); });
push(Annotatable::Item(proxy_struct_item.expect(&format!("could not generate proxy struct for {:?}", proxy_ident.name)))); push(Annotatable::Item(client_struct_item.expect(&format!("could not generate client struct for {:?}", client_ident.name))));
} }
/// pushes generated code for the client class (type declaration and method invocation implementations) /// pushes generated code for the client class (type declaration and method invocation implementations)
@ -492,7 +491,8 @@ fn push_with_socket_client_implementation(
item: &Item, item: &Item,
push: &mut FnMut(Annotatable)) push: &mut FnMut(Annotatable))
{ {
let client_ident = builder.id(format!("{}Client", item.ident.name.as_str())); let (_, client_ident) = get_item_idents(builder, item);
let implement = quote_item!(cx, let implement = quote_item!(cx,
impl<S> ::ipc::WithSocket<S> for $client_ident<S> where S: ::ipc::IpcSocket { impl<S> ::ipc::WithSocket<S> for $client_ident<S> where S: ::ipc::IpcSocket {
fn init(socket: S) -> $client_ident<S> { fn init(socket: S) -> $client_ident<S> {
@ -513,13 +513,13 @@ fn push_client_implementation(
item: &Item, item: &Item,
push: &mut FnMut(Annotatable)) push: &mut FnMut(Annotatable))
{ {
let (item_ident, client_ident) = get_item_idents(builder, item);
let mut index = -1i32; let mut index = -1i32;
let items = dispatches.iter() let items = dispatches.iter()
.map(|dispatch| { index = index + 1; P(implement_client_method(cx, builder, index as u16, dispatch)) }) .map(|dispatch| { index = index + 1; P(implement_client_method(cx, builder, index as u16, dispatch)) })
.collect::<Vec<P<ast::ImplItem>>>(); .collect::<Vec<P<ast::ImplItem>>>();
let client_ident = builder.id(format!("{}Client", item.ident.name.as_str()));
let item_ident = builder.id(format!("{}", item.ident.name.as_str()));
let implement = quote_item!(cx, let implement = quote_item!(cx,
impl<S> $client_ident<S> where S: ::ipc::IpcSocket { impl<S> $client_ident<S> where S: ::ipc::IpcSocket {
pub fn handshake(&self) -> Result<(), ::ipc::Error> { pub fn handshake(&self) -> Result<(), ::ipc::Error> {
@ -589,6 +589,24 @@ fn implement_handshake_arm(
) )
} }
fn get_item_idents(builder: &aster::AstBuilder, item: &Item) -> (::syntax::ast::Ident, ::syntax::ast::Ident) {
let ty = match item.node {
ast::ItemKind::Impl(_, _, _, _, ref ty, _) => ty.clone(),
_ => { builder.ty().id("") }
};
let (item_ident, client_ident) = match ty.node {
::syntax::ast::TyKind::Path(_, ref path) => {
(
builder.id(format!("{}", path.segments[0].identifier)),
builder.id(format!("{}Client", path.segments[0].identifier))
)
},
_ => { panic!("incompatible implementation"); }
};
(item_ident, client_ident)
}
/// implements `IpcInterface<C>` for the given class `C` /// implements `IpcInterface<C>` for the given class `C`
fn implement_interface( fn implement_interface(
cx: &ExtCtxt, cx: &ExtCtxt,
@ -612,12 +630,10 @@ fn implement_interface(
) )
.build(); .build();
let ty = builder.ty().path()
.segment(item.ident).with_generics(impl_generics.clone()).build()
.build();
let where_clause = &impl_generics.where_clause; let where_clause = &impl_generics.where_clause;
let (ty, _) = get_item_idents(builder, item);
let mut dispatch_table = Vec::new(); let mut dispatch_table = Vec::new();
for impl_item in impl_items { for impl_item in impl_items {
if let ImplItemKind::Method(ref signature, _) = impl_item.node { if let ImplItemKind::Method(ref signature, _) = impl_item.node {

View File

@ -63,5 +63,5 @@ pub fn register(reg: &mut rustc_plugin::Registry) {
reg.register_syntax_extension( reg.register_syntax_extension(
syntax::parse::token::intern("derive_Ipc"), syntax::parse::token::intern("derive_Ipc"),
syntax::ext::base::MultiDecorator( syntax::ext::base::MultiDecorator(
Box::new(ser::expand_derive_serialize))); Box::new(codegen::expand_ipc_implementation)));
} }

View File

@ -18,6 +18,6 @@ ethcore-ipc-nano = { path = "../nano" }
[build-dependencies] [build-dependencies]
syntex = "0.30.0" syntex = "*"
serde_codegen = "0.7.0" serde_codegen = "0.7.0"
"ethcore-ipc-codegen" = { path = "../codegen" } "ethcore-ipc-codegen" = { path = "../codegen" }