[INFO] cloning repository https://github.com/jaspwr/css-parser [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/jaspwr/css-parser" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fjaspwr%2Fcss-parser", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fjaspwr%2Fcss-parser'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] 7e692422c5cbb28b5b8ae7d5d17fa882969a01c2 [INFO] linting jaspwr/css-parser against nightly for clippy-nonminimal_bool-denied [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fjaspwr%2Fcss-parser" "/workspace/builds/worker-2-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-2-tc1/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/jaspwr/css-parser [INFO] finished tweaking git repo https://github.com/jaspwr/css-parser [INFO] tweaked toml for git repo https://github.com/jaspwr/css-parser written to /workspace/builds/worker-2-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/jaspwr/css-parser on toolchain nightly [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate git repo https://github.com/jaspwr/css-parser already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] 5e7f2b8ca610c42e7486791500b96b107826bd7a08333b20b6a343827dcd5e21 [INFO] running `Command { std: "docker" "start" "-a" "5e7f2b8ca610c42e7486791500b96b107826bd7a08333b20b6a343827dcd5e21", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "5e7f2b8ca610c42e7486791500b96b107826bd7a08333b20b6a343827dcd5e21", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "5e7f2b8ca610c42e7486791500b96b107826bd7a08333b20b6a343827dcd5e21", kill_on_drop: false }` [INFO] [stdout] 5e7f2b8ca610c42e7486791500b96b107826bd7a08333b20b6a343827dcd5e21 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "clippy" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 8bc6385d1cbe70d5a5c14414d68706ed07ed9dfbf9cea88fd74deed11bbad44d [INFO] running `Command { std: "docker" "start" "-a" "8bc6385d1cbe70d5a5c14414d68706ed07ed9dfbf9cea88fd74deed11bbad44d", kill_on_drop: false }` [INFO] [stderr] Checking css-parser v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do [INFO] [stdout] --> src/lib.rs:37:44 [INFO] [stdout] | [INFO] [stdout] 37 | pub fn matches_classes(&self, classes: &Vec) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] = note: `#[warn(clippy::ptr_arg)]` on by default [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 37 - pub fn matches_classes(&self, classes: &Vec) -> bool { [INFO] [stdout] 37 + pub fn matches_classes(&self, classes: &[String]) -> bool { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/lib.rs:134:5 [INFO] [stdout] | [INFO] [stdout] 134 | return Ok(Selector::Descendant(Box::new(a), Box::new(b))); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] = note: `#[warn(clippy::needless_return)]` on by default [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 134 - return Ok(Selector::Descendant(Box::new(a), Box::new(b))); [INFO] [stdout] 134 + Ok(Selector::Descendant(Box::new(a), Box::new(b))) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:77:5 [INFO] [stdout] | [INFO] [stdout] 77 | / if s.len() == 1 { [INFO] [stdout] 78 | | if let Token::Identifier(s) = s[0] { [INFO] [stdout] 79 | | if s == "*" { [INFO] [stdout] 80 | | return Ok(Selector::All); [INFO] [stdout] ... | [INFO] [stdout] 115 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 77 ~ if s.len() == 1 [INFO] [stdout] 78 ~ && let Token::Identifier(s) = s[0] { [INFO] [stdout] 79 | if s == "*" { [INFO] [stdout] ... [INFO] [stdout] 113 | return Ok(Selector::Tag(s.to_string())); [INFO] [stdout] 114 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: stripping a prefix manually [INFO] [stdout] --> src/lib.rs:90:40 [INFO] [stdout] | [INFO] [stdout] 90 | return Ok(Selector::ID(s[1..].to_string())); [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: the prefix was tested here [INFO] [stdout] --> src/lib.rs:83:13 [INFO] [stdout] | [INFO] [stdout] 83 | if s.starts_with("#") { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_strip [INFO] [stdout] = note: `#[warn(clippy::manual_strip)]` on by default [INFO] [stdout] help: try using the `strip_prefix` method [INFO] [stdout] | [INFO] [stdout] 83 ~ if let Some() = s.strip_prefix("#") { [INFO] [stdout] 84 | if s.len() < 2 { [INFO] [stdout] ... [INFO] [stdout] 89 | } [INFO] [stdout] 90 ~ return Ok(Selector::ID(.to_string())); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: stripping a prefix manually [INFO] [stdout] --> src/lib.rs:99:43 [INFO] [stdout] | [INFO] [stdout] 99 | return Ok(Selector::Class(s[1..].to_string())); [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: the prefix was tested here [INFO] [stdout] --> src/lib.rs:92:13 [INFO] [stdout] | [INFO] [stdout] 92 | if s.starts_with(".") { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_strip [INFO] [stdout] help: try using the `strip_prefix` method [INFO] [stdout] | [INFO] [stdout] 92 ~ if let Some() = s.strip_prefix(".") { [INFO] [stdout] 93 | if s.len() < 2 { [INFO] [stdout] ... [INFO] [stdout] 98 | } [INFO] [stdout] 99 ~ return Ok(Selector::Class(.to_string())); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: stripping a prefix manually [INFO] [stdout] --> src/lib.rs:108:44 [INFO] [stdout] | [INFO] [stdout] 108 | return Ok(Selector::Pseudo(s[1..].to_string())); [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: the prefix was tested here [INFO] [stdout] --> src/lib.rs:101:13 [INFO] [stdout] | [INFO] [stdout] 101 | if s.starts_with(":") { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_strip [INFO] [stdout] help: try using the `strip_prefix` method [INFO] [stdout] | [INFO] [stdout] 101 ~ if let Some() = s.strip_prefix(":") { [INFO] [stdout] 102 | if s.len() < 2 { [INFO] [stdout] ... [INFO] [stdout] 107 | } [INFO] [stdout] 108 ~ return Ok(Selector::Pseudo(.to_string())); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lib.rs:111:21 [INFO] [stdout] | [INFO] [stdout] 111 | assert!(s.len() > 0); [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] = note: `#[warn(clippy::len_zero)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let` [INFO] [stdout] --> src/lib.rs:119:5 [INFO] [stdout] | [INFO] [stdout] 119 | / match s[1] { [INFO] [stdout] 120 | | Token::Identifier(oper) => { [INFO] [stdout] 121 | | if oper == ">" { [INFO] [stdout] 122 | | let b = parse_selector(&s[2..], pos)?; [INFO] [stdout] ... | [INFO] [stdout] 130 | | _ => {} [INFO] [stdout] 131 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stdout] = note: `#[warn(clippy::single_match)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 119 ~ if let Token::Identifier(oper) = s[1] { [INFO] [stdout] 120 + if oper == ">" { [INFO] [stdout] 121 + let b = parse_selector(&s[2..], pos)?; [INFO] [stdout] 122 + return Ok(Selector::Child(Box::new(a), Box::new(b))); [INFO] [stdout] 123 + } [INFO] [stdout] 124 + if oper == "+" { [INFO] [stdout] 125 + let b = parse_selector(&s[2..], pos)?; [INFO] [stdout] 126 + return Ok(Selector::NextSibling(Box::new(a), Box::new(b))); [INFO] [stdout] 127 + } [INFO] [stdout] 128 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/lib.rs:210:61 [INFO] [stdout] | [INFO] [stdout] 210 | current_property.value.push(parse_value(&s)); [INFO] [stdout] | ^^ help: change this to: `s` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] = note: `#[warn(clippy::needless_borrow)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/lib.rs:369:12 [INFO] [stdout] | [INFO] [stdout] 369 | if !id_char(c) && !(ctx == ParsingContext::Selector && c == ':' && !seen_non_colon) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `!(id_char(c) || ctx == ParsingContext::Selector && c == ':' && !seen_non_colon)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] = note: `#[warn(clippy::nonminimal_bool)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: used `unwrap_or()` on `Some` value [INFO] [stdout] --> src/lib.rs:334:23 [INFO] [stdout] | [INFO] [stdout] 334 | location: unclosed_opener_pos.unwrap_or(*pos), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] help: remove the `Some` and `unwrap_or()` [INFO] [stdout] --> src/lib.rs:318:35 [INFO] [stdout] | [INFO] [stdout] 318 | let unclosed_opener_pos = Some(*pos); [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_literal_unwrap [INFO] [stdout] = note: `#[warn(clippy::unnecessary_literal_unwrap)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: used `unwrap_or()` on `Some` value [INFO] [stdout] --> src/lib.rs:364:27 [INFO] [stdout] | [INFO] [stdout] 364 | location: unclosed_opener_pos.unwrap_or(*pos), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] help: remove the `Some` and `unwrap_or()` [INFO] [stdout] --> src/lib.rs:348:39 [INFO] [stdout] | [INFO] [stdout] 348 | let unclosed_opener_pos = Some(*pos); [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_literal_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:442:5 [INFO] [stdout] | [INFO] [stdout] 442 | / if value.starts_with("#") { [INFO] [stdout] 443 | | if let Some(c) = parse_colour(value) { [INFO] [stdout] 444 | | return Value::Colour(c); [INFO] [stdout] 445 | | } [INFO] [stdout] 446 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 442 ~ if value.starts_with("#") [INFO] [stdout] 443 ~ && let Some(c) = parse_colour(value) { [INFO] [stdout] 444 | return Value::Colour(c); [INFO] [stdout] 445 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:448:5 [INFO] [stdout] | [INFO] [stdout] 448 | / if value.ends_with("rad") { [INFO] [stdout] 449 | | if let Ok(v) = value.trim_end_matches("rad").parse::() { [INFO] [stdout] 450 | | return Value::Angle(v); [INFO] [stdout] 451 | | } [INFO] [stdout] 452 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 448 ~ if value.ends_with("rad") [INFO] [stdout] 449 ~ && let Ok(v) = value.trim_end_matches("rad").parse::() { [INFO] [stdout] 450 | return Value::Angle(v); [INFO] [stdout] 451 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:454:5 [INFO] [stdout] | [INFO] [stdout] 454 | / if value.ends_with("deg") { [INFO] [stdout] 455 | | if let Ok(v) = value.trim_end_matches("deg").parse::() { [INFO] [stdout] 456 | | return Value::Angle(v.to_radians()); [INFO] [stdout] 457 | | } [INFO] [stdout] 458 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 454 ~ if value.ends_with("deg") [INFO] [stdout] 455 ~ && let Ok(v) = value.trim_end_matches("deg").parse::() { [INFO] [stdout] 456 | return Value::Angle(v.to_radians()); [INFO] [stdout] 457 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:460:5 [INFO] [stdout] | [INFO] [stdout] 460 | / if value.ends_with("px") { [INFO] [stdout] 461 | | if let Ok(v) = value.trim_end_matches("px").parse::() { [INFO] [stdout] 462 | | return Value::Length(Length::Px(v)); [INFO] [stdout] 463 | | } [INFO] [stdout] 464 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 460 ~ if value.ends_with("px") [INFO] [stdout] 461 ~ && let Ok(v) = value.trim_end_matches("px").parse::() { [INFO] [stdout] 462 | return Value::Length(Length::Px(v)); [INFO] [stdout] 463 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:466:5 [INFO] [stdout] | [INFO] [stdout] 466 | / if value.ends_with("%") { [INFO] [stdout] 467 | | if let Ok(v) = value.trim_end_matches("%").parse::() { [INFO] [stdout] 468 | | return Value::Length(Length::Percentage(v)); [INFO] [stdout] 469 | | } [INFO] [stdout] 470 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 466 ~ if value.ends_with("%") [INFO] [stdout] 467 ~ && let Ok(v) = value.trim_end_matches("%").parse::() { [INFO] [stdout] 468 | return Value::Length(Length::Percentage(v)); [INFO] [stdout] 469 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:485:5 [INFO] [stdout] | [INFO] [stdout] 485 | / if value.starts_with("var") { [INFO] [stdout] 486 | | if let Some(args) = css_function_args(value) { [INFO] [stdout] 487 | | if args.len() == 1 { [INFO] [stdout] 488 | | return Value::Variable(args[0].to_string()); [INFO] [stdout] ... | [INFO] [stdout] 491 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 485 ~ if value.starts_with("var") [INFO] [stdout] 486 ~ && let Some(args) = css_function_args(value) { [INFO] [stdout] 487 | if args.len() == 1 { [INFO] [stdout] 488 | return Value::Variable(args[0].to_string()); [INFO] [stdout] 489 | } [INFO] [stdout] 490 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:486:9 [INFO] [stdout] | [INFO] [stdout] 486 | / if let Some(args) = css_function_args(value) { [INFO] [stdout] 487 | | if args.len() == 1 { [INFO] [stdout] 488 | | return Value::Variable(args[0].to_string()); [INFO] [stdout] 489 | | } [INFO] [stdout] 490 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 486 ~ if let Some(args) = css_function_args(value) [INFO] [stdout] 487 ~ && args.len() == 1 { [INFO] [stdout] 488 | return Value::Variable(args[0].to_string()); [INFO] [stdout] 489 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:493:5 [INFO] [stdout] | [INFO] [stdout] 493 | / if value.starts_with("linear-gradient") || value.starts_with("gradient") { [INFO] [stdout] 494 | | if let Some(args) = css_function_args(value) { [INFO] [stdout] 495 | | let (angle, points) = parse_gradient(args.iter().map(|s| s.as_str()).collect()); [INFO] [stdout] ... | [INFO] [stdout] 499 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 493 ~ if (value.starts_with("linear-gradient") || value.starts_with("gradient")) { [INFO] [stdout] 494 ~ && let Some(args) = css_function_args(value) { [INFO] [stdout] 495 | let (angle, points) = parse_gradient(args.iter().map(|s| s.as_str()).collect()); [INFO] [stdout] 496 | [INFO] [stdout] 497 | return Value::LinearGradient { angle, points }; [INFO] [stdout] 498 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do [INFO] [stdout] --> src/lib.rs:37:44 [INFO] [stdout] | [INFO] [stdout] 37 | pub fn matches_classes(&self, classes: &Vec) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] = note: `#[warn(clippy::ptr_arg)]` on by default [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 37 - pub fn matches_classes(&self, classes: &Vec) -> bool { [INFO] [stdout] 37 + pub fn matches_classes(&self, classes: &[String]) -> bool { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/lib.rs:134:5 [INFO] [stdout] | [INFO] [stdout] 134 | return Ok(Selector::Descendant(Box::new(a), Box::new(b))); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] = note: `#[warn(clippy::needless_return)]` on by default [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 134 - return Ok(Selector::Descendant(Box::new(a), Box::new(b))); [INFO] [stdout] 134 + Ok(Selector::Descendant(Box::new(a), Box::new(b))) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:77:5 [INFO] [stdout] | [INFO] [stdout] 77 | / if s.len() == 1 { [INFO] [stdout] 78 | | if let Token::Identifier(s) = s[0] { [INFO] [stdout] 79 | | if s == "*" { [INFO] [stdout] 80 | | return Ok(Selector::All); [INFO] [stdout] ... | [INFO] [stdout] 115 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 77 ~ if s.len() == 1 [INFO] [stdout] 78 ~ && let Token::Identifier(s) = s[0] { [INFO] [stdout] 79 | if s == "*" { [INFO] [stdout] ... [INFO] [stdout] 113 | return Ok(Selector::Tag(s.to_string())); [INFO] [stdout] 114 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: stripping a prefix manually [INFO] [stdout] --> src/lib.rs:90:40 [INFO] [stdout] | [INFO] [stdout] 90 | return Ok(Selector::ID(s[1..].to_string())); [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: the prefix was tested here [INFO] [stdout] --> src/lib.rs:83:13 [INFO] [stdout] | [INFO] [stdout] 83 | if s.starts_with("#") { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_strip [INFO] [stdout] = note: `#[warn(clippy::manual_strip)]` on by default [INFO] [stdout] help: try using the `strip_prefix` method [INFO] [stdout] | [INFO] [stdout] 83 ~ if let Some() = s.strip_prefix("#") { [INFO] [stdout] 84 | if s.len() < 2 { [INFO] [stdout] ... [INFO] [stdout] 89 | } [INFO] [stdout] 90 ~ return Ok(Selector::ID(.to_string())); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: stripping a prefix manually [INFO] [stdout] --> src/lib.rs:99:43 [INFO] [stdout] | [INFO] [stdout] 99 | return Ok(Selector::Class(s[1..].to_string())); [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: the prefix was tested here [INFO] [stdout] --> src/lib.rs:92:13 [INFO] [stdout] | [INFO] [stdout] 92 | if s.starts_with(".") { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_strip [INFO] [stdout] help: try using the `strip_prefix` method [INFO] [stdout] | [INFO] [stdout] 92 ~ if let Some() = s.strip_prefix(".") { [INFO] [stdout] 93 | if s.len() < 2 { [INFO] [stdout] ... [INFO] [stdout] 98 | } [INFO] [stdout] 99 ~ return Ok(Selector::Class(.to_string())); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: stripping a prefix manually [INFO] [stdout] --> src/lib.rs:108:44 [INFO] [stdout] | [INFO] [stdout] 108 | return Ok(Selector::Pseudo(s[1..].to_string())); [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: the prefix was tested here [INFO] [stdout] --> src/lib.rs:101:13 [INFO] [stdout] | [INFO] [stdout] 101 | if s.starts_with(":") { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_strip [INFO] [stdout] help: try using the `strip_prefix` method [INFO] [stdout] | [INFO] [stdout] 101 ~ if let Some() = s.strip_prefix(":") { [INFO] [stdout] 102 | if s.len() < 2 { [INFO] [stdout] ... [INFO] [stdout] 107 | } [INFO] [stdout] 108 ~ return Ok(Selector::Pseudo(.to_string())); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lib.rs:111:21 [INFO] [stdout] | [INFO] [stdout] 111 | assert!(s.len() > 0); [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] = note: `#[warn(clippy::len_zero)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let` [INFO] [stdout] --> src/lib.rs:119:5 [INFO] [stdout] | [INFO] [stdout] 119 | / match s[1] { [INFO] [stdout] 120 | | Token::Identifier(oper) => { [INFO] [stdout] 121 | | if oper == ">" { [INFO] [stdout] 122 | | let b = parse_selector(&s[2..], pos)?; [INFO] [stdout] ... | [INFO] [stdout] 130 | | _ => {} [INFO] [stdout] 131 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stdout] = note: `#[warn(clippy::single_match)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 119 ~ if let Token::Identifier(oper) = s[1] { [INFO] [stdout] 120 + if oper == ">" { [INFO] [stdout] 121 + let b = parse_selector(&s[2..], pos)?; [INFO] [stdout] 122 + return Ok(Selector::Child(Box::new(a), Box::new(b))); [INFO] [stdout] 123 + } [INFO] [stdout] 124 + if oper == "+" { [INFO] [stdout] 125 + let b = parse_selector(&s[2..], pos)?; [INFO] [stdout] 126 + return Ok(Selector::NextSibling(Box::new(a), Box::new(b))); [INFO] [stdout] 127 + } [INFO] [stdout] 128 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/lib.rs:210:61 [INFO] [stdout] | [INFO] [stdout] 210 | current_property.value.push(parse_value(&s)); [INFO] [stdout] | ^^ help: change this to: `s` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] = note: `#[warn(clippy::needless_borrow)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/lib.rs:369:12 [INFO] [stdout] | [INFO] [stdout] 369 | if !id_char(c) && !(ctx == ParsingContext::Selector && c == ':' && !seen_non_colon) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `!(id_char(c) || ctx == ParsingContext::Selector && c == ':' && !seen_non_colon)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] = note: `#[warn(clippy::nonminimal_bool)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: used `unwrap_or()` on `Some` value [INFO] [stdout] --> src/lib.rs:334:23 [INFO] [stdout] | [INFO] [stdout] 334 | location: unclosed_opener_pos.unwrap_or(*pos), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] help: remove the `Some` and `unwrap_or()` [INFO] [stdout] --> src/lib.rs:318:35 [INFO] [stdout] | [INFO] [stdout] 318 | let unclosed_opener_pos = Some(*pos); [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_literal_unwrap [INFO] [stdout] = note: `#[warn(clippy::unnecessary_literal_unwrap)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: used `unwrap_or()` on `Some` value [INFO] [stdout] --> src/lib.rs:364:27 [INFO] [stdout] | [INFO] [stdout] 364 | location: unclosed_opener_pos.unwrap_or(*pos), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] help: remove the `Some` and `unwrap_or()` [INFO] [stdout] --> src/lib.rs:348:39 [INFO] [stdout] | [INFO] [stdout] 348 | let unclosed_opener_pos = Some(*pos); [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_literal_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:442:5 [INFO] [stdout] | [INFO] [stdout] 442 | / if value.starts_with("#") { [INFO] [stdout] 443 | | if let Some(c) = parse_colour(value) { [INFO] [stdout] 444 | | return Value::Colour(c); [INFO] [stdout] 445 | | } [INFO] [stdout] 446 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 442 ~ if value.starts_with("#") [INFO] [stdout] 443 ~ && let Some(c) = parse_colour(value) { [INFO] [stdout] 444 | return Value::Colour(c); [INFO] [stdout] 445 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:448:5 [INFO] [stdout] | [INFO] [stdout] 448 | / if value.ends_with("rad") { [INFO] [stdout] 449 | | if let Ok(v) = value.trim_end_matches("rad").parse::() { [INFO] [stdout] 450 | | return Value::Angle(v); [INFO] [stdout] 451 | | } [INFO] [stdout] 452 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 448 ~ if value.ends_with("rad") [INFO] [stdout] 449 ~ && let Ok(v) = value.trim_end_matches("rad").parse::() { [INFO] [stdout] 450 | return Value::Angle(v); [INFO] [stdout] 451 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:454:5 [INFO] [stdout] | [INFO] [stdout] 454 | / if value.ends_with("deg") { [INFO] [stdout] 455 | | if let Ok(v) = value.trim_end_matches("deg").parse::() { [INFO] [stdout] 456 | | return Value::Angle(v.to_radians()); [INFO] [stdout] 457 | | } [INFO] [stdout] 458 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 454 ~ if value.ends_with("deg") [INFO] [stdout] 455 ~ && let Ok(v) = value.trim_end_matches("deg").parse::() { [INFO] [stdout] 456 | return Value::Angle(v.to_radians()); [INFO] [stdout] 457 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:460:5 [INFO] [stdout] | [INFO] [stdout] 460 | / if value.ends_with("px") { [INFO] [stdout] 461 | | if let Ok(v) = value.trim_end_matches("px").parse::() { [INFO] [stdout] 462 | | return Value::Length(Length::Px(v)); [INFO] [stdout] 463 | | } [INFO] [stdout] 464 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 460 ~ if value.ends_with("px") [INFO] [stdout] 461 ~ && let Ok(v) = value.trim_end_matches("px").parse::() { [INFO] [stdout] 462 | return Value::Length(Length::Px(v)); [INFO] [stdout] 463 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:466:5 [INFO] [stdout] | [INFO] [stdout] 466 | / if value.ends_with("%") { [INFO] [stdout] 467 | | if let Ok(v) = value.trim_end_matches("%").parse::() { [INFO] [stdout] 468 | | return Value::Length(Length::Percentage(v)); [INFO] [stdout] 469 | | } [INFO] [stdout] 470 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 466 ~ if value.ends_with("%") [INFO] [stdout] 467 ~ && let Ok(v) = value.trim_end_matches("%").parse::() { [INFO] [stdout] 468 | return Value::Length(Length::Percentage(v)); [INFO] [stdout] 469 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:485:5 [INFO] [stdout] | [INFO] [stdout] 485 | / if value.starts_with("var") { [INFO] [stdout] 486 | | if let Some(args) = css_function_args(value) { [INFO] [stdout] 487 | | if args.len() == 1 { [INFO] [stdout] 488 | | return Value::Variable(args[0].to_string()); [INFO] [stdout] ... | [INFO] [stdout] 491 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 485 ~ if value.starts_with("var") [INFO] [stdout] 486 ~ && let Some(args) = css_function_args(value) { [INFO] [stdout] 487 | if args.len() == 1 { [INFO] [stdout] 488 | return Value::Variable(args[0].to_string()); [INFO] [stdout] 489 | } [INFO] [stdout] 490 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:486:9 [INFO] [stdout] | [INFO] [stdout] 486 | / if let Some(args) = css_function_args(value) { [INFO] [stdout] 487 | | if args.len() == 1 { [INFO] [stdout] 488 | | return Value::Variable(args[0].to_string()); [INFO] [stdout] 489 | | } [INFO] [stdout] 490 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 486 ~ if let Some(args) = css_function_args(value) [INFO] [stdout] 487 ~ && args.len() == 1 { [INFO] [stdout] 488 | return Value::Variable(args[0].to_string()); [INFO] [stdout] 489 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lib.rs:493:5 [INFO] [stdout] | [INFO] [stdout] 493 | / if value.starts_with("linear-gradient") || value.starts_with("gradient") { [INFO] [stdout] 494 | | if let Some(args) = css_function_args(value) { [INFO] [stdout] 495 | | let (angle, points) = parse_gradient(args.iter().map(|s| s.as_str()).collect()); [INFO] [stdout] ... | [INFO] [stdout] 499 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 493 ~ if (value.starts_with("linear-gradient") || value.starts_with("gradient")) { [INFO] [stdout] 494 ~ && let Some(args) = css_function_args(value) { [INFO] [stdout] 495 | let (angle, points) = parse_gradient(args.iter().map(|s| s.as_str()).collect()); [INFO] [stdout] 496 | [INFO] [stdout] 497 | return Value::LinearGradient { angle, points }; [INFO] [stdout] 498 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.53s [INFO] running `Command { std: "docker" "inspect" "8bc6385d1cbe70d5a5c14414d68706ed07ed9dfbf9cea88fd74deed11bbad44d", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "8bc6385d1cbe70d5a5c14414d68706ed07ed9dfbf9cea88fd74deed11bbad44d", kill_on_drop: false }` [INFO] [stdout] 8bc6385d1cbe70d5a5c14414d68706ed07ed9dfbf9cea88fd74deed11bbad44d