[INFO] crate pyo3-derive-backend 0.5.2 is already in cache [INFO] extracting crate pyo3-derive-backend 0.5.2 into work/ex/clippy-test-run/sources/stable/reg/pyo3-derive-backend/0.5.2 [INFO] extracting crate pyo3-derive-backend 0.5.2 into work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/pyo3-derive-backend/0.5.2 [INFO] validating manifest of pyo3-derive-backend-0.5.2 on toolchain stable [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] validating manifest of pyo3-derive-backend-0.5.2 on toolchain stable+rustflags=-Dclippy::into_iter_on_array [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] started frobbing pyo3-derive-backend-0.5.2 [INFO] finished frobbing pyo3-derive-backend-0.5.2 [INFO] frobbed toml for pyo3-derive-backend-0.5.2 written to work/ex/clippy-test-run/sources/stable/reg/pyo3-derive-backend/0.5.2/Cargo.toml [INFO] started frobbing pyo3-derive-backend-0.5.2 [INFO] finished frobbing pyo3-derive-backend-0.5.2 [INFO] frobbed toml for pyo3-derive-backend-0.5.2 written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/pyo3-derive-backend/0.5.2/Cargo.toml [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "generate-lockfile" "--manifest-path" "Cargo.toml" "-Zno-index-update"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "generate-lockfile" "--manifest-path" "Cargo.toml" "-Zno-index-update"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] linting pyo3-derive-backend-0.5.2 against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-5/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/reg/pyo3-derive-backend/0.5.2:/opt/crater/workdir:ro,Z" "-v" "/mnt/big/crater/work/local/cargo-home:/opt/crater/cargo-home:ro,Z" "-v" "/mnt/big/crater/work/local/rustup-home:/opt/crater/rustup-home:ro,Z" "-e" "USER_ID=1000" "-e" "SOURCE_DIR=/opt/crater/workdir" "-e" "MAP_USER_ID=1000" "-e" "CARGO_TARGET_DIR=/opt/crater/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/crater/cargo-home" "-e" "RUSTUP_HOME=/opt/crater/rustup-home" "-w" "/opt/crater/workdir" "-m" "1536M" "--network" "none" "rustops/crates-build-env" "/opt/crater/cargo-home/bin/cargo" "+stable" "clippy" "--frozen" "--all" "--all-targets"` [INFO] [stdout] 833753d2c1d016235723dae6479c6cdb7d4c813159dcbc42e56b98667d7ac3b1 [INFO] running `"docker" "start" "-a" "833753d2c1d016235723dae6479c6cdb7d4c813159dcbc42e56b98667d7ac3b1"` [INFO] [stderr] Checking syn v0.15.26 [INFO] [stderr] Checking pyo3-derive-backend v0.5.2 (/opt/crater/workdir) [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/method.rs:103:25 [INFO] [stderr] | [INFO] [stderr] 103 | ty: ty, [INFO] [stderr] | ^^^^^^ help: replace it with: `ty` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_field_names)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/method.rs:105:25 [INFO] [stderr] | [INFO] [stderr] 105 | py: py, [INFO] [stderr] | ^^^^^^ help: replace it with: `py` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/module.rs:89:17 [INFO] [stderr] | [INFO] [stderr] 89 | mutability: mutability, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `mutability` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/module.rs:90:17 [INFO] [stderr] | [INFO] [stderr] 90 | by_ref: by_ref, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `by_ref` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/method.rs:103:25 [INFO] [stderr] | [INFO] [stderr] 103 | ty: ty, [INFO] [stderr] | ^^^^^^ help: replace it with: `ty` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_field_names)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/method.rs:105:25 [INFO] [stderr] | [INFO] [stderr] 105 | py: py, [INFO] [stderr] | ^^^^^^ help: replace it with: `py` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/module.rs:89:17 [INFO] [stderr] | [INFO] [stderr] 89 | mutability: mutability, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `mutability` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/module.rs:90:17 [INFO] [stderr] | [INFO] [stderr] 90 | by_ref: by_ref, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `by_ref` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/args.rs:67:32 [INFO] [stderr] | [INFO] [stderr] 67 | } else { [INFO] [stderr] | ________________________________^ [INFO] [stderr] 68 | | if has_varargs { [INFO] [stderr] 69 | | arguments [INFO] [stderr] 70 | | .push(Argument::Kwarg(nv.ident.clone(), litstr.value().clone())) [INFO] [stderr] ... | [INFO] [stderr] 84 | | } [INFO] [stderr] 85 | | } [INFO] [stderr] | |_________________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::collapsible_if)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 67 | } else if has_varargs { [INFO] [stderr] 68 | arguments [INFO] [stderr] 69 | .push(Argument::Kwarg(nv.ident.clone(), litstr.value().clone())) [INFO] [stderr] 70 | } else { [INFO] [stderr] 71 | if has_kwargs { [INFO] [stderr] 72 | println!( [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/py_class.rs:349:5 [INFO] [stderr] | [INFO] [stderr] 349 | return false; [INFO] [stderr] | ^^^^^^^^^^^^^ help: remove `return` as shown: `false` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_return)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/py_method.rs:497:12 [INFO] [stderr] | [INFO] [stderr] 497 | } else { [INFO] [stderr] | ____________^ [INFO] [stderr] 498 | | if let Some(_) = arg.optional { [INFO] [stderr] 499 | | // default value [INFO] [stderr] 500 | | let mut default = TokenStream::new(); [INFO] [stderr] ... | [INFO] [stderr] 554 | | } [INFO] [stderr] 555 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 497 | } else if let Some(_) = arg.optional { [INFO] [stderr] 498 | // default value [INFO] [stderr] 499 | let mut default = TokenStream::new(); [INFO] [stderr] 500 | if let Some(d) = spec.default_value(name) { [INFO] [stderr] 501 | let dt = quote! { Some(#d) }; [INFO] [stderr] 502 | dt.to_tokens(&mut default); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/args.rs:67:32 [INFO] [stderr] | [INFO] [stderr] 67 | } else { [INFO] [stderr] | ________________________________^ [INFO] [stderr] 68 | | if has_varargs { [INFO] [stderr] 69 | | arguments [INFO] [stderr] 70 | | .push(Argument::Kwarg(nv.ident.clone(), litstr.value().clone())) [INFO] [stderr] ... | [INFO] [stderr] 84 | | } [INFO] [stderr] 85 | | } [INFO] [stderr] | |_________________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::collapsible_if)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 67 | } else if has_varargs { [INFO] [stderr] 68 | arguments [INFO] [stderr] 69 | .push(Argument::Kwarg(nv.ident.clone(), litstr.value().clone())) [INFO] [stderr] 70 | } else { [INFO] [stderr] 71 | if has_kwargs { [INFO] [stderr] 72 | println!( [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/py_class.rs:349:5 [INFO] [stderr] | [INFO] [stderr] 349 | return false; [INFO] [stderr] | ^^^^^^^^^^^^^ help: remove `return` as shown: `false` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_return)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/py_method.rs:497:12 [INFO] [stderr] | [INFO] [stderr] 497 | } else { [INFO] [stderr] | ____________^ [INFO] [stderr] 498 | | if let Some(_) = arg.optional { [INFO] [stderr] 499 | | // default value [INFO] [stderr] 500 | | let mut default = TokenStream::new(); [INFO] [stderr] ... | [INFO] [stderr] 554 | | } [INFO] [stderr] 555 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 497 | } else if let Some(_) = arg.optional { [INFO] [stderr] 498 | // default value [INFO] [stderr] 499 | let mut default = TokenStream::new(); [INFO] [stderr] 500 | if let Some(d) = spec.default_value(name) { [INFO] [stderr] 501 | let dt = quote! { Some(#d) }; [INFO] [stderr] 502 | dt.to_tokens(&mut default); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/args.rs:134:17 [INFO] [stderr] | [INFO] [stderr] 134 | / match lit { [INFO] [stderr] 135 | | &syn::Lit::Str(ref lits) => { [INFO] [stderr] 136 | | // #[args("*")] [INFO] [stderr] 137 | | if lits.value() == "*" { [INFO] [stderr] ... | [INFO] [stderr] 166 | | } [INFO] [stderr] 167 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_ref_pats)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 134 | match *lit { [INFO] [stderr] 135 | syn::Lit::Str(ref lits) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: defining a method called `eq` on this type; consider implementing the `std::cmp::PartialEq` trait or choosing a less ambiguous name [INFO] [stderr] --> src/func.rs:58:5 [INFO] [stderr] | [INFO] [stderr] 58 | / pub fn eq(&self, name: &str) -> bool { [INFO] [stderr] 59 | | match *self { [INFO] [stderr] 60 | | MethodProto::Free { name: n, .. } => n == name, [INFO] [stderr] 61 | | MethodProto::Unary { name: n, .. } => n == name, [INFO] [stderr] ... | [INFO] [stderr] 67 | | } [INFO] [stderr] 68 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::should_implement_trait)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait [INFO] [stderr] [INFO] [stderr] error: using `clone` on a double-reference; this will copy the reference instead of cloning the inner type [INFO] [stderr] --> src/func.rs:374:31 [INFO] [stderr] | [INFO] [stderr] 374 | let seg = ty.path.segments.last().unwrap().value().clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::clone_double_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_double_ref [INFO] [stderr] help: try dereferencing it [INFO] [stderr] | [INFO] [stderr] 374 | let seg = &(*ty.path.segments.last().unwrap().value()).clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] help: or try being explicit about what type to clone [INFO] [stderr] | [INFO] [stderr] 374 | let seg = &syn::PathSegment::clone(ty.path.segments.last().unwrap().value()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/func.rs:376:25 [INFO] [stderr] | [INFO] [stderr] 376 | / match seg.arguments { [INFO] [stderr] 377 | | syn::PathArguments::AngleBracketed(ref data) => { [INFO] [stderr] 378 | | if let Some(pair) = data.args.last() { [INFO] [stderr] 379 | | match pair.value() { [INFO] [stderr] ... | [INFO] [stderr] 385 | | _ => (), [INFO] [stderr] 386 | | } [INFO] [stderr] | |_________________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 376 | if let syn::PathArguments::AngleBracketed(ref data) = seg.arguments { [INFO] [stderr] 377 | if let Some(pair) = data.args.last() { [INFO] [stderr] 378 | match pair.value() { [INFO] [stderr] 379 | syn::GenericArgument::Type(ref ty) => return ty.clone(), [INFO] [stderr] 380 | _ => panic!("Option only accepted for concrete types"), [INFO] [stderr] 381 | } [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/func.rs:409:5 [INFO] [stderr] | [INFO] [stderr] 409 | / match ty { [INFO] [stderr] 410 | | &syn::Type::Path(ref typath) => { [INFO] [stderr] 411 | | if let Some(segment) = typath.path.segments.last() { [INFO] [stderr] 412 | | match segment.value().ident.to_string().as_str() { [INFO] [stderr] ... | [INFO] [stderr] 450 | | _ => panic!("not supported: {:?}", ty), [INFO] [stderr] 451 | | }; [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 409 | match *ty { [INFO] [stderr] 410 | syn::Type::Path(ref typath) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/func.rs:420:29 [INFO] [stderr] | [INFO] [stderr] 420 | / match data.args[0] { [INFO] [stderr] 421 | | syn::GenericArgument::Type(syn::Type::Path(ref typath)) => { [INFO] [stderr] 422 | | if let Some(segment) = typath.path.segments.last() { [INFO] [stderr] 423 | | match segment.value().ident.to_string().as_str() { [INFO] [stderr] ... | [INFO] [stderr] 436 | | _ => (), [INFO] [stderr] 437 | | } [INFO] [stderr] | |_____________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 420 | if let syn::GenericArgument::Type(syn::Type::Path(ref typath)) = data.args[0] { [INFO] [stderr] 421 | if let Some(segment) = typath.path.segments.last() { [INFO] [stderr] 422 | match segment.value().ident.to_string().as_str() { [INFO] [stderr] 423 | // get T from Option [INFO] [stderr] 424 | "Option" => match segment.value().arguments { [INFO] [stderr] 425 | syn::PathArguments::AngleBracketed(ref data) => { [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/func.rs:423:41 [INFO] [stderr] | [INFO] [stderr] 423 | / match segment.value().ident.to_string().as_str() { [INFO] [stderr] 424 | | // get T from Option [INFO] [stderr] 425 | | "Option" => match segment.value().arguments { [INFO] [stderr] 426 | | syn::PathArguments::AngleBracketed(ref data) => { [INFO] [stderr] ... | [INFO] [stderr] 432 | | _ => (), [INFO] [stderr] 433 | | } [INFO] [stderr] | |_________________________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 423 | if let "Option" = segment.value().ident.to_string().as_str() { match segment.value().arguments { [INFO] [stderr] 424 | syn::PathArguments::AngleBracketed(ref data) => { [INFO] [stderr] 425 | result = false; [INFO] [stderr] 426 | succ = data.args[0].clone(); [INFO] [stderr] 427 | } [INFO] [stderr] 428 | _ => (), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/func.rs:425:57 [INFO] [stderr] | [INFO] [stderr] 425 | "Option" => match segment.value().arguments { [INFO] [stderr] | _________________________________________________________^ [INFO] [stderr] 426 | | syn::PathArguments::AngleBracketed(ref data) => { [INFO] [stderr] 427 | | result = false; [INFO] [stderr] 428 | | succ = data.args[0].clone(); [INFO] [stderr] 429 | | } [INFO] [stderr] 430 | | _ => (), [INFO] [stderr] 431 | | }, [INFO] [stderr] | |_____________________________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 425 | "Option" => if let syn::PathArguments::AngleBracketed(ref data) = segment.value().arguments { [INFO] [stderr] 426 | result = false; [INFO] [stderr] 427 | succ = data.args[0].clone(); [INFO] [stderr] 428 | }, [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: using `clone` on a double-reference; this will copy the reference instead of cloning the inner type [INFO] [stderr] --> src/func.rs:476:27 [INFO] [stderr] | [INFO] [stderr] 476 | let seg = typath.path.segments.last().unwrap().value().clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_double_ref [INFO] [stderr] help: try dereferencing it [INFO] [stderr] | [INFO] [stderr] 476 | let seg = &(*typath.path.segments.last().unwrap().value()).clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] help: or try being explicit about what type to clone [INFO] [stderr] | [INFO] [stderr] 476 | let seg = &syn::PathSegment::clone(typath.path.segments.last().unwrap().value()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/method.rs:60:13 [INFO] [stderr] | [INFO] [stderr] 60 | / match input { [INFO] [stderr] 61 | | &syn::FnArg::SelfRef(_) => { [INFO] [stderr] 62 | | has_self = true; [INFO] [stderr] 63 | | } [INFO] [stderr] ... | [INFO] [stderr] 110 | | &syn::FnArg::Inferred(_) => panic!("ingerred argument: {:?}", name), [INFO] [stderr] 111 | | } [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 60 | match *input { [INFO] [stderr] 61 | syn::FnArg::SelfRef(_) => { [INFO] [stderr] 62 | has_self = true; [INFO] [stderr] 63 | } [INFO] [stderr] 64 | syn::FnArg::SelfValue(_) => { [INFO] [stderr] 65 | has_self = true; [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/method.rs:76:55 [INFO] [stderr] | [INFO] [stderr] 76 | let (ident, by_ref, mutability) = match pat { [INFO] [stderr] | _______________________________________________________^ [INFO] [stderr] 77 | | &syn::Pat::Ident(syn::PatIdent { [INFO] [stderr] 78 | | ref ident, [INFO] [stderr] 79 | | ref by_ref, [INFO] [stderr] ... | [INFO] [stderr] 83 | | _ => panic!("unsupported argument: {:?}", pat), [INFO] [stderr] 84 | | }; [INFO] [stderr] | |_____________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 76 | let (ident, by_ref, mutability) = match *pat { [INFO] [stderr] 77 | syn::Pat::Ident(syn::PatIdent { [INFO] [stderr] 78 | ref ident, [INFO] [stderr] 79 | ref by_ref, [INFO] [stderr] 80 | ref mutability, [INFO] [stderr] 81 | .. [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/method.rs:86:30 [INFO] [stderr] | [INFO] [stderr] 86 | let py = match ty { [INFO] [stderr] | ______________________________^ [INFO] [stderr] 87 | | &syn::Type::Path(syn::TypePath { ref path, .. }) => { [INFO] [stderr] 88 | | if let Some(segment) = path.segments.last() { [INFO] [stderr] 89 | | segment.value().ident == "Python" [INFO] [stderr] ... | [INFO] [stderr] 94 | | _ => false, [INFO] [stderr] 95 | | }; [INFO] [stderr] | |_____________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 86 | let py = match *ty { [INFO] [stderr] 87 | syn::Type::Path(syn::TypePath { ref path, .. }) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/method.rs:126:13 [INFO] [stderr] | [INFO] [stderr] 126 | / match *s { [INFO] [stderr] 127 | | Argument::VarArgs(ref ident) => return name == ident, [INFO] [stderr] 128 | | _ => (), [INFO] [stderr] 129 | | } [INFO] [stderr] | |_____________^ help: try this: `if let Argument::VarArgs(ref ident) = *s { return name == ident }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/method.rs:147:13 [INFO] [stderr] | [INFO] [stderr] 147 | / match *s { [INFO] [stderr] 148 | | Argument::KeywordArgs(ref ident) => return name == ident, [INFO] [stderr] 149 | | _ => (), [INFO] [stderr] 150 | | } [INFO] [stderr] | |_____________^ help: try this: `if let Argument::KeywordArgs(ref ident) = *s { return name == ident }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/method.rs:157:13 [INFO] [stderr] | [INFO] [stderr] 157 | / match *s { [INFO] [stderr] 158 | | Argument::KeywordArgs(_) => return true, [INFO] [stderr] 159 | | _ => (), [INFO] [stderr] 160 | | } [INFO] [stderr] | |_____________^ help: try this: `if let Argument::KeywordArgs(_) = *s { return true }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/method.rs:170:25 [INFO] [stderr] | [INFO] [stderr] 170 | / if let &Some(ref val) = opt { [INFO] [stderr] 171 | | let i: syn::Expr = syn::parse_str(&val).unwrap(); [INFO] [stderr] 172 | | return Some(i.into_token_stream()); [INFO] [stderr] 173 | | } [INFO] [stderr] | |_________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 170 | if let Some(ref val) = *opt { [INFO] [stderr] | ^^^^^^^^^^^^^ ^^^^ [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/method.rs:190:13 [INFO] [stderr] | [INFO] [stderr] 190 | / match *s { [INFO] [stderr] 191 | | Argument::Kwarg(ref ident, _) => { [INFO] [stderr] 192 | | if ident == name { [INFO] [stderr] 193 | | return true; [INFO] [stderr] ... | [INFO] [stderr] 196 | | _ => (), [INFO] [stderr] 197 | | } [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 190 | if let Argument::Kwarg(ref ident, _) = *s { [INFO] [stderr] 191 | if ident == name { [INFO] [stderr] 192 | return true; [INFO] [stderr] 193 | } [INFO] [stderr] 194 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/method.rs:204:5 [INFO] [stderr] | [INFO] [stderr] 204 | / match ty { [INFO] [stderr] 205 | | &syn::Type::Reference(_) => return true, [INFO] [stderr] 206 | | &syn::Type::Path(syn::TypePath { ref path, .. }) => { [INFO] [stderr] 207 | | if let Some(segment) = path.segments.last() { [INFO] [stderr] ... | [INFO] [stderr] 233 | | _ => (), [INFO] [stderr] 234 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 204 | match *ty { [INFO] [stderr] 205 | syn::Type::Reference(_) => return true, [INFO] [stderr] 206 | syn::Type::Path(syn::TypePath { ref path, .. }) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/method.rs:208:17 [INFO] [stderr] | [INFO] [stderr] 208 | / match segment.value().ident.to_string().as_str() { [INFO] [stderr] 209 | | "Option" => match segment.value().arguments { [INFO] [stderr] 210 | | syn::PathArguments::AngleBracketed(ref params) => { [INFO] [stderr] 211 | | if params.args.len() != 1 { [INFO] [stderr] ... | [INFO] [stderr] 229 | | _ => (), [INFO] [stderr] 230 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 208 | if let "Option" = segment.value().ident.to_string().as_str() { match segment.value().arguments { [INFO] [stderr] 209 | syn::PathArguments::AngleBracketed(ref params) => { [INFO] [stderr] 210 | if params.args.len() != 1 { [INFO] [stderr] 211 | panic!("argument type is not supported by python method: {:?} ({:?}) {:?}", [INFO] [stderr] 212 | name, [INFO] [stderr] 213 | ty, [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/method.rs:217:29 [INFO] [stderr] | [INFO] [stderr] 217 | / match ¶ms.args[params.args.len() - 1] { [INFO] [stderr] 218 | | &syn::GenericArgument::Type(syn::Type::Reference(_)) => return true, [INFO] [stderr] 219 | | _ => (), [INFO] [stderr] 220 | | } [INFO] [stderr] | |_____________________________^ help: try this: `if let &syn::GenericArgument::Type(syn::Type::Reference(_)) = ¶ms.args[params.args.len() - 1] { return true }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/method.rs:217:29 [INFO] [stderr] | [INFO] [stderr] 217 | / match ¶ms.args[params.args.len() - 1] { [INFO] [stderr] 218 | | &syn::GenericArgument::Type(syn::Type::Reference(_)) => return true, [INFO] [stderr] 219 | | _ => (), [INFO] [stderr] 220 | | } [INFO] [stderr] | |_____________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 217 | match params.args[params.args.len() - 1] { [INFO] [stderr] 218 | syn::GenericArgument::Type(syn::Type::Reference(_)) => return true, [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/method.rs:242:5 [INFO] [stderr] | [INFO] [stderr] 242 | / match ty { [INFO] [stderr] 243 | | &syn::Type::Path(syn::TypePath { ref path, .. }) => { [INFO] [stderr] 244 | | //if let &Some(ref qs) = qs { [INFO] [stderr] 245 | | // panic!("explicit Self type in a 'qualified path' is not supported: {:?} - {:?}", [INFO] [stderr] ... | [INFO] [stderr] 286 | | } [INFO] [stderr] 287 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 242 | match *ty { [INFO] [stderr] 243 | syn::Type::Path(syn::TypePath { ref path, .. }) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/method.rs:260:29 [INFO] [stderr] | [INFO] [stderr] 260 | / match ¶ms.args[0] { [INFO] [stderr] 261 | | &syn::GenericArgument::Type(ref ty) => Some(ty), [INFO] [stderr] 262 | | _ => panic!("argument type is not supported by python method: {:?} ({:?}) {:?}", [INFO] [stderr] 263 | | name, [INFO] [stderr] 264 | | ty, [INFO] [stderr] 265 | | path), [INFO] [stderr] 266 | | } [INFO] [stderr] | |_________________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 260 | match params.args[0] { [INFO] [stderr] 261 | syn::GenericArgument::Type(ref ty) => Some(ty), [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/module.rs:68:5 [INFO] [stderr] | [INFO] [stderr] 68 | / match input { [INFO] [stderr] 69 | | &syn::FnArg::SelfRef(_) | &syn::FnArg::SelfValue(_) => None, [INFO] [stderr] 70 | | &syn::FnArg::Captured(ref cap) => { [INFO] [stderr] 71 | | let (mutability, by_ref, ident) = match cap.pat { [INFO] [stderr] ... | [INFO] [stderr] 98 | | &syn::FnArg::Inferred(_) => panic!("inferred argument: {:?}", name), [INFO] [stderr] 99 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 68 | match *input { [INFO] [stderr] 69 | syn::FnArg::SelfRef(_) | syn::FnArg::SelfValue(_) => None, [INFO] [stderr] 70 | syn::FnArg::Captured(ref cap) => { [INFO] [stderr] 71 | let (mutability, by_ref, ident) = match cap.pat { [INFO] [stderr] 72 | syn::Pat::Ident(ref patid) => (&patid.mutability, &patid.by_ref, &patid.ident), [INFO] [stderr] 73 | _ => panic!("unsupported argument: {:?}", cap.pat), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/py_class.rs:10:58 [INFO] [stderr] | [INFO] [stderr] 10 | pub fn build_py_class(class: &mut syn::ItemStruct, attr: &Vec) -> TokenStream { [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: change this to: `&[syn::Expr]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/py_class.rs:46:25 [INFO] [stderr] | [INFO] [stderr] 46 | / if let &syn::NestedMeta::Meta(ref metaitem) = meta { [INFO] [stderr] 47 | | match metaitem.name().to_string().as_str() { [INFO] [stderr] 48 | | "get" => { [INFO] [stderr] 49 | | descs.push(FnType::Getter(None)); [INFO] [stderr] ... | [INFO] [stderr] 57 | | } [INFO] [stderr] 58 | | } [INFO] [stderr] | |_________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 46 | if let syn::NestedMeta::Meta(ref metaitem) = *meta { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/py_class.rs:341:5 [INFO] [stderr] | [INFO] [stderr] 341 | / match field.ty { [INFO] [stderr] 342 | | syn::Type::Path(ref typath) => { [INFO] [stderr] 343 | | if let Some(segment) = typath.path.segments.last() { [INFO] [stderr] 344 | | return segment.value().ident.to_string() == "PyToken"; [INFO] [stderr] ... | [INFO] [stderr] 347 | | _ => (), [INFO] [stderr] 348 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 341 | if let syn::Type::Path(ref typath) = field.ty { [INFO] [stderr] 342 | if let Some(segment) = typath.path.segments.last() { [INFO] [stderr] 343 | return segment.value().ident.to_string() == "PyToken"; [INFO] [stderr] 344 | } [INFO] [stderr] 345 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: this creates an owned instance just for comparison [INFO] [stderr] --> src/py_class.rs:344:24 [INFO] [stderr] | [INFO] [stderr] 344 | return segment.value().ident.to_string() == "PyToken"; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `*segment.value().ident` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cmp_owned)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cmp_owned [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/py_class.rs:353:11 [INFO] [stderr] | [INFO] [stderr] 353 | args: &Vec, [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: change this to: `&[syn::Expr]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: this lifetime isn't used in the function definition [INFO] [stderr] --> src/py_method.rs:10:22 [INFO] [stderr] | [INFO] [stderr] 10 | pub fn gen_py_method<'a>( [INFO] [stderr] | ^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::extra_unused_lifetimes)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#extra_unused_lifetimes [INFO] [stderr] [INFO] [stderr] warning: length comparison to one [INFO] [stderr] --> src/py_method.rs:336:8 [INFO] [stderr] | [INFO] [stderr] 336 | if spec.args.len() < 1 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `spec.args.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: You are using an explicit closure for cloning elements [INFO] [stderr] --> src/py_method.rs:387:28 [INFO] [stderr] | [INFO] [stderr] 387 | let args: Vec = spec [INFO] [stderr] | ____________________________^ [INFO] [stderr] 388 | | .args [INFO] [stderr] 389 | | .iter() [INFO] [stderr] 390 | | .filter(|item| !item.py) [INFO] [stderr] 391 | | .map(|item| item.clone()) [INFO] [stderr] | |_________________________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::map_clone)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_clone [INFO] [stderr] help: Consider calling the dedicated `cloned` method [INFO] [stderr] | [INFO] [stderr] 387 | let args: Vec = spec [INFO] [stderr] 388 | .args [INFO] [stderr] 389 | .iter() [INFO] [stderr] 390 | .filter(|item| !item.py).cloned() [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: redundant pattern matching, consider using `is_some()` [INFO] [stderr] --> src/py_method.rs:411:30 [INFO] [stderr] | [INFO] [stderr] 411 | let opt = if let Some(_) = arg.optional { [INFO] [stderr] | _______________________- ^^^^^^^ [INFO] [stderr] 412 | | syn::Ident::new("true", Span::call_site()) [INFO] [stderr] 413 | | } else if let Some(_) = spec.default_value(&arg.name) { [INFO] [stderr] 414 | | syn::Ident::new("true", Span::call_site()) [INFO] [stderr] 415 | | } else { [INFO] [stderr] 416 | | syn::Ident::new("false", Span::call_site()) [INFO] [stderr] 417 | | }; [INFO] [stderr] | |_____________- help: try this: `if arg.optional.is_some()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_pattern_matching)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stderr] [INFO] [stderr] warning: redundant pattern matching, consider using `is_some()` [INFO] [stderr] --> src/py_method.rs:413:27 [INFO] [stderr] | [INFO] [stderr] 413 | } else if let Some(_) = spec.default_value(&arg.name) { [INFO] [stderr] | ____________________- ^^^^^^^ [INFO] [stderr] 414 | | syn::Ident::new("true", Span::call_site()) [INFO] [stderr] 415 | | } else { [INFO] [stderr] 416 | | syn::Ident::new("false", Span::call_site()) [INFO] [stderr] 417 | | }; [INFO] [stderr] | |_____________- help: try this: `if spec.default_value(&arg.name).is_some()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stderr] [INFO] [stderr] warning: redundant pattern matching, consider using `is_some()` [INFO] [stderr] --> src/py_method.rs:498:16 [INFO] [stderr] | [INFO] [stderr] 498 | if let Some(_) = arg.optional { [INFO] [stderr] | _________- ^^^^^^^ [INFO] [stderr] 499 | | // default value [INFO] [stderr] 500 | | let mut default = TokenStream::new(); [INFO] [stderr] 501 | | if let Some(d) = spec.default_value(name) { [INFO] [stderr] ... | [INFO] [stderr] 553 | | } [INFO] [stderr] 554 | | } [INFO] [stderr] | |_________- help: try this: `if arg.optional.is_some()` [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/args.rs:134:17 [INFO] [stderr] | [INFO] [stderr] 134 | / match lit { [INFO] [stderr] 135 | | &syn::Lit::Str(ref lits) => { [INFO] [stderr] 136 | | // #[args("*")] [INFO] [stderr] 137 | | if lits.value() == "*" { [INFO] [stderr] ... | [INFO] [stderr] 166 | | } [INFO] [stderr] 167 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_ref_pats)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 134 | match *lit { [INFO] [stderr] 135 | syn::Lit::Str(ref lits) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/py_method.rs:695:13 [INFO] [stderr] | [INFO] [stderr] 695 | let n = if let &Some(ref name) = setter { [INFO] [stderr] | _____________^ [INFO] [stderr] 696 | | name.to_string() [INFO] [stderr] 697 | | } else { [INFO] [stderr] 698 | | let n = name.to_string(); [INFO] [stderr] ... | [INFO] [stderr] 703 | | } [INFO] [stderr] 704 | | }; [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 695 | let n = if let Some(ref name) = *setter { [INFO] [stderr] | ^^^^^^^^^^^^^^ ^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/py_method.rs:725:13 [INFO] [stderr] | [INFO] [stderr] 725 | let n = if let &Some(ref name) = getter { [INFO] [stderr] | _____________^ [INFO] [stderr] 726 | | name.to_string() [INFO] [stderr] 727 | | } else { [INFO] [stderr] 728 | | let n = name.to_string(); [INFO] [stderr] ... | [INFO] [stderr] 733 | | } [INFO] [stderr] 734 | | }; [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 725 | let n = if let Some(ref name) = *getter { [INFO] [stderr] | ^^^^^^^^^^^^^^ ^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: defining a method called `eq` on this type; consider implementing the `std::cmp::PartialEq` trait or choosing a less ambiguous name [INFO] [stderr] --> src/func.rs:58:5 [INFO] [stderr] | [INFO] [stderr] 58 | / pub fn eq(&self, name: &str) -> bool { [INFO] [stderr] 59 | | match *self { [INFO] [stderr] 60 | | MethodProto::Free { name: n, .. } => n == name, [INFO] [stderr] 61 | | MethodProto::Unary { name: n, .. } => n == name, [INFO] [stderr] ... | [INFO] [stderr] 67 | | } [INFO] [stderr] 68 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::should_implement_trait)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/py_proto.rs:54:9 [INFO] [stderr] | [INFO] [stderr] 54 | / match iimpl { [INFO] [stderr] 55 | | syn::ImplItem::Method(ref mut met) => { [INFO] [stderr] 56 | | for m in proto.methods { [INFO] [stderr] 57 | | if m.eq(met.sig.ident.to_string().as_str()) { [INFO] [stderr] ... | [INFO] [stderr] 88 | | _ => (), [INFO] [stderr] 89 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 54 | if let syn::ImplItem::Method(ref mut met) = iimpl { [INFO] [stderr] 55 | for m in proto.methods { [INFO] [stderr] 56 | if m.eq(met.sig.ident.to_string().as_str()) { [INFO] [stderr] 57 | impl_method_proto(ty, &mut met.sig, m).to_tokens(&mut tokens); [INFO] [stderr] 58 | } [INFO] [stderr] 59 | } [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: The function/method `::parse` doesn't need a mutable reference [INFO] [stderr] --> src/py_proto.rs:67:61 [INFO] [stderr] | [INFO] [stderr] 67 | let fn_spec = FnSpec::parse(&ident, &mut met.sig, &mut met.attrs); [INFO] [stderr] | ^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unnecessary_mut_passed)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_mut_passed [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/utils.rs:11:23 [INFO] [stderr] | [INFO] [stderr] 11 | pub fn get_doc(attrs: &Vec, null_terminated: bool) -> syn::Lit { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ help: change this to: `&[syn::Attribute]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/utils.rs:23:47 [INFO] [stderr] | [INFO] [stderr] 23 | doc.push(if d.starts_with(" ") { [INFO] [stderr] | ^^^ help: try using a char instead: `' '` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_char_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] error: aborting due to 2 previous errors [INFO] [stderr] [INFO] [stderr] error: Could not compile `pyo3-derive-backend`. [INFO] [stderr] warning: build failed, waiting for other jobs to finish... [INFO] [stderr] error: using `clone` on a double-reference; this will copy the reference instead of cloning the inner type [INFO] [stderr] --> src/func.rs:374:31 [INFO] [stderr] | [INFO] [stderr] 374 | let seg = ty.path.segments.last().unwrap().value().clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::clone_double_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_double_ref [INFO] [stderr] help: try dereferencing it [INFO] [stderr] | [INFO] [stderr] 374 | let seg = &(*ty.path.segments.last().unwrap().value()).clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] help: or try being explicit about what type to clone [INFO] [stderr] | [INFO] [stderr] 374 | let seg = &syn::PathSegment::clone(ty.path.segments.last().unwrap().value()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/func.rs:376:25 [INFO] [stderr] | [INFO] [stderr] 376 | / match seg.arguments { [INFO] [stderr] 377 | | syn::PathArguments::AngleBracketed(ref data) => { [INFO] [stderr] 378 | | if let Some(pair) = data.args.last() { [INFO] [stderr] 379 | | match pair.value() { [INFO] [stderr] ... | [INFO] [stderr] 385 | | _ => (), [INFO] [stderr] 386 | | } [INFO] [stderr] | |_________________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 376 | if let syn::PathArguments::AngleBracketed(ref data) = seg.arguments { [INFO] [stderr] 377 | if let Some(pair) = data.args.last() { [INFO] [stderr] 378 | match pair.value() { [INFO] [stderr] 379 | syn::GenericArgument::Type(ref ty) => return ty.clone(), [INFO] [stderr] 380 | _ => panic!("Option only accepted for concrete types"), [INFO] [stderr] 381 | } [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/func.rs:409:5 [INFO] [stderr] | [INFO] [stderr] 409 | / match ty { [INFO] [stderr] 410 | | &syn::Type::Path(ref typath) => { [INFO] [stderr] 411 | | if let Some(segment) = typath.path.segments.last() { [INFO] [stderr] 412 | | match segment.value().ident.to_string().as_str() { [INFO] [stderr] ... | [INFO] [stderr] 450 | | _ => panic!("not supported: {:?}", ty), [INFO] [stderr] 451 | | }; [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 409 | match *ty { [INFO] [stderr] 410 | syn::Type::Path(ref typath) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/func.rs:420:29 [INFO] [stderr] | [INFO] [stderr] 420 | / match data.args[0] { [INFO] [stderr] 421 | | syn::GenericArgument::Type(syn::Type::Path(ref typath)) => { [INFO] [stderr] 422 | | if let Some(segment) = typath.path.segments.last() { [INFO] [stderr] 423 | | match segment.value().ident.to_string().as_str() { [INFO] [stderr] ... | [INFO] [stderr] 436 | | _ => (), [INFO] [stderr] 437 | | } [INFO] [stderr] | |_____________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 420 | if let syn::GenericArgument::Type(syn::Type::Path(ref typath)) = data.args[0] { [INFO] [stderr] 421 | if let Some(segment) = typath.path.segments.last() { [INFO] [stderr] 422 | match segment.value().ident.to_string().as_str() { [INFO] [stderr] 423 | // get T from Option [INFO] [stderr] 424 | "Option" => match segment.value().arguments { [INFO] [stderr] 425 | syn::PathArguments::AngleBracketed(ref data) => { [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/func.rs:423:41 [INFO] [stderr] | [INFO] [stderr] 423 | / match segment.value().ident.to_string().as_str() { [INFO] [stderr] 424 | | // get T from Option [INFO] [stderr] 425 | | "Option" => match segment.value().arguments { [INFO] [stderr] 426 | | syn::PathArguments::AngleBracketed(ref data) => { [INFO] [stderr] ... | [INFO] [stderr] 432 | | _ => (), [INFO] [stderr] 433 | | } [INFO] [stderr] | |_________________________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 423 | if let "Option" = segment.value().ident.to_string().as_str() { match segment.value().arguments { [INFO] [stderr] 424 | syn::PathArguments::AngleBracketed(ref data) => { [INFO] [stderr] 425 | result = false; [INFO] [stderr] 426 | succ = data.args[0].clone(); [INFO] [stderr] 427 | } [INFO] [stderr] 428 | _ => (), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/func.rs:425:57 [INFO] [stderr] | [INFO] [stderr] 425 | "Option" => match segment.value().arguments { [INFO] [stderr] | _________________________________________________________^ [INFO] [stderr] 426 | | syn::PathArguments::AngleBracketed(ref data) => { [INFO] [stderr] 427 | | result = false; [INFO] [stderr] 428 | | succ = data.args[0].clone(); [INFO] [stderr] 429 | | } [INFO] [stderr] 430 | | _ => (), [INFO] [stderr] 431 | | }, [INFO] [stderr] | |_____________________________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 425 | "Option" => if let syn::PathArguments::AngleBracketed(ref data) = segment.value().arguments { [INFO] [stderr] 426 | result = false; [INFO] [stderr] 427 | succ = data.args[0].clone(); [INFO] [stderr] 428 | }, [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: using `clone` on a double-reference; this will copy the reference instead of cloning the inner type [INFO] [stderr] --> src/func.rs:476:27 [INFO] [stderr] | [INFO] [stderr] 476 | let seg = typath.path.segments.last().unwrap().value().clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_double_ref [INFO] [stderr] help: try dereferencing it [INFO] [stderr] | [INFO] [stderr] 476 | let seg = &(*typath.path.segments.last().unwrap().value()).clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] help: or try being explicit about what type to clone [INFO] [stderr] | [INFO] [stderr] 476 | let seg = &syn::PathSegment::clone(typath.path.segments.last().unwrap().value()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/method.rs:60:13 [INFO] [stderr] | [INFO] [stderr] 60 | / match input { [INFO] [stderr] 61 | | &syn::FnArg::SelfRef(_) => { [INFO] [stderr] 62 | | has_self = true; [INFO] [stderr] 63 | | } [INFO] [stderr] ... | [INFO] [stderr] 110 | | &syn::FnArg::Inferred(_) => panic!("ingerred argument: {:?}", name), [INFO] [stderr] 111 | | } [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 60 | match *input { [INFO] [stderr] 61 | syn::FnArg::SelfRef(_) => { [INFO] [stderr] 62 | has_self = true; [INFO] [stderr] 63 | } [INFO] [stderr] 64 | syn::FnArg::SelfValue(_) => { [INFO] [stderr] 65 | has_self = true; [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/method.rs:76:55 [INFO] [stderr] | [INFO] [stderr] 76 | let (ident, by_ref, mutability) = match pat { [INFO] [stderr] | _______________________________________________________^ [INFO] [stderr] 77 | | &syn::Pat::Ident(syn::PatIdent { [INFO] [stderr] 78 | | ref ident, [INFO] [stderr] 79 | | ref by_ref, [INFO] [stderr] ... | [INFO] [stderr] 83 | | _ => panic!("unsupported argument: {:?}", pat), [INFO] [stderr] 84 | | }; [INFO] [stderr] | |_____________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 76 | let (ident, by_ref, mutability) = match *pat { [INFO] [stderr] 77 | syn::Pat::Ident(syn::PatIdent { [INFO] [stderr] 78 | ref ident, [INFO] [stderr] 79 | ref by_ref, [INFO] [stderr] 80 | ref mutability, [INFO] [stderr] 81 | .. [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/method.rs:86:30 [INFO] [stderr] | [INFO] [stderr] 86 | let py = match ty { [INFO] [stderr] | ______________________________^ [INFO] [stderr] 87 | | &syn::Type::Path(syn::TypePath { ref path, .. }) => { [INFO] [stderr] 88 | | if let Some(segment) = path.segments.last() { [INFO] [stderr] 89 | | segment.value().ident == "Python" [INFO] [stderr] ... | [INFO] [stderr] 94 | | _ => false, [INFO] [stderr] 95 | | }; [INFO] [stderr] | |_____________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 86 | let py = match *ty { [INFO] [stderr] 87 | syn::Type::Path(syn::TypePath { ref path, .. }) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/method.rs:126:13 [INFO] [stderr] | [INFO] [stderr] 126 | / match *s { [INFO] [stderr] 127 | | Argument::VarArgs(ref ident) => return name == ident, [INFO] [stderr] 128 | | _ => (), [INFO] [stderr] 129 | | } [INFO] [stderr] | |_____________^ help: try this: `if let Argument::VarArgs(ref ident) = *s { return name == ident }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/method.rs:147:13 [INFO] [stderr] | [INFO] [stderr] 147 | / match *s { [INFO] [stderr] 148 | | Argument::KeywordArgs(ref ident) => return name == ident, [INFO] [stderr] 149 | | _ => (), [INFO] [stderr] 150 | | } [INFO] [stderr] | |_____________^ help: try this: `if let Argument::KeywordArgs(ref ident) = *s { return name == ident }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/method.rs:157:13 [INFO] [stderr] | [INFO] [stderr] 157 | / match *s { [INFO] [stderr] 158 | | Argument::KeywordArgs(_) => return true, [INFO] [stderr] 159 | | _ => (), [INFO] [stderr] 160 | | } [INFO] [stderr] | |_____________^ help: try this: `if let Argument::KeywordArgs(_) = *s { return true }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/method.rs:170:25 [INFO] [stderr] | [INFO] [stderr] 170 | / if let &Some(ref val) = opt { [INFO] [stderr] 171 | | let i: syn::Expr = syn::parse_str(&val).unwrap(); [INFO] [stderr] 172 | | return Some(i.into_token_stream()); [INFO] [stderr] 173 | | } [INFO] [stderr] | |_________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 170 | if let Some(ref val) = *opt { [INFO] [stderr] | ^^^^^^^^^^^^^ ^^^^ [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/method.rs:190:13 [INFO] [stderr] | [INFO] [stderr] 190 | / match *s { [INFO] [stderr] 191 | | Argument::Kwarg(ref ident, _) => { [INFO] [stderr] 192 | | if ident == name { [INFO] [stderr] 193 | | return true; [INFO] [stderr] ... | [INFO] [stderr] 196 | | _ => (), [INFO] [stderr] 197 | | } [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 190 | if let Argument::Kwarg(ref ident, _) = *s { [INFO] [stderr] 191 | if ident == name { [INFO] [stderr] 192 | return true; [INFO] [stderr] 193 | } [INFO] [stderr] 194 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/method.rs:204:5 [INFO] [stderr] | [INFO] [stderr] 204 | / match ty { [INFO] [stderr] 205 | | &syn::Type::Reference(_) => return true, [INFO] [stderr] 206 | | &syn::Type::Path(syn::TypePath { ref path, .. }) => { [INFO] [stderr] 207 | | if let Some(segment) = path.segments.last() { [INFO] [stderr] ... | [INFO] [stderr] 233 | | _ => (), [INFO] [stderr] 234 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 204 | match *ty { [INFO] [stderr] 205 | syn::Type::Reference(_) => return true, [INFO] [stderr] 206 | syn::Type::Path(syn::TypePath { ref path, .. }) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/method.rs:208:17 [INFO] [stderr] | [INFO] [stderr] 208 | / match segment.value().ident.to_string().as_str() { [INFO] [stderr] 209 | | "Option" => match segment.value().arguments { [INFO] [stderr] 210 | | syn::PathArguments::AngleBracketed(ref params) => { [INFO] [stderr] 211 | | if params.args.len() != 1 { [INFO] [stderr] ... | [INFO] [stderr] 229 | | _ => (), [INFO] [stderr] 230 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 208 | if let "Option" = segment.value().ident.to_string().as_str() { match segment.value().arguments { [INFO] [stderr] 209 | syn::PathArguments::AngleBracketed(ref params) => { [INFO] [stderr] 210 | if params.args.len() != 1 { [INFO] [stderr] 211 | panic!("argument type is not supported by python method: {:?} ({:?}) {:?}", [INFO] [stderr] 212 | name, [INFO] [stderr] 213 | ty, [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/method.rs:217:29 [INFO] [stderr] | [INFO] [stderr] 217 | / match ¶ms.args[params.args.len() - 1] { [INFO] [stderr] 218 | | &syn::GenericArgument::Type(syn::Type::Reference(_)) => return true, [INFO] [stderr] 219 | | _ => (), [INFO] [stderr] 220 | | } [INFO] [stderr] | |_____________________________^ help: try this: `if let &syn::GenericArgument::Type(syn::Type::Reference(_)) = ¶ms.args[params.args.len() - 1] { return true }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/method.rs:217:29 [INFO] [stderr] | [INFO] [stderr] 217 | / match ¶ms.args[params.args.len() - 1] { [INFO] [stderr] 218 | | &syn::GenericArgument::Type(syn::Type::Reference(_)) => return true, [INFO] [stderr] 219 | | _ => (), [INFO] [stderr] 220 | | } [INFO] [stderr] | |_____________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 217 | match params.args[params.args.len() - 1] { [INFO] [stderr] 218 | syn::GenericArgument::Type(syn::Type::Reference(_)) => return true, [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/method.rs:242:5 [INFO] [stderr] | [INFO] [stderr] 242 | / match ty { [INFO] [stderr] 243 | | &syn::Type::Path(syn::TypePath { ref path, .. }) => { [INFO] [stderr] 244 | | //if let &Some(ref qs) = qs { [INFO] [stderr] 245 | | // panic!("explicit Self type in a 'qualified path' is not supported: {:?} - {:?}", [INFO] [stderr] ... | [INFO] [stderr] 286 | | } [INFO] [stderr] 287 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 242 | match *ty { [INFO] [stderr] 243 | syn::Type::Path(syn::TypePath { ref path, .. }) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/method.rs:260:29 [INFO] [stderr] | [INFO] [stderr] 260 | / match ¶ms.args[0] { [INFO] [stderr] 261 | | &syn::GenericArgument::Type(ref ty) => Some(ty), [INFO] [stderr] 262 | | _ => panic!("argument type is not supported by python method: {:?} ({:?}) {:?}", [INFO] [stderr] 263 | | name, [INFO] [stderr] 264 | | ty, [INFO] [stderr] 265 | | path), [INFO] [stderr] 266 | | } [INFO] [stderr] | |_________________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 260 | match params.args[0] { [INFO] [stderr] 261 | syn::GenericArgument::Type(ref ty) => Some(ty), [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/module.rs:68:5 [INFO] [stderr] | [INFO] [stderr] 68 | / match input { [INFO] [stderr] 69 | | &syn::FnArg::SelfRef(_) | &syn::FnArg::SelfValue(_) => None, [INFO] [stderr] 70 | | &syn::FnArg::Captured(ref cap) => { [INFO] [stderr] 71 | | let (mutability, by_ref, ident) = match cap.pat { [INFO] [stderr] ... | [INFO] [stderr] 98 | | &syn::FnArg::Inferred(_) => panic!("inferred argument: {:?}", name), [INFO] [stderr] 99 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 68 | match *input { [INFO] [stderr] 69 | syn::FnArg::SelfRef(_) | syn::FnArg::SelfValue(_) => None, [INFO] [stderr] 70 | syn::FnArg::Captured(ref cap) => { [INFO] [stderr] 71 | let (mutability, by_ref, ident) = match cap.pat { [INFO] [stderr] 72 | syn::Pat::Ident(ref patid) => (&patid.mutability, &patid.by_ref, &patid.ident), [INFO] [stderr] 73 | _ => panic!("unsupported argument: {:?}", cap.pat), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/py_class.rs:10:58 [INFO] [stderr] | [INFO] [stderr] 10 | pub fn build_py_class(class: &mut syn::ItemStruct, attr: &Vec) -> TokenStream { [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: change this to: `&[syn::Expr]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/py_class.rs:46:25 [INFO] [stderr] | [INFO] [stderr] 46 | / if let &syn::NestedMeta::Meta(ref metaitem) = meta { [INFO] [stderr] 47 | | match metaitem.name().to_string().as_str() { [INFO] [stderr] 48 | | "get" => { [INFO] [stderr] 49 | | descs.push(FnType::Getter(None)); [INFO] [stderr] ... | [INFO] [stderr] 57 | | } [INFO] [stderr] 58 | | } [INFO] [stderr] | |_________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 46 | if let syn::NestedMeta::Meta(ref metaitem) = *meta { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/py_class.rs:341:5 [INFO] [stderr] | [INFO] [stderr] 341 | / match field.ty { [INFO] [stderr] 342 | | syn::Type::Path(ref typath) => { [INFO] [stderr] 343 | | if let Some(segment) = typath.path.segments.last() { [INFO] [stderr] 344 | | return segment.value().ident.to_string() == "PyToken"; [INFO] [stderr] ... | [INFO] [stderr] 347 | | _ => (), [INFO] [stderr] 348 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 341 | if let syn::Type::Path(ref typath) = field.ty { [INFO] [stderr] 342 | if let Some(segment) = typath.path.segments.last() { [INFO] [stderr] 343 | return segment.value().ident.to_string() == "PyToken"; [INFO] [stderr] 344 | } [INFO] [stderr] 345 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: this creates an owned instance just for comparison [INFO] [stderr] --> src/py_class.rs:344:24 [INFO] [stderr] | [INFO] [stderr] 344 | return segment.value().ident.to_string() == "PyToken"; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `*segment.value().ident` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cmp_owned)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cmp_owned [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/py_class.rs:353:11 [INFO] [stderr] | [INFO] [stderr] 353 | args: &Vec, [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: change this to: `&[syn::Expr]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: this lifetime isn't used in the function definition [INFO] [stderr] --> src/py_method.rs:10:22 [INFO] [stderr] | [INFO] [stderr] 10 | pub fn gen_py_method<'a>( [INFO] [stderr] | ^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::extra_unused_lifetimes)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#extra_unused_lifetimes [INFO] [stderr] [INFO] [stderr] warning: length comparison to one [INFO] [stderr] --> src/py_method.rs:336:8 [INFO] [stderr] | [INFO] [stderr] 336 | if spec.args.len() < 1 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `spec.args.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: You are using an explicit closure for cloning elements [INFO] [stderr] --> src/py_method.rs:387:28 [INFO] [stderr] | [INFO] [stderr] 387 | let args: Vec = spec [INFO] [stderr] | ____________________________^ [INFO] [stderr] 388 | | .args [INFO] [stderr] 389 | | .iter() [INFO] [stderr] 390 | | .filter(|item| !item.py) [INFO] [stderr] 391 | | .map(|item| item.clone()) [INFO] [stderr] | |_________________________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::map_clone)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_clone [INFO] [stderr] help: Consider calling the dedicated `cloned` method [INFO] [stderr] | [INFO] [stderr] 387 | let args: Vec = spec [INFO] [stderr] 388 | .args [INFO] [stderr] 389 | .iter() [INFO] [stderr] 390 | .filter(|item| !item.py).cloned() [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: redundant pattern matching, consider using `is_some()` [INFO] [stderr] --> src/py_method.rs:411:30 [INFO] [stderr] | [INFO] [stderr] 411 | let opt = if let Some(_) = arg.optional { [INFO] [stderr] | _______________________- ^^^^^^^ [INFO] [stderr] 412 | | syn::Ident::new("true", Span::call_site()) [INFO] [stderr] 413 | | } else if let Some(_) = spec.default_value(&arg.name) { [INFO] [stderr] 414 | | syn::Ident::new("true", Span::call_site()) [INFO] [stderr] 415 | | } else { [INFO] [stderr] 416 | | syn::Ident::new("false", Span::call_site()) [INFO] [stderr] 417 | | }; [INFO] [stderr] | |_____________- help: try this: `if arg.optional.is_some()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_pattern_matching)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stderr] [INFO] [stderr] warning: redundant pattern matching, consider using `is_some()` [INFO] [stderr] --> src/py_method.rs:413:27 [INFO] [stderr] | [INFO] [stderr] 413 | } else if let Some(_) = spec.default_value(&arg.name) { [INFO] [stderr] | ____________________- ^^^^^^^ [INFO] [stderr] 414 | | syn::Ident::new("true", Span::call_site()) [INFO] [stderr] 415 | | } else { [INFO] [stderr] 416 | | syn::Ident::new("false", Span::call_site()) [INFO] [stderr] 417 | | }; [INFO] [stderr] | |_____________- help: try this: `if spec.default_value(&arg.name).is_some()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stderr] [INFO] [stderr] warning: redundant pattern matching, consider using `is_some()` [INFO] [stderr] --> src/py_method.rs:498:16 [INFO] [stderr] | [INFO] [stderr] 498 | if let Some(_) = arg.optional { [INFO] [stderr] | _________- ^^^^^^^ [INFO] [stderr] 499 | | // default value [INFO] [stderr] 500 | | let mut default = TokenStream::new(); [INFO] [stderr] 501 | | if let Some(d) = spec.default_value(name) { [INFO] [stderr] ... | [INFO] [stderr] 553 | | } [INFO] [stderr] 554 | | } [INFO] [stderr] | |_________- help: try this: `if arg.optional.is_some()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/py_method.rs:695:13 [INFO] [stderr] | [INFO] [stderr] 695 | let n = if let &Some(ref name) = setter { [INFO] [stderr] | _____________^ [INFO] [stderr] 696 | | name.to_string() [INFO] [stderr] 697 | | } else { [INFO] [stderr] 698 | | let n = name.to_string(); [INFO] [stderr] ... | [INFO] [stderr] 703 | | } [INFO] [stderr] 704 | | }; [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 695 | let n = if let Some(ref name) = *setter { [INFO] [stderr] | ^^^^^^^^^^^^^^ ^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/py_method.rs:725:13 [INFO] [stderr] | [INFO] [stderr] 725 | let n = if let &Some(ref name) = getter { [INFO] [stderr] | _____________^ [INFO] [stderr] 726 | | name.to_string() [INFO] [stderr] 727 | | } else { [INFO] [stderr] 728 | | let n = name.to_string(); [INFO] [stderr] ... | [INFO] [stderr] 733 | | } [INFO] [stderr] 734 | | }; [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 725 | let n = if let Some(ref name) = *getter { [INFO] [stderr] | ^^^^^^^^^^^^^^ ^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/py_proto.rs:54:9 [INFO] [stderr] | [INFO] [stderr] 54 | / match iimpl { [INFO] [stderr] 55 | | syn::ImplItem::Method(ref mut met) => { [INFO] [stderr] 56 | | for m in proto.methods { [INFO] [stderr] 57 | | if m.eq(met.sig.ident.to_string().as_str()) { [INFO] [stderr] ... | [INFO] [stderr] 88 | | _ => (), [INFO] [stderr] 89 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 54 | if let syn::ImplItem::Method(ref mut met) = iimpl { [INFO] [stderr] 55 | for m in proto.methods { [INFO] [stderr] 56 | if m.eq(met.sig.ident.to_string().as_str()) { [INFO] [stderr] 57 | impl_method_proto(ty, &mut met.sig, m).to_tokens(&mut tokens); [INFO] [stderr] 58 | } [INFO] [stderr] 59 | } [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: The function/method `::parse` doesn't need a mutable reference [INFO] [stderr] --> src/py_proto.rs:67:61 [INFO] [stderr] | [INFO] [stderr] 67 | let fn_spec = FnSpec::parse(&ident, &mut met.sig, &mut met.attrs); [INFO] [stderr] | ^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unnecessary_mut_passed)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_mut_passed [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/utils.rs:11:23 [INFO] [stderr] | [INFO] [stderr] 11 | pub fn get_doc(attrs: &Vec, null_terminated: bool) -> syn::Lit { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ help: change this to: `&[syn::Attribute]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/utils.rs:23:47 [INFO] [stderr] | [INFO] [stderr] 23 | doc.push(if d.starts_with(" ") { [INFO] [stderr] | ^^^ help: try using a char instead: `' '` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_char_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] error: aborting due to 2 previous errors [INFO] [stderr] [INFO] [stderr] error: Could not compile `pyo3-derive-backend`. [INFO] [stderr] [INFO] [stderr] To learn more, run the command again with --verbose. [INFO] running `"docker" "inspect" "833753d2c1d016235723dae6479c6cdb7d4c813159dcbc42e56b98667d7ac3b1"` [INFO] running `"docker" "rm" "-f" "833753d2c1d016235723dae6479c6cdb7d4c813159dcbc42e56b98667d7ac3b1"` [INFO] [stdout] 833753d2c1d016235723dae6479c6cdb7d4c813159dcbc42e56b98667d7ac3b1