Skip to content

Commit 44ed27e

Browse files
committed
Update to newest syn
1 parent c07e932 commit 44ed27e

File tree

7 files changed

+52
-34
lines changed

7 files changed

+52
-34
lines changed

Cargo.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

derive/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ edition = "2018"
1111
proc-macro = true
1212

1313
[dependencies]
14-
syn = { version = "0.15.29", features = ["full"] }
15-
quote = "0.6.11"
16-
proc-macro2 = "0.4.27"
14+
syn = { version = "1.0", features = ["full"] }
15+
quote = "1.0"
16+
proc-macro2 = "1.0"
1717
rustpython-compiler = { path = "../compiler", version = "0.1.1" }
1818
rustpython-bytecode = { path = "../bytecode", version = "0.1.1" }
1919
maplit = "1.0"

derive/src/compile_bytecode.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -176,20 +176,24 @@ impl PyCompileInput {
176176

177177
for meta in &self.metas {
178178
if let Meta::NameValue(name_value) = meta {
179-
if name_value.ident == "mode" {
179+
let ident = match name_value.path.get_ident() {
180+
Some(ident) => ident,
181+
None => continue,
182+
};
183+
if ident == "mode" {
180184
match &name_value.lit {
181185
Lit::Str(s) => match s.value().parse() {
182186
Ok(mode_val) => mode = Some(mode_val),
183187
Err(e) => bail_span!(s, "{}", e),
184188
},
185189
_ => bail_span!(name_value.lit, "mode must be a string"),
186190
}
187-
} else if name_value.ident == "module_name" {
191+
} else if ident == "module_name" {
188192
module_name = Some(match &name_value.lit {
189193
Lit::Str(s) => s.value(),
190194
_ => bail_span!(name_value.lit, "module_name must be string"),
191195
})
192-
} else if name_value.ident == "source" {
196+
} else if ident == "source" {
193197
assert_source_empty(&source)?;
194198
let code = match &name_value.lit {
195199
Lit::Str(s) => s.value(),
@@ -199,7 +203,7 @@ impl PyCompileInput {
199203
kind: CompilationSourceKind::SourceCode(code),
200204
span: extract_spans(&name_value).unwrap(),
201205
});
202-
} else if name_value.ident == "file" {
206+
} else if ident == "file" {
203207
assert_source_empty(&source)?;
204208
let path = match &name_value.lit {
205209
Lit::Str(s) => PathBuf::from(s.value()),
@@ -209,7 +213,7 @@ impl PyCompileInput {
209213
kind: CompilationSourceKind::File(path),
210214
span: extract_spans(&name_value).unwrap(),
211215
});
212-
} else if name_value.ident == "dir" {
216+
} else if ident == "dir" {
213217
assert_source_empty(&source)?;
214218
let path = match &name_value.lit {
215219
Lit::Str(s) => PathBuf::from(s.value()),

derive/src/from_args.rs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::util::path_eq;
12
use crate::Diagnostic;
23
use proc_macro2::TokenStream as TokenStream2;
34
use quote::quote;
@@ -45,7 +46,9 @@ impl ArgAttribute {
4546
err_span!(list, "There must be at least one argument to #[pyarg()]")
4647
})?;
4748
let kind = match first_arg {
48-
NestedMeta::Meta(Meta::Word(ident)) => ParameterKind::from_ident(ident),
49+
NestedMeta::Meta(Meta::Path(path)) => {
50+
path.get_ident().and_then(ParameterKind::from_ident)
51+
}
4952
_ => None,
5053
};
5154
let kind = kind.ok_or_else(|| {
@@ -79,21 +82,21 @@ impl ArgAttribute {
7982

8083
fn parse_argument(&mut self, arg: &NestedMeta) -> Result<(), Diagnostic> {
8184
match arg {
82-
NestedMeta::Meta(Meta::Word(ident)) => {
83-
if ident == "default" {
85+
NestedMeta::Meta(Meta::Path(path)) => {
86+
if path_eq(&path, "default") {
8487
if self.default.is_some() {
85-
bail_span!(ident, "Default already set");
88+
bail_span!(path, "Default already set");
8689
}
8790
let expr = parse_quote!(Default::default());
8891
self.default = Some(expr);
89-
} else if ident == "optional" {
92+
} else if path_eq(&path, "optional") {
9093
self.optional = true;
9194
} else {
92-
bail_span!(ident, "Unrecognised pyarg attribute");
95+
bail_span!(path, "Unrecognised pyarg attribute");
9396
}
9497
}
9598
NestedMeta::Meta(Meta::NameValue(name_value)) => {
96-
if name_value.ident == "default" {
99+
if path_eq(&name_value.path, "default") {
97100
if self.default.is_some() {
98101
bail_span!(name_value, "Default already set");
99102
}
@@ -107,7 +110,7 @@ impl ArgAttribute {
107110
}
108111
_ => bail_span!(name_value, "Expected string value for default argument"),
109112
}
110-
} else if name_value.ident == "optional" {
113+
} else if path_eq(&name_value.path, "optional") {
111114
match name_value.lit {
112115
Lit::Bool(ref val) => {
113116
self.optional = val.value;

derive/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ mod error;
1212
mod compile_bytecode;
1313
mod from_args;
1414
mod pyclass;
15+
mod util;
1516

1617
use error::{extract_spans, Diagnostic};
1718
use proc_macro::TokenStream;

derive/src/pyclass.rs

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
use super::Diagnostic;
2+
use crate::util::path_eq;
23
use proc_macro2::{Span, TokenStream as TokenStream2};
34
use quote::{quote, quote_spanned};
45
use std::collections::{HashMap, HashSet};
56
use syn::{
6-
spanned::Spanned, Attribute, AttributeArgs, Ident, ImplItem, Index, Item, Lit, Meta, MethodSig,
7-
NestedMeta,
7+
spanned::Spanned, Attribute, AttributeArgs, Ident, ImplItem, Index, Item, Lit, Meta,
8+
NestedMeta, Signature,
89
};
910

1011
fn meta_to_vec(meta: Meta) -> Result<Vec<NestedMeta>, Meta> {
1112
match meta {
12-
Meta::Word(_) => Ok(Vec::new()),
13+
Meta::Path(_) => Ok(Vec::new()),
1314
Meta::List(list) => Ok(list.nested.into_iter().collect()),
1415
Meta::NameValue(_) => Err(meta),
1516
}
@@ -56,7 +57,7 @@ impl Class {
5657
fn extract_item_from_syn(
5758
&mut self,
5859
attrs: &mut Vec<Attribute>,
59-
sig: &MethodSig,
60+
sig: &Signature,
6061
) -> Result<(), Diagnostic> {
6162
let mut attr_idxs = Vec::new();
6263
for (i, meta) in attrs
@@ -65,7 +66,10 @@ impl Class {
6566
.enumerate()
6667
{
6768
let meta_span = meta.span();
68-
let name = meta.name();
69+
let name = match meta.path().get_ident() {
70+
Some(name) => name,
71+
None => continue,
72+
};
6973
if name == "pymethod" {
7074
let nesteds = meta_to_vec(meta).map_err(|meta| {
7175
err_span!(
@@ -78,10 +82,10 @@ impl Class {
7882
for meta in nesteds {
7983
let meta = match meta {
8084
NestedMeta::Meta(meta) => meta,
81-
NestedMeta::Literal(_) => continue,
85+
NestedMeta::Lit(_) => continue,
8286
};
8387
if let Meta::NameValue(name_value) = meta {
84-
if name_value.ident == "name" {
88+
if path_eq(&name_value.path, "name") {
8589
if let Lit::Str(s) = &name_value.lit {
8690
py_name = Some(s.value());
8791
} else {
@@ -110,10 +114,10 @@ impl Class {
110114
for meta in nesteds {
111115
let meta = match meta {
112116
NestedMeta::Meta(meta) => meta,
113-
NestedMeta::Literal(_) => continue,
117+
NestedMeta::Lit(_) => continue,
114118
};
115119
if let Meta::NameValue(name_value) = meta {
116-
if name_value.ident == "name" {
120+
if path_eq(&name_value.path, "name") {
117121
if let Lit::Str(s) = &name_value.lit {
118122
py_name = Some(s.value());
119123
} else {
@@ -146,11 +150,11 @@ impl Class {
146150
for meta in nesteds {
147151
let meta = match meta {
148152
NestedMeta::Meta(meta) => meta,
149-
NestedMeta::Literal(_) => continue,
153+
NestedMeta::Lit(_) => continue,
150154
};
151155
match meta {
152156
Meta::NameValue(name_value) => {
153-
if name_value.ident == "name" {
157+
if path_eq(&name_value.path, "name") {
154158
if let Lit::Str(s) = &name_value.lit {
155159
py_name = Some(s.value());
156160
} else {
@@ -161,8 +165,8 @@ impl Class {
161165
}
162166
}
163167
}
164-
Meta::Word(ident) => {
165-
if ident == "setter" {
168+
Meta::Path(path) => {
169+
if path_eq(&path, "setter") {
166170
setter = true;
167171
}
168172
}
@@ -223,7 +227,10 @@ impl Class {
223227
}
224228
} else {
225229
match nesteds.into_iter().next().unwrap() {
226-
NestedMeta::Meta(Meta::Word(ident)) => ident,
230+
NestedMeta::Meta(Meta::Path(path)) => path
231+
.get_ident()
232+
.cloned()
233+
.ok_or_else(|| err_span!(path, "{}", pyslot_err))?,
227234
bad => bail_span!(bad, "{}", pyslot_err),
228235
}
229236
};
@@ -371,7 +378,7 @@ fn generate_class_def(
371378
for attr in attr {
372379
if let NestedMeta::Meta(meta) = attr {
373380
if let Meta::NameValue(name_value) = meta {
374-
if name_value.ident == "name" {
381+
if path_eq(&name_value.path, "name") {
375382
if let Lit::Str(s) = name_value.lit {
376383
class_name = Some(s.value());
377384
} else {

derive/src/util.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub fn path_eq(path: &syn::Path, s: &str) -> bool {
2+
path.get_ident().map_or(false, |id| id == s)
3+
}

0 commit comments

Comments
 (0)