Skip to content

Update syn & co #507

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Oct 18, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions derive/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ version = "14.0.0"
proc-macro = true

[dependencies]
syn = { version = "^0.15.22", features = ["full", "extra-traits", "visit", "fold"] }
proc-macro2 = "0.4"
quote = "0.6"
proc-macro-crate = "0.1.3"
syn = { version = "1.0", features = ["full", "extra-traits", "visit", "fold"] }
proc-macro2 = "1.0"
quote = "1.0"
proc-macro-crate = "0.1.4"

[dev-dependencies]
jsonrpc-core = { version = "14.0", path = "../core" }
Expand Down
43 changes: 27 additions & 16 deletions derive/src/rpc_attr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ const NEITHER_SUB_OR_UNSUB_ERR: &str = "pubsub attribute not annotated with eith

impl RpcMethodAttribute {
pub fn parse_attr(method: &syn::TraitItemMethod) -> Result<Option<RpcMethodAttribute>> {
let output = &method.sig.decl.output;
let output = &method.sig.output;
let attrs = method
.attrs
.iter()
Expand All @@ -68,9 +68,9 @@ impl RpcMethodAttribute {
fn parse_meta(attr: &syn::Attribute, output: &syn::ReturnType) -> Option<Result<RpcMethodAttribute>> {
match attr.parse_meta().and_then(validate_attribute_meta) {
Ok(ref meta) => {
let attr_kind = match meta.name().to_string().as_ref() {
RPC_ATTR_NAME => Some(Self::parse_rpc(meta, output)),
PUB_SUB_ATTR_NAME => Some(Self::parse_pubsub(meta)),
let attr_kind = match path_to_str(meta.path()).as_ref().map(String::as_str) {
Some(RPC_ATTR_NAME) => Some(Self::parse_rpc(meta, output)),
Some(PUB_SUB_ATTR_NAME) => Some(Self::parse_pubsub(meta)),
_ => None,
};
attr_kind.map(|kind| {
Expand Down Expand Up @@ -162,24 +162,27 @@ fn validate_attribute_meta(meta: syn::Meta) -> Result<syn::Meta> {
}
impl<'a> Visit<'a> for Visitor {
fn visit_meta(&mut self, meta: &syn::Meta) {
match meta {
syn::Meta::List(list) => self.meta_list_names.push(list.ident.to_string()),
syn::Meta::Word(ident) => self.meta_words.push(ident.to_string()),
syn::Meta::NameValue(nv) => self.name_value_names.push(nv.ident.to_string()),
if let Some(ident) = path_to_str(meta.path()) {
match meta {
syn::Meta::Path(_) => self.meta_words.push(ident),
syn::Meta::List(_) => self.meta_list_names.push(ident),
syn::Meta::NameValue(_) => self.name_value_names.push(ident),
}
}
}
}

let mut visitor = Visitor::default();
visit::visit_meta(&mut visitor, &meta);

match meta.name().to_string().as_ref() {
RPC_ATTR_NAME => {
let ident = path_to_str(meta.path());
match ident.as_ref().map(String::as_str) {
Some(RPC_ATTR_NAME) => {
validate_idents(&meta, &visitor.meta_words, &[METADATA_META_WORD, RAW_PARAMS_META_WORD])?;
validate_idents(&meta, &visitor.name_value_names, &[RPC_NAME_KEY, RETURNS_META_WORD])?;
validate_idents(&meta, &visitor.meta_list_names, &[ALIASES_KEY])
}
PUB_SUB_ATTR_NAME => {
Some(PUB_SUB_ATTR_NAME) => {
validate_idents(
&meta,
&visitor.meta_words,
Expand Down Expand Up @@ -223,7 +226,7 @@ fn get_meta_list(meta: &syn::Meta) -> Option<&syn::MetaList> {
fn get_name_value(key: &str, ml: &syn::MetaList) -> Option<String> {
ml.nested.iter().find_map(|nested| {
if let syn::NestedMeta::Meta(syn::Meta::NameValue(mnv)) = nested {
if mnv.ident == key {
if path_eq_str(&mnv.path, key) {
if let syn::Lit::Str(ref lit) = mnv.lit {
Some(lit.value())
} else {
Expand All @@ -240,8 +243,8 @@ fn get_name_value(key: &str, ml: &syn::MetaList) -> Option<String> {

fn has_meta_word(word: &str, ml: &syn::MetaList) -> bool {
ml.nested.iter().any(|nested| {
if let syn::NestedMeta::Meta(syn::Meta::Word(w)) = nested {
w == word
if let syn::NestedMeta::Meta(syn::Meta::Path(p)) = nested {
path_eq_str(&p, word)
} else {
false
}
Expand All @@ -253,7 +256,7 @@ fn get_aliases(ml: &syn::MetaList) -> Vec<String> {
.iter()
.find_map(|nested| {
if let syn::NestedMeta::Meta(syn::Meta::List(list)) = nested {
if list.ident == ALIASES_KEY {
if path_eq_str(&list.path, ALIASES_KEY) {
Some(list)
} else {
None
Expand All @@ -266,7 +269,7 @@ fn get_aliases(ml: &syn::MetaList) -> Vec<String> {
list.nested
.iter()
.filter_map(|nm| {
if let syn::NestedMeta::Literal(syn::Lit::Str(alias)) = nm {
if let syn::NestedMeta::Lit(syn::Lit::Str(alias)) = nm {
Some(alias.value())
} else {
None
Expand All @@ -275,3 +278,11 @@ fn get_aliases(ml: &syn::MetaList) -> Vec<String> {
.collect()
})
}

fn path_eq_str(path: &syn::Path, s: &str) -> bool {
path.get_ident().map_or(false, |i| i == s)
}

fn path_to_str(path: &syn::Path) -> Option<String> {
Some(path.get_ident()?.to_string())
}
22 changes: 11 additions & 11 deletions derive/src/to_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -173,14 +173,14 @@ fn get_doc_comments(attrs: &[syn::Attribute]) -> Vec<syn::Attribute> {

fn compute_args(method: &syn::TraitItemMethod) -> Punctuated<syn::FnArg, syn::token::Comma> {
let mut args = Punctuated::new();
for arg in &method.sig.decl.inputs {
for arg in &method.sig.inputs {
let ty = match arg {
syn::FnArg::Captured(syn::ArgCaptured { ty, .. }) => ty,
syn::FnArg::Typed(syn::PatType { ty, .. }) => ty,
_ => continue,
};
let segments = match ty {
let segments = match &**ty {
syn::Type::Path(syn::TypePath {
path: syn::Path { segments, .. },
path: syn::Path { ref segments, .. },
..
}) => segments,
_ => continue,
Expand All @@ -200,12 +200,12 @@ fn compute_arg_identifiers(args: &Punctuated<syn::FnArg, syn::token::Comma>) ->
let mut arg_names = vec![];
for arg in args {
let pat = match arg {
syn::FnArg::Captured(syn::ArgCaptured { pat, .. }) => pat,
syn::FnArg::Typed(syn::PatType { pat, .. }) => pat,
_ => continue,
};
let ident = match pat {
syn::Pat::Ident(syn::PatIdent { ident, .. }) => ident,
syn::Pat::Wild(wild) => {
let ident = match **pat {
syn::Pat::Ident(syn::PatIdent { ref ident, .. }) => ident,
syn::Pat::Wild(ref wild) => {
let span = wild.underscore_token.spans[0];
let msg = "No wildcard patterns allowed in rpc trait.";
return Err(syn::Error::new(span, msg));
Expand All @@ -223,7 +223,7 @@ fn compute_returns(method: &syn::TraitItemMethod, returns: &Option<String>) -> R
None => None,
};
let returns = match returns {
None => try_infer_returns(&method.sig.decl.output),
None => try_infer_returns(&method.sig.output),
_ => returns,
};
let returns = match returns {
Expand Down Expand Up @@ -276,8 +276,8 @@ fn get_first_type_argument(args: &syn::PathArguments) -> Option<syn::Type> {

fn compute_subscription_type(arg: &syn::FnArg) -> syn::Type {
let ty = match arg {
syn::FnArg::Captured(cap) => match &cap.ty {
syn::Type::Path(path) => {
syn::FnArg::Typed(cap) => match *cap.ty {
syn::Type::Path(ref path) => {
let last = &path.path.segments[&path.path.segments.len() - 1];
get_first_type_argument(&last.arguments)
}
Expand Down
20 changes: 4 additions & 16 deletions derive/src/to_delegate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -142,13 +142,7 @@ pub fn generate_trait_item_method(

let predicates = generate_where_clause_serialization_predicates(&trait_item, false);
let mut method = method.clone();
method
.sig
.decl
.generics
.make_where_clause()
.predicates
.extend(predicates);
method.sig.generics.make_where_clause().predicates.extend(predicates);
Ok(method)
}

Expand Down Expand Up @@ -183,13 +177,11 @@ impl RpcMethod {
let mut param_types: Vec<_> = self
.trait_item
.sig
.decl
.inputs
.iter()
.cloned()
.filter_map(|arg| match arg {
syn::FnArg::Captured(arg_captured) => Some(arg_captured.ty),
syn::FnArg::Ignored(ty) => Some(ty),
syn::FnArg::Typed(ty) => Some(*ty.ty),
_ => None,
})
.collect();
Expand Down Expand Up @@ -225,7 +217,7 @@ impl RpcMethod {
};

let method_ident = self.ident();
let result = &self.trait_item.sig.decl.output;
let result = &self.trait_item.sig.output;
let extra_closure_args: &Vec<_> = &special_args.iter().cloned().map(|arg| arg.0).collect();
let extra_method_types: &Vec<_> = &special_args.iter().cloned().map(|arg| arg.1).collect();

Expand Down Expand Up @@ -380,11 +372,7 @@ fn ident(s: &str) -> syn::Ident {

fn is_option_type(ty: &syn::Type) -> bool {
if let syn::Type::Path(path) = ty {
path.path
.segments
.first()
.map(|t| t.value().ident == "Option")
.unwrap_or(false)
path.path.segments.first().map_or(false, |t| t.ident == "Option")
} else {
false
}
Expand Down