[INFO] cloning repository https://github.com/FishArmy100/cirrus [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/FishArmy100/cirrus" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FFishArmy100%2Fcirrus", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FFishArmy100%2Fcirrus'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] c96ee203de40fe3c2097e6689aff01d8ee14f0ad [INFO] linting FishArmy100/cirrus against nightly for clippy-nonminimal_bool-denied [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FFishArmy100%2Fcirrus" "/workspace/builds/worker-7-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-7-tc1/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/FishArmy100/cirrus [INFO] finished tweaking git repo https://github.com/FishArmy100/cirrus [INFO] tweaked toml for git repo https://github.com/FishArmy100/cirrus written to /workspace/builds/worker-7-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/FishArmy100/cirrus 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/FishArmy100/cirrus 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-7-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-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] 2d35ada1de798e6d43ebc3509f1f89a6ddea78545ee2291d1b4fee74fabc9185 [INFO] running `Command { std: "docker" "start" "-a" "2d35ada1de798e6d43ebc3509f1f89a6ddea78545ee2291d1b4fee74fabc9185", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "2d35ada1de798e6d43ebc3509f1f89a6ddea78545ee2291d1b4fee74fabc9185", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "2d35ada1de798e6d43ebc3509f1f89a6ddea78545ee2291d1b4fee74fabc9185", kill_on_drop: false }` [INFO] [stdout] 2d35ada1de798e6d43ebc3509f1f89a6ddea78545ee2291d1b4fee74fabc9185 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-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] 9a0323b8ec1d7492a302c6874956882b773369558f7e5dcf1a3cf6fa8bc049ff [INFO] running `Command { std: "docker" "start" "-a" "9a0323b8ec1d7492a302c6874956882b773369558f7e5dcf1a3cf6fa8bc049ff", kill_on_drop: false }` [INFO] [stderr] Checking either v1.15.0 [INFO] [stderr] Checking serde v1.0.219 [INFO] [stderr] Checking itertools v0.14.0 [INFO] [stderr] Checking serde_json v1.0.140 [INFO] [stderr] Checking cirrus v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: constants have by default a `'static` lifetime [INFO] [stdout] --> src/lexing/token.rs:2:31 [INFO] [stdout] | [INFO] [stdout] 2 | pub const ASSIGNMENT_TOKENS: &'static [TokenType] = &[ [INFO] [stdout] | -^^^^^^^------------ help: consider removing `'static`: `&[TokenType]` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_static_lifetimes [INFO] [stdout] = note: `#[warn(clippy::redundant_static_lifetimes)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unnecessary `>= y + 1` or `x - 1 >=` [INFO] [stdout] --> src/parsing/token_reader.rs:157:12 [INFO] [stdout] | [INFO] [stdout] 157 | if self.index + count - 1 >= self.tokens.len() [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change it to: `self.index + count > self.tokens.len()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#int_plus_one [INFO] [stdout] = note: `#[warn(clippy::int_plus_one)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `pattern_parsing::parse_pattern` [INFO] [stdout] --> src/parsing/expr_parsing.rs:5:13 [INFO] [stdout] | [INFO] [stdout] 5 | use super::{pattern_parsing::parse_pattern, stmt_parsing::parse_statement, *}; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: constants have by default a `'static` lifetime [INFO] [stdout] --> src/lexing/token.rs:2:31 [INFO] [stdout] | [INFO] [stdout] 2 | pub const ASSIGNMENT_TOKENS: &'static [TokenType] = &[ [INFO] [stdout] | -^^^^^^^------------ help: consider removing `'static`: `&[TokenType]` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_static_lifetimes [INFO] [stdout] = note: `#[warn(clippy::redundant_static_lifetimes)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unnecessary `>= y + 1` or `x - 1 >=` [INFO] [stdout] --> src/parsing/token_reader.rs:157:12 [INFO] [stdout] | [INFO] [stdout] 157 | if self.index + count - 1 >= self.tokens.len() [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change it to: `self.index + count > self.tokens.len()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#int_plus_one [INFO] [stdout] = note: `#[warn(clippy::int_plus_one)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `pattern_parsing::parse_pattern` [INFO] [stdout] --> src/parsing/expr_parsing.rs:5:13 [INFO] [stdout] | [INFO] [stdout] 5 | use super::{pattern_parsing::parse_pattern, stmt_parsing::parse_statement, *}; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the loop variable `i` is only used to index `text` [INFO] [stdout] --> src/lexing/token.rs:143:18 [INFO] [stdout] | [INFO] [stdout] 143 | for i in 0..=self.pos.begin [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stdout] = note: `#[warn(clippy::needless_range_loop)]` on by default [INFO] [stdout] help: consider using an iterator [INFO] [stdout] | [INFO] [stdout] 143 - for i in 0..=self.pos.begin [INFO] [stdout] 143 + for in text.iter().take(self.pos.begin + 1) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lexing/char_reader.rs:21:12 [INFO] [stdout] | [INFO] [stdout] 21 | if text.len() == 0 { return None; } [INFO] [stdout] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `text.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: this `let...else` may be rewritten with the `?` operator [INFO] [stdout] --> src/lexing/char_reader.rs:80:9 [INFO] [stdout] | [INFO] [stdout] 80 | let Some(c) = self.current() else { return None }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `let c = self.current()?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] = note: `#[warn(clippy::question_mark)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `.map(...).all(identity)` [INFO] [stdout] --> src/lexing/char_reader.rs:94:48 [INFO] [stdout] | [INFO] [stdout] 94 | let all_match = cs.chars().enumerate().map(|(i, c)| self.peek(i) == Some(c)).all(|b| b); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_all_any_identity [INFO] [stdout] = note: `#[warn(clippy::map_all_any_identity)]` on by default [INFO] [stdout] help: use `.all(...)` instead [INFO] [stdout] | [INFO] [stdout] 94 - let all_match = cs.chars().enumerate().map(|(i, c)| self.peek(i) == Some(c)).all(|b| b); [INFO] [stdout] 94 + let all_match = cs.chars().enumerate().all(|(i, c)| self.peek(i) == Some(c)); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant pattern matching, consider using `is_some()` [INFO] [stdout] --> src/lexing/char_reader.rs:125:19 [INFO] [stdout] | [INFO] [stdout] 125 | while let Some(_) = self.check(&[c]) [INFO] [stdout] | ----------^^^^^^^------------------- help: try: `while self.check(&[c]).is_some()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stdout] = note: `#[warn(clippy::redundant_pattern_matching)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` has identical blocks [INFO] [stdout] --> src/lexing/mod.rs:59:9 [INFO] [stdout] | [INFO] [stdout] 59 | / { [INFO] [stdout] 60 | | continue; [INFO] [stdout] 61 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] note: same as this [INFO] [stdout] --> src/lexing/mod.rs:63:9 [INFO] [stdout] | [INFO] [stdout] 63 | / { [INFO] [stdout] 64 | | continue; [INFO] [stdout] 65 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#if_same_then_else [INFO] [stdout] = note: `#[warn(clippy::if_same_then_else)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `let...else` may be rewritten with the `?` operator [INFO] [stdout] --> src/lexing/mod.rs:126:5 [INFO] [stdout] | [INFO] [stdout] 126 | let Some(c) = reader.current() else { return None }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `let c = reader.current()?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lexing/mod.rs:289:8 [INFO] [stdout] | [INFO] [stdout] 289 | if text.len() > 0 [INFO] [stdout] | ^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!text.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] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/lexing/mod.rs:314:8 [INFO] [stdout] | [INFO] [stdout] 314 | if !reader.current().is_some_and(|c| c == '\"') { return None }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `reader.current().is_none_or(|c| c != '\"')` [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: use of `char::is_digit` with literal radix of 10 [INFO] [stdout] --> src/lexing/mod.rs:347:42 [INFO] [stdout] | [INFO] [stdout] 347 | if !reader.current().is_some_and(|c| c.is_digit(10)) { return None; } [INFO] [stdout] | ^^^^^^^^^^^^^^ help: try: `c.is_ascii_digit()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#is_digit_ascii_radix [INFO] [stdout] = note: `#[warn(clippy::is_digit_ascii_radix)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: use of `char::is_digit` with literal radix of 10 [INFO] [stdout] --> src/lexing/mod.rs:352:44 [INFO] [stdout] | [INFO] [stdout] 352 | while reader.current().is_some_and(|c| c.is_digit(10)) [INFO] [stdout] | ^^^^^^^^^^^^^^ help: try: `c.is_ascii_digit()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#is_digit_ascii_radix [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: use of `char::is_digit` with literal radix of 10 [INFO] [stdout] --> src/lexing/mod.rs:357:68 [INFO] [stdout] | [INFO] [stdout] 357 | if reader.current_is(&['.']) && reader.peek(1).is_some_and(|c| c.is_digit(10)) [INFO] [stdout] | ^^^^^^^^^^^^^^ help: try: `c.is_ascii_digit()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#is_digit_ascii_radix [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: use of `char::is_digit` with literal radix of 10 [INFO] [stdout] --> src/lexing/mod.rs:360:48 [INFO] [stdout] | [INFO] [stdout] 360 | while reader.current().is_some_and(|c| c.is_digit(10)) [INFO] [stdout] | ^^^^^^^^^^^^^^ help: try: `c.is_ascii_digit()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#is_digit_ascii_radix [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/parsing/token_reader.rs:16:12 [INFO] [stdout] | [INFO] [stdout] 16 | if tokens.len() == 0 || start_index.is_some_and(|s| s >= tokens.len()) { return None }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `tokens.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] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/parsing/token_reader.rs:31:9 [INFO] [stdout] | [INFO] [stdout] 31 | &self.tokens [INFO] [stdout] | ^^^^^^^^^^^^ help: change this to: `self.tokens` [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: usage of `.map(...).all(identity)` [INFO] [stdout] --> src/parsing/token_reader.rs:89:26 [INFO] [stdout] | [INFO] [stdout] 89 | (0..types.len()).map(|i| self.peek_is(count + i, types[i])).all(|b| b) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_all_any_identity [INFO] [stdout] help: use `.all(...)` instead [INFO] [stdout] | [INFO] [stdout] 89 - (0..types.len()).map(|i| self.peek_is(count + i, types[i])).all(|b| b) [INFO] [stdout] 89 + (0..types.len()).all(|i| self.peek_is(count + i, types[i])) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `let...else` may be rewritten with the `?` operator [INFO] [stdout] --> src/parsing/token_reader.rs:123:9 [INFO] [stdout] | [INFO] [stdout] 123 | let Some(t) = self.current() else { return None; }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `let t = self.current()?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `.map(...).all(identity)` [INFO] [stdout] --> src/parsing/token_reader.rs:137:50 [INFO] [stdout] | [INFO] [stdout] 137 | let all_match = types.iter().enumerate().map(|(i, t)| self.peek(i).is_some_and(|c| c.token_type == *t)).all(|b| b); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_all_any_identity [INFO] [stdout] help: use `.all(...)` instead [INFO] [stdout] | [INFO] [stdout] 137 - let all_match = types.iter().enumerate().map(|(i, t)| self.peek(i).is_some_and(|c| c.token_type == *t)).all(|b| b); [INFO] [stdout] 137 + let all_match = types.iter().enumerate().all(|(i, t)| self.peek(i).is_some_and(|c| c.token_type == *t)); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `.map(...).all(identity)` [INFO] [stdout] --> src/parsing/token_reader.rs:150:34 [INFO] [stdout] | [INFO] [stdout] 150 | types.iter().enumerate().map(|(i, t)| self.peek(i).is_some_and(|c| c.token_type == *t)).all(|b| b) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_all_any_identity [INFO] [stdout] help: use `.all(...)` instead [INFO] [stdout] | [INFO] [stdout] 150 - types.iter().enumerate().map(|(i, t)| self.peek(i).is_some_and(|c| c.token_type == *t)).all(|b| b) [INFO] [stdout] 150 + types.iter().enumerate().all(|(i, t)| self.peek(i).is_some_and(|c| c.token_type == *t)) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `let...else` may be rewritten with the `?` operator [INFO] [stdout] --> src/parsing/type_parsing.rs:7:5 [INFO] [stdout] | [INFO] [stdout] 7 | / let Some(mut type_reader) = TokenReader::new(reader.tokens(), Some(reader.index())) else { [INFO] [stdout] 8 | | return None; [INFO] [stdout] 9 | | }; [INFO] [stdout] | |______^ help: replace it with: `let mut type_reader = TokenReader::new(reader.tokens(), Some(reader.index()))?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `let...else` may be rewritten with the `?` operator [INFO] [stdout] --> src/parsing/type_parsing.rs:20:5 [INFO] [stdout] | [INFO] [stdout] 20 | / let Some(mut type_reader) = TokenReader::new(reader.tokens(), Some(reader.index())) else { [INFO] [stdout] 21 | | return None; [INFO] [stdout] 22 | | }; [INFO] [stdout] | |______^ help: replace it with: `let mut type_reader = TokenReader::new(reader.tokens(), Some(reader.index()))?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `let...else` may be rewritten with the `?` operator [INFO] [stdout] --> src/parsing/type_parsing.rs:34:5 [INFO] [stdout] | [INFO] [stdout] 34 | / let Some(mut type_reader) = TokenReader::new(reader.tokens(), Some(reader.index())) else { [INFO] [stdout] 35 | | return None; [INFO] [stdout] 36 | | }; [INFO] [stdout] | |______^ help: replace it with: `let mut type_reader = TokenReader::new(reader.tokens(), Some(reader.index()))?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/parsing/expr_parsing.rs:331:56 [INFO] [stdout] | [INFO] [stdout] 331 | let expression = parse_expression(reader)?.map(|e| Box::new(e)); [INFO] [stdout] | ^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `Box::new` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] = note: `#[warn(clippy::redundant_closure)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/parsing/stmt_parsing.rs:93:29 [INFO] [stdout] | [INFO] [stdout] 93 | expect_ast_item(reader, |r| parse_declaration(r), |t| ParserError::ExpectedDeclaration(t)) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the function itself: `parse_declaration` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/parsing/stmt_parsing.rs:93:55 [INFO] [stdout] | [INFO] [stdout] 93 | expect_ast_item(reader, |r| parse_declaration(r), |t| ParserError::ExpectedDeclaration(t)) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `ParserError::ExpectedDeclaration` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `Option::map` [INFO] [stdout] --> src/parsing/stmt_parsing.rs:265:10 [INFO] [stdout] | [INFO] [stdout] 265 | else if let Some(type_decl) = parse_type_decl(reader)? [INFO] [stdout] | __________^ [INFO] [stdout] 266 | | { [INFO] [stdout] 267 | | Some(Statement::TypeDecl(type_decl)) [INFO] [stdout] ... | [INFO] [stdout] 271 | | None [INFO] [stdout] 272 | | }; [INFO] [stdout] | |_____^ help: try: `{ parse_type_decl(reader)?.map(Statement::TypeDecl) }` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_map [INFO] [stdout] = note: `#[warn(clippy::manual_map)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/parsing/stmt_parsing.rs:672:12 [INFO] [stdout] | [INFO] [stdout] 672 | if ids.len() == 0 [INFO] [stdout] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `ids.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] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/parsing/mod.rs:86:8 [INFO] [stdout] | [INFO] [stdout] 86 | if errors.len() > 0 [INFO] [stdout] | ^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!errors.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] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/parsing/mod.rs:191:12 [INFO] [stdout] | [INFO] [stdout] 191 | if !reader.check(TokenType::Comma).is_some() { break; } [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `reader.check(TokenType::Comma).is_none()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: large size difference between variants [INFO] [stdout] --> src/ast/expr.rs:16:1 [INFO] [stdout] | [INFO] [stdout] 16 | / pub enum LambdaParams [INFO] [stdout] 17 | | { [INFO] [stdout] 18 | | Simple(Token), [INFO] [stdout] | | ------------- the second-largest variant contains at least 48 bytes [INFO] [stdout] 19 | |/ Complex [INFO] [stdout] 20 | || { [INFO] [stdout] 21 | || open_pipe: Token, [INFO] [stdout] 22 | || parameters: Vec, [INFO] [stdout] ... || [INFO] [stdout] 25 | || return_type: Option, [INFO] [stdout] 26 | || } [INFO] [stdout] | ||_____- the largest variant contains at least 400 bytes [INFO] [stdout] 27 | | } [INFO] [stdout] | |__^ the entire enum is at least 400 bytes [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stdout] = note: `#[warn(clippy::large_enum_variant)]` on by default [INFO] [stdout] help: consider boxing the large fields or introducing indirection in some other way to reduce the total size of the enum [INFO] [stdout] | [INFO] [stdout] 25 - return_type: Option, [INFO] [stdout] 25 + return_type: Box>, [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: large size difference between variants [INFO] [stdout] --> src/ast/expr.rs:180:1 [INFO] [stdout] | [INFO] [stdout] 180 | / pub enum Expression [INFO] [stdout] 181 | | { [INFO] [stdout] 182 | | Lambda(LambdaExpr), [INFO] [stdout] | | ------------------ the second-largest variant contains at least 456 bytes [INFO] [stdout] 183 | | Literal(Token), [INFO] [stdout] ... | [INFO] [stdout] 197 | | IfExpr(IfExpr), [INFO] [stdout] | | -------------- the largest variant contains at least 864 bytes [INFO] [stdout] 198 | | MatchExpr(MatchExpr), [INFO] [stdout] 199 | | Cast(CastExpr) [INFO] [stdout] 200 | | } [INFO] [stdout] | |_^ the entire enum is at least 864 bytes [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stdout] help: consider boxing the large fields or introducing indirection in some other way to reduce the total size of the enum [INFO] [stdout] | [INFO] [stdout] 197 - IfExpr(IfExpr), [INFO] [stdout] 197 + IfExpr(Box), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: large size difference between variants [INFO] [stdout] --> src/ast/stmt.rs:24:1 [INFO] [stdout] | [INFO] [stdout] 24 | / pub enum LetBinding [INFO] [stdout] 25 | | { [INFO] [stdout] 26 | |/ Variable [INFO] [stdout] 27 | || { [INFO] [stdout] 28 | || mut_tok: Option, [INFO] [stdout] 29 | || id: Token [INFO] [stdout] 30 | || }, [INFO] [stdout] | ||_____- the second-largest variant contains at least 96 bytes [INFO] [stdout] 31 | | Pattern(Pattern) [INFO] [stdout] | | ---------------- the largest variant contains at least 352 bytes [INFO] [stdout] 32 | | } [INFO] [stdout] | |__^ the entire enum is at least 352 bytes [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stdout] help: consider boxing the large fields or introducing indirection in some other way to reduce the total size of the enum [INFO] [stdout] | [INFO] [stdout] 31 - Pattern(Pattern) [INFO] [stdout] 31 + Pattern(Box) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: large size difference between variants [INFO] [stdout] --> src/ast/stmt.rs:71:1 [INFO] [stdout] | [INFO] [stdout] 71 | / pub enum FnParam [INFO] [stdout] 72 | | { [INFO] [stdout] 73 | | / Normal [INFO] [stdout] 74 | | | { [INFO] [stdout] 75 | | | mut_tok: Option, [INFO] [stdout] 76 | | | id: Token, [INFO] [stdout] ... | | [INFO] [stdout] 79 | | | default_value: Option<(Token, Expression)> [INFO] [stdout] 80 | | | }, [INFO] [stdout] | | |_____- the largest variant contains at least 1288 bytes [INFO] [stdout] 81 | | / SelfParam [INFO] [stdout] 82 | | | { [INFO] [stdout] 83 | | | mut_tok: Option, [INFO] [stdout] 84 | | | self_tok: Token, [INFO] [stdout] 85 | | | } [INFO] [stdout] | | |_____- the second-largest variant contains at least 96 bytes [INFO] [stdout] 86 | | } [INFO] [stdout] | |___^ the entire enum is at least 1288 bytes [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stdout] help: consider boxing the large fields or introducing indirection in some other way to reduce the total size of the enum [INFO] [stdout] | [INFO] [stdout] 78 ~ type_name: Box, [INFO] [stdout] 79 ~ default_value: Box> [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: large size difference between variants [INFO] [stdout] --> src/ast/stmt.rs:149:1 [INFO] [stdout] | [INFO] [stdout] 149 | / pub enum EnumMember [INFO] [stdout] 150 | | { [INFO] [stdout] 151 | | Basic(Token), [INFO] [stdout] 152 | | / Single [INFO] [stdout] 153 | | | { [INFO] [stdout] 154 | | | id: Token, [INFO] [stdout] 155 | | | open_paren: Token, [INFO] [stdout] 156 | | | type_name: TypeName, [INFO] [stdout] 157 | | | close_paren: Token [INFO] [stdout] 158 | | | }, [INFO] [stdout] | | |_____- the largest variant contains at least 376 bytes [INFO] [stdout] 159 | | / Struct [INFO] [stdout] 160 | | | { [INFO] [stdout] 161 | | | id: Token, [INFO] [stdout] 162 | | | open_brace: Token, [INFO] [stdout] 163 | | | members: Vec, [INFO] [stdout] 164 | | | close_brace: Token, [INFO] [stdout] 165 | | | } [INFO] [stdout] | | |_____- the second-largest variant contains at least 168 bytes [INFO] [stdout] 166 | | } [INFO] [stdout] | |___^ the entire enum is at least 376 bytes [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stdout] help: consider boxing the large fields or introducing indirection in some other way to reduce the total size of the enum [INFO] [stdout] | [INFO] [stdout] 156 - type_name: TypeName, [INFO] [stdout] 156 + type_name: Box, [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: large size difference between variants [INFO] [stdout] --> src/ast/stmt.rs:245:1 [INFO] [stdout] | [INFO] [stdout] 245 | / pub enum Declaration [INFO] [stdout] 246 | | { [INFO] [stdout] 247 | | Fn(Option, FnDecl), [INFO] [stdout] 248 | | Struct(Option, StructDecl), [INFO] [stdout] ... | [INFO] [stdout] 252 | | Let(Option, LetStmt), [INFO] [stdout] | | --------------------------- the largest variant contains at least 1864 bytes [INFO] [stdout] 253 | | Use(Option, UseStmt), [INFO] [stdout] 254 | | Impl(ImplStmt), [INFO] [stdout] | | -------------- the second-largest variant contains at least 872 bytes [INFO] [stdout] 255 | | } [INFO] [stdout] | |_^ the entire enum is at least 1864 bytes [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stdout] help: consider boxing the large fields or introducing indirection in some other way to reduce the total size of the enum [INFO] [stdout] | [INFO] [stdout] 252 - Let(Option, LetStmt), [INFO] [stdout] 252 + Let(Option, Box), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/ast/mod.rs:46:9 [INFO] [stdout] | [INFO] [stdout] 46 | / match self [INFO] [stdout] 47 | | { [INFO] [stdout] 48 | | Self::Access { inner: _, dot: _, name: _, args: _ } => true, [INFO] [stdout] 49 | | _ => false, [INFO] [stdout] 50 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] = note: `#[warn(clippy::match_like_matches_macro)]` on by default [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 46 - match self [INFO] [stdout] 47 - { [INFO] [stdout] 48 - Self::Access { inner: _, dot: _, name: _, args: _ } => true, [INFO] [stdout] 49 - _ => false, [INFO] [stdout] 50 - } [INFO] [stdout] 46 + matches!(self, Self::Access { inner: _, dot: _, name: _, args: _ }) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `.map(...).any(identity)` [INFO] [stdout] --> src/ast/mod.rs:57:99 [INFO] [stdout] | [INFO] [stdout] 57 | TypeName::Identifier { name: _, args } => args.as_ref().is_some_and(|a| a.args.iter().map(|a| a.is_definite()).any(|t| t)), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_all_any_identity [INFO] [stdout] help: use `.any(...)` instead [INFO] [stdout] | [INFO] [stdout] 57 - TypeName::Identifier { name: _, args } => args.as_ref().is_some_and(|a| a.args.iter().map(|a| a.is_definite()).any(|t| t)), [INFO] [stdout] 57 + TypeName::Identifier { name: _, args } => args.as_ref().is_some_and(|a| a.args.iter().any(|a| a.is_definite())), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `.map(...).any(identity)` [INFO] [stdout] --> src/ast/mod.rs:60:133 [INFO] [stdout] | [INFO] [stdout] 60 | ...|| args.as_ref().is_some_and(|a| a.args.iter().map(|a| a.is_definite()).any(|t| t)), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_all_any_identity [INFO] [stdout] help: use `.any(...)` instead [INFO] [stdout] | [INFO] [stdout] 60 - TypeName::Access { inner, dot: _, name: _, args } => inner.is_definite() || args.as_ref().is_some_and(|a| a.args.iter().map(|a| a.is_definite()).any(|t| t)), [INFO] [stdout] 60 + TypeName::Access { inner, dot: _, name: _, args } => inner.is_definite() || args.as_ref().is_some_and(|a| a.args.iter().any(|a| a.is_definite())), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: `to_string` applied to a type that implements `Display` in `format!` args [INFO] [stdout] --> src/ast/mod.rs:88:99 [INFO] [stdout] | [INFO] [stdout] 88 | let mut text = format!("{}.{}", inner.pretty_print(), name.value.as_ref().unwrap().to_string()); [INFO] [stdout] | ^^^^^^^^^^^^ help: remove this [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_in_format_args [INFO] [stdout] = note: `#[warn(clippy::to_string_in_format_args)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: large size difference between variants [INFO] [stdout] --> src/ast/mod.rs:182:1 [INFO] [stdout] | [INFO] [stdout] 182 | / pub enum LetCondition [INFO] [stdout] 183 | | { [INFO] [stdout] 184 | | Expression(Box), [INFO] [stdout] | | --------------------------- the second-largest variant contains at least 8 bytes [INFO] [stdout] 185 | |/ Pattern [INFO] [stdout] 186 | || { [INFO] [stdout] 187 | || let_tok: Token, [INFO] [stdout] 188 | || pattern: Pattern, [INFO] [stdout] ... || [INFO] [stdout] 192 | || other_cond: Option>, [INFO] [stdout] 193 | || } [INFO] [stdout] | ||_____- the largest variant contains at least 512 bytes [INFO] [stdout] 194 | | } [INFO] [stdout] | |__^ the entire enum is at least 512 bytes [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stdout] help: consider boxing the large fields or introducing indirection in some other way to reduce the total size of the enum [INFO] [stdout] | [INFO] [stdout] 188 - pattern: Pattern, [INFO] [stdout] 188 + pattern: Box, [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the loop variable `i` is only used to index `text` [INFO] [stdout] --> src/lexing/token.rs:143:18 [INFO] [stdout] | [INFO] [stdout] 143 | for i in 0..=self.pos.begin [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stdout] = note: `#[warn(clippy::needless_range_loop)]` on by default [INFO] [stdout] help: consider using an iterator [INFO] [stdout] | [INFO] [stdout] 143 - for i in 0..=self.pos.begin [INFO] [stdout] 143 + for in text.iter().take(self.pos.begin + 1) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: implementation of inherent method `to_string(&self) -> String` for type `utils::PrettyPrinter` [INFO] [stdout] --> src/utils.rs:48:5 [INFO] [stdout] | [INFO] [stdout] 48 | / pub fn to_string(&self) -> String { [INFO] [stdout] 49 | | self.result.clone() [INFO] [stdout] 50 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: implement trait `Display` for type `utils::PrettyPrinter` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#inherent_to_string [INFO] [stdout] = note: `#[warn(clippy::inherent_to_string)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant pattern matching, consider using `is_err()` [INFO] [stdout] --> src/main.rs:17:12 [INFO] [stdout] | [INFO] [stdout] 17 | if let Err(_) = file.read_to_string(&mut contents) [INFO] [stdout] | -------^^^^^^------------------------------------- help: try: `if file.read_to_string(&mut contents).is_err()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `format!` [INFO] [stdout] --> src/main.rs:19:20 [INFO] [stdout] | [INFO] [stdout] 19 | return Err(format!("Invalid file format")); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"Invalid file format".to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stdout] = note: `#[warn(clippy::useless_format)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/main.rs:57:8 [INFO] [stdout] | [INFO] [stdout] 57 | if tokens.errors.len() > 0 [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!tokens.errors.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] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lexing/char_reader.rs:21:12 [INFO] [stdout] | [INFO] [stdout] 21 | if text.len() == 0 { return None; } [INFO] [stdout] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `text.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: this `let...else` may be rewritten with the `?` operator [INFO] [stdout] --> src/lexing/char_reader.rs:80:9 [INFO] [stdout] | [INFO] [stdout] 80 | let Some(c) = self.current() else { return None }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `let c = self.current()?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] = note: `#[warn(clippy::question_mark)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `.map(...).all(identity)` [INFO] [stdout] --> src/lexing/char_reader.rs:94:48 [INFO] [stdout] | [INFO] [stdout] 94 | let all_match = cs.chars().enumerate().map(|(i, c)| self.peek(i) == Some(c)).all(|b| b); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_all_any_identity [INFO] [stdout] = note: `#[warn(clippy::map_all_any_identity)]` on by default [INFO] [stdout] help: use `.all(...)` instead [INFO] [stdout] | [INFO] [stdout] 94 - let all_match = cs.chars().enumerate().map(|(i, c)| self.peek(i) == Some(c)).all(|b| b); [INFO] [stdout] 94 + let all_match = cs.chars().enumerate().all(|(i, c)| self.peek(i) == Some(c)); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant pattern matching, consider using `is_some()` [INFO] [stdout] --> src/lexing/char_reader.rs:125:19 [INFO] [stdout] | [INFO] [stdout] 125 | while let Some(_) = self.check(&[c]) [INFO] [stdout] | ----------^^^^^^^------------------- help: try: `while self.check(&[c]).is_some()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stdout] = note: `#[warn(clippy::redundant_pattern_matching)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` has identical blocks [INFO] [stdout] --> src/lexing/mod.rs:59:9 [INFO] [stdout] | [INFO] [stdout] 59 | / { [INFO] [stdout] 60 | | continue; [INFO] [stdout] 61 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] note: same as this [INFO] [stdout] --> src/lexing/mod.rs:63:9 [INFO] [stdout] | [INFO] [stdout] 63 | / { [INFO] [stdout] 64 | | continue; [INFO] [stdout] 65 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#if_same_then_else [INFO] [stdout] = note: `#[warn(clippy::if_same_then_else)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `let...else` may be rewritten with the `?` operator [INFO] [stdout] --> src/lexing/mod.rs:126:5 [INFO] [stdout] | [INFO] [stdout] 126 | let Some(c) = reader.current() else { return None }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `let c = reader.current()?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lexing/mod.rs:289:8 [INFO] [stdout] | [INFO] [stdout] 289 | if text.len() > 0 [INFO] [stdout] | ^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!text.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] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/lexing/mod.rs:314:8 [INFO] [stdout] | [INFO] [stdout] 314 | if !reader.current().is_some_and(|c| c == '\"') { return None }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `reader.current().is_none_or(|c| c != '\"')` [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: use of `char::is_digit` with literal radix of 10 [INFO] [stdout] --> src/lexing/mod.rs:347:42 [INFO] [stdout] | [INFO] [stdout] 347 | if !reader.current().is_some_and(|c| c.is_digit(10)) { return None; } [INFO] [stdout] | ^^^^^^^^^^^^^^ help: try: `c.is_ascii_digit()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#is_digit_ascii_radix [INFO] [stdout] = note: `#[warn(clippy::is_digit_ascii_radix)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: use of `char::is_digit` with literal radix of 10 [INFO] [stdout] --> src/lexing/mod.rs:352:44 [INFO] [stdout] | [INFO] [stdout] 352 | while reader.current().is_some_and(|c| c.is_digit(10)) [INFO] [stdout] | ^^^^^^^^^^^^^^ help: try: `c.is_ascii_digit()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#is_digit_ascii_radix [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: use of `char::is_digit` with literal radix of 10 [INFO] [stdout] --> src/lexing/mod.rs:357:68 [INFO] [stdout] | [INFO] [stdout] 357 | if reader.current_is(&['.']) && reader.peek(1).is_some_and(|c| c.is_digit(10)) [INFO] [stdout] | ^^^^^^^^^^^^^^ help: try: `c.is_ascii_digit()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#is_digit_ascii_radix [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: use of `char::is_digit` with literal radix of 10 [INFO] [stdout] --> src/lexing/mod.rs:360:48 [INFO] [stdout] | [INFO] [stdout] 360 | while reader.current().is_some_and(|c| c.is_digit(10)) [INFO] [stdout] | ^^^^^^^^^^^^^^ help: try: `c.is_ascii_digit()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#is_digit_ascii_radix [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/parsing/token_reader.rs:16:12 [INFO] [stdout] | [INFO] [stdout] 16 | if tokens.len() == 0 || start_index.is_some_and(|s| s >= tokens.len()) { return None }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `tokens.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] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/parsing/token_reader.rs:31:9 [INFO] [stdout] | [INFO] [stdout] 31 | &self.tokens [INFO] [stdout] | ^^^^^^^^^^^^ help: change this to: `self.tokens` [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: usage of `.map(...).all(identity)` [INFO] [stdout] --> src/parsing/token_reader.rs:89:26 [INFO] [stdout] | [INFO] [stdout] 89 | (0..types.len()).map(|i| self.peek_is(count + i, types[i])).all(|b| b) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_all_any_identity [INFO] [stdout] help: use `.all(...)` instead [INFO] [stdout] | [INFO] [stdout] 89 - (0..types.len()).map(|i| self.peek_is(count + i, types[i])).all(|b| b) [INFO] [stdout] 89 + (0..types.len()).all(|i| self.peek_is(count + i, types[i])) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `let...else` may be rewritten with the `?` operator [INFO] [stdout] --> src/parsing/token_reader.rs:123:9 [INFO] [stdout] | [INFO] [stdout] 123 | let Some(t) = self.current() else { return None; }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `let t = self.current()?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `.map(...).all(identity)` [INFO] [stdout] --> src/parsing/token_reader.rs:137:50 [INFO] [stdout] | [INFO] [stdout] 137 | let all_match = types.iter().enumerate().map(|(i, t)| self.peek(i).is_some_and(|c| c.token_type == *t)).all(|b| b); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_all_any_identity [INFO] [stdout] help: use `.all(...)` instead [INFO] [stdout] | [INFO] [stdout] 137 - let all_match = types.iter().enumerate().map(|(i, t)| self.peek(i).is_some_and(|c| c.token_type == *t)).all(|b| b); [INFO] [stdout] 137 + let all_match = types.iter().enumerate().all(|(i, t)| self.peek(i).is_some_and(|c| c.token_type == *t)); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `.map(...).all(identity)` [INFO] [stdout] --> src/parsing/token_reader.rs:150:34 [INFO] [stdout] | [INFO] [stdout] 150 | types.iter().enumerate().map(|(i, t)| self.peek(i).is_some_and(|c| c.token_type == *t)).all(|b| b) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_all_any_identity [INFO] [stdout] help: use `.all(...)` instead [INFO] [stdout] | [INFO] [stdout] 150 - types.iter().enumerate().map(|(i, t)| self.peek(i).is_some_and(|c| c.token_type == *t)).all(|b| b) [INFO] [stdout] 150 + types.iter().enumerate().all(|(i, t)| self.peek(i).is_some_and(|c| c.token_type == *t)) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `let...else` may be rewritten with the `?` operator [INFO] [stdout] --> src/parsing/type_parsing.rs:7:5 [INFO] [stdout] | [INFO] [stdout] 7 | / let Some(mut type_reader) = TokenReader::new(reader.tokens(), Some(reader.index())) else { [INFO] [stdout] 8 | | return None; [INFO] [stdout] 9 | | }; [INFO] [stdout] | |______^ help: replace it with: `let mut type_reader = TokenReader::new(reader.tokens(), Some(reader.index()))?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `let...else` may be rewritten with the `?` operator [INFO] [stdout] --> src/parsing/type_parsing.rs:20:5 [INFO] [stdout] | [INFO] [stdout] 20 | / let Some(mut type_reader) = TokenReader::new(reader.tokens(), Some(reader.index())) else { [INFO] [stdout] 21 | | return None; [INFO] [stdout] 22 | | }; [INFO] [stdout] | |______^ help: replace it with: `let mut type_reader = TokenReader::new(reader.tokens(), Some(reader.index()))?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `let...else` may be rewritten with the `?` operator [INFO] [stdout] --> src/parsing/type_parsing.rs:34:5 [INFO] [stdout] | [INFO] [stdout] 34 | / let Some(mut type_reader) = TokenReader::new(reader.tokens(), Some(reader.index())) else { [INFO] [stdout] 35 | | return None; [INFO] [stdout] 36 | | }; [INFO] [stdout] | |______^ help: replace it with: `let mut type_reader = TokenReader::new(reader.tokens(), Some(reader.index()))?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/parsing/expr_parsing.rs:331:56 [INFO] [stdout] | [INFO] [stdout] 331 | let expression = parse_expression(reader)?.map(|e| Box::new(e)); [INFO] [stdout] | ^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `Box::new` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] = note: `#[warn(clippy::redundant_closure)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/parsing/stmt_parsing.rs:93:29 [INFO] [stdout] | [INFO] [stdout] 93 | expect_ast_item(reader, |r| parse_declaration(r), |t| ParserError::ExpectedDeclaration(t)) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the function itself: `parse_declaration` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/parsing/stmt_parsing.rs:93:55 [INFO] [stdout] | [INFO] [stdout] 93 | expect_ast_item(reader, |r| parse_declaration(r), |t| ParserError::ExpectedDeclaration(t)) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `ParserError::ExpectedDeclaration` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `Option::map` [INFO] [stdout] --> src/parsing/stmt_parsing.rs:265:10 [INFO] [stdout] | [INFO] [stdout] 265 | else if let Some(type_decl) = parse_type_decl(reader)? [INFO] [stdout] | __________^ [INFO] [stdout] 266 | | { [INFO] [stdout] 267 | | Some(Statement::TypeDecl(type_decl)) [INFO] [stdout] ... | [INFO] [stdout] 271 | | None [INFO] [stdout] 272 | | }; [INFO] [stdout] | |_____^ help: try: `{ parse_type_decl(reader)?.map(Statement::TypeDecl) }` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_map [INFO] [stdout] = note: `#[warn(clippy::manual_map)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/parsing/stmt_parsing.rs:672:12 [INFO] [stdout] | [INFO] [stdout] 672 | if ids.len() == 0 [INFO] [stdout] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `ids.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] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/parsing/mod.rs:86:8 [INFO] [stdout] | [INFO] [stdout] 86 | if errors.len() > 0 [INFO] [stdout] | ^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!errors.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] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/parsing/mod.rs:191:12 [INFO] [stdout] | [INFO] [stdout] 191 | if !reader.check(TokenType::Comma).is_some() { break; } [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `reader.check(TokenType::Comma).is_none()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: large size difference between variants [INFO] [stdout] --> src/ast/expr.rs:16:1 [INFO] [stdout] | [INFO] [stdout] 16 | / pub enum LambdaParams [INFO] [stdout] 17 | | { [INFO] [stdout] 18 | | Simple(Token), [INFO] [stdout] | | ------------- the second-largest variant contains at least 48 bytes [INFO] [stdout] 19 | |/ Complex [INFO] [stdout] 20 | || { [INFO] [stdout] 21 | || open_pipe: Token, [INFO] [stdout] 22 | || parameters: Vec, [INFO] [stdout] ... || [INFO] [stdout] 25 | || return_type: Option, [INFO] [stdout] 26 | || } [INFO] [stdout] | ||_____- the largest variant contains at least 400 bytes [INFO] [stdout] 27 | | } [INFO] [stdout] | |__^ the entire enum is at least 400 bytes [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stdout] = note: `#[warn(clippy::large_enum_variant)]` on by default [INFO] [stdout] help: consider boxing the large fields or introducing indirection in some other way to reduce the total size of the enum [INFO] [stdout] | [INFO] [stdout] 25 - return_type: Option, [INFO] [stdout] 25 + return_type: Box>, [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: large size difference between variants [INFO] [stdout] --> src/ast/expr.rs:180:1 [INFO] [stdout] | [INFO] [stdout] 180 | / pub enum Expression [INFO] [stdout] 181 | | { [INFO] [stdout] 182 | | Lambda(LambdaExpr), [INFO] [stdout] | | ------------------ the second-largest variant contains at least 456 bytes [INFO] [stdout] 183 | | Literal(Token), [INFO] [stdout] ... | [INFO] [stdout] 197 | | IfExpr(IfExpr), [INFO] [stdout] | | -------------- the largest variant contains at least 864 bytes [INFO] [stdout] 198 | | MatchExpr(MatchExpr), [INFO] [stdout] 199 | | Cast(CastExpr) [INFO] [stdout] 200 | | } [INFO] [stdout] | |_^ the entire enum is at least 864 bytes [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stdout] help: consider boxing the large fields or introducing indirection in some other way to reduce the total size of the enum [INFO] [stdout] | [INFO] [stdout] 197 - IfExpr(IfExpr), [INFO] [stdout] 197 + IfExpr(Box), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: large size difference between variants [INFO] [stdout] --> src/ast/stmt.rs:24:1 [INFO] [stdout] | [INFO] [stdout] 24 | / pub enum LetBinding [INFO] [stdout] 25 | | { [INFO] [stdout] 26 | |/ Variable [INFO] [stdout] 27 | || { [INFO] [stdout] 28 | || mut_tok: Option, [INFO] [stdout] 29 | || id: Token [INFO] [stdout] 30 | || }, [INFO] [stdout] | ||_____- the second-largest variant contains at least 96 bytes [INFO] [stdout] 31 | | Pattern(Pattern) [INFO] [stdout] | | ---------------- the largest variant contains at least 352 bytes [INFO] [stdout] 32 | | } [INFO] [stdout] | |__^ the entire enum is at least 352 bytes [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stdout] help: consider boxing the large fields or introducing indirection in some other way to reduce the total size of the enum [INFO] [stdout] | [INFO] [stdout] 31 - Pattern(Pattern) [INFO] [stdout] 31 + Pattern(Box) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: large size difference between variants [INFO] [stdout] --> src/ast/stmt.rs:71:1 [INFO] [stdout] | [INFO] [stdout] 71 | / pub enum FnParam [INFO] [stdout] 72 | | { [INFO] [stdout] 73 | | / Normal [INFO] [stdout] 74 | | | { [INFO] [stdout] 75 | | | mut_tok: Option, [INFO] [stdout] 76 | | | id: Token, [INFO] [stdout] ... | | [INFO] [stdout] 79 | | | default_value: Option<(Token, Expression)> [INFO] [stdout] 80 | | | }, [INFO] [stdout] | | |_____- the largest variant contains at least 1288 bytes [INFO] [stdout] 81 | | / SelfParam [INFO] [stdout] 82 | | | { [INFO] [stdout] 83 | | | mut_tok: Option, [INFO] [stdout] 84 | | | self_tok: Token, [INFO] [stdout] 85 | | | } [INFO] [stdout] | | |_____- the second-largest variant contains at least 96 bytes [INFO] [stdout] 86 | | } [INFO] [stdout] | |___^ the entire enum is at least 1288 bytes [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stdout] help: consider boxing the large fields or introducing indirection in some other way to reduce the total size of the enum [INFO] [stdout] | [INFO] [stdout] 78 ~ type_name: Box, [INFO] [stdout] 79 ~ default_value: Box> [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: large size difference between variants [INFO] [stdout] --> src/ast/stmt.rs:149:1 [INFO] [stdout] | [INFO] [stdout] 149 | / pub enum EnumMember [INFO] [stdout] 150 | | { [INFO] [stdout] 151 | | Basic(Token), [INFO] [stdout] 152 | | / Single [INFO] [stdout] 153 | | | { [INFO] [stdout] 154 | | | id: Token, [INFO] [stdout] 155 | | | open_paren: Token, [INFO] [stdout] 156 | | | type_name: TypeName, [INFO] [stdout] 157 | | | close_paren: Token [INFO] [stdout] 158 | | | }, [INFO] [stdout] | | |_____- the largest variant contains at least 376 bytes [INFO] [stdout] 159 | | / Struct [INFO] [stdout] 160 | | | { [INFO] [stdout] 161 | | | id: Token, [INFO] [stdout] 162 | | | open_brace: Token, [INFO] [stdout] 163 | | | members: Vec, [INFO] [stdout] 164 | | | close_brace: Token, [INFO] [stdout] 165 | | | } [INFO] [stdout] | | |_____- the second-largest variant contains at least 168 bytes [INFO] [stdout] 166 | | } [INFO] [stdout] | |___^ the entire enum is at least 376 bytes [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stdout] help: consider boxing the large fields or introducing indirection in some other way to reduce the total size of the enum [INFO] [stdout] | [INFO] [stdout] 156 - type_name: TypeName, [INFO] [stdout] 156 + type_name: Box, [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: large size difference between variants [INFO] [stdout] --> src/ast/stmt.rs:245:1 [INFO] [stdout] | [INFO] [stdout] 245 | / pub enum Declaration [INFO] [stdout] 246 | | { [INFO] [stdout] 247 | | Fn(Option, FnDecl), [INFO] [stdout] 248 | | Struct(Option, StructDecl), [INFO] [stdout] ... | [INFO] [stdout] 252 | | Let(Option, LetStmt), [INFO] [stdout] | | --------------------------- the largest variant contains at least 1864 bytes [INFO] [stdout] 253 | | Use(Option, UseStmt), [INFO] [stdout] 254 | | Impl(ImplStmt), [INFO] [stdout] | | -------------- the second-largest variant contains at least 872 bytes [INFO] [stdout] 255 | | } [INFO] [stdout] | |_^ the entire enum is at least 1864 bytes [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stdout] help: consider boxing the large fields or introducing indirection in some other way to reduce the total size of the enum [INFO] [stdout] | [INFO] [stdout] 252 - Let(Option, LetStmt), [INFO] [stdout] 252 + Let(Option, Box), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/ast/mod.rs:46:9 [INFO] [stdout] | [INFO] [stdout] 46 | / match self [INFO] [stdout] 47 | | { [INFO] [stdout] 48 | | Self::Access { inner: _, dot: _, name: _, args: _ } => true, [INFO] [stdout] 49 | | _ => false, [INFO] [stdout] 50 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] = note: `#[warn(clippy::match_like_matches_macro)]` on by default [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 46 - match self [INFO] [stdout] 47 - { [INFO] [stdout] 48 - Self::Access { inner: _, dot: _, name: _, args: _ } => true, [INFO] [stdout] 49 - _ => false, [INFO] [stdout] 50 - } [INFO] [stdout] 46 + matches!(self, Self::Access { inner: _, dot: _, name: _, args: _ }) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `.map(...).any(identity)` [INFO] [stdout] --> src/ast/mod.rs:57:99 [INFO] [stdout] | [INFO] [stdout] 57 | TypeName::Identifier { name: _, args } => args.as_ref().is_some_and(|a| a.args.iter().map(|a| a.is_definite()).any(|t| t)), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_all_any_identity [INFO] [stdout] help: use `.any(...)` instead [INFO] [stdout] | [INFO] [stdout] 57 - TypeName::Identifier { name: _, args } => args.as_ref().is_some_and(|a| a.args.iter().map(|a| a.is_definite()).any(|t| t)), [INFO] [stdout] 57 + TypeName::Identifier { name: _, args } => args.as_ref().is_some_and(|a| a.args.iter().any(|a| a.is_definite())), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `.map(...).any(identity)` [INFO] [stdout] --> src/ast/mod.rs:60:133 [INFO] [stdout] | [INFO] [stdout] 60 | ...|| args.as_ref().is_some_and(|a| a.args.iter().map(|a| a.is_definite()).any(|t| t)), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_all_any_identity [INFO] [stdout] help: use `.any(...)` instead [INFO] [stdout] | [INFO] [stdout] 60 - TypeName::Access { inner, dot: _, name: _, args } => inner.is_definite() || args.as_ref().is_some_and(|a| a.args.iter().map(|a| a.is_definite()).any(|t| t)), [INFO] [stdout] 60 + TypeName::Access { inner, dot: _, name: _, args } => inner.is_definite() || args.as_ref().is_some_and(|a| a.args.iter().any(|a| a.is_definite())), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: `to_string` applied to a type that implements `Display` in `format!` args [INFO] [stdout] --> src/ast/mod.rs:88:99 [INFO] [stdout] | [INFO] [stdout] 88 | let mut text = format!("{}.{}", inner.pretty_print(), name.value.as_ref().unwrap().to_string()); [INFO] [stdout] | ^^^^^^^^^^^^ help: remove this [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_in_format_args [INFO] [stdout] = note: `#[warn(clippy::to_string_in_format_args)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: large size difference between variants [INFO] [stdout] --> src/ast/mod.rs:182:1 [INFO] [stdout] | [INFO] [stdout] 182 | / pub enum LetCondition [INFO] [stdout] 183 | | { [INFO] [stdout] 184 | | Expression(Box), [INFO] [stdout] | | --------------------------- the second-largest variant contains at least 8 bytes [INFO] [stdout] 185 | |/ Pattern [INFO] [stdout] 186 | || { [INFO] [stdout] 187 | || let_tok: Token, [INFO] [stdout] 188 | || pattern: Pattern, [INFO] [stdout] ... || [INFO] [stdout] 192 | || other_cond: Option>, [INFO] [stdout] 193 | || } [INFO] [stdout] | ||_____- the largest variant contains at least 512 bytes [INFO] [stdout] 194 | | } [INFO] [stdout] | |__^ the entire enum is at least 512 bytes [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stdout] help: consider boxing the large fields or introducing indirection in some other way to reduce the total size of the enum [INFO] [stdout] | [INFO] [stdout] 188 - pattern: Pattern, [INFO] [stdout] 188 + pattern: Box, [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: implementation of inherent method `to_string(&self) -> String` for type `utils::PrettyPrinter` [INFO] [stdout] --> src/utils.rs:48:5 [INFO] [stdout] | [INFO] [stdout] 48 | / pub fn to_string(&self) -> String { [INFO] [stdout] 49 | | self.result.clone() [INFO] [stdout] 50 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: implement trait `Display` for type `utils::PrettyPrinter` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#inherent_to_string [INFO] [stdout] = note: `#[warn(clippy::inherent_to_string)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant pattern matching, consider using `is_err()` [INFO] [stdout] --> src/main.rs:17:12 [INFO] [stdout] | [INFO] [stdout] 17 | if let Err(_) = file.read_to_string(&mut contents) [INFO] [stdout] | -------^^^^^^------------------------------------- help: try: `if file.read_to_string(&mut contents).is_err()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `format!` [INFO] [stdout] --> src/main.rs:19:20 [INFO] [stdout] | [INFO] [stdout] 19 | return Err(format!("Invalid file format")); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"Invalid file format".to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stdout] = note: `#[warn(clippy::useless_format)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/main.rs:57:8 [INFO] [stdout] | [INFO] [stdout] 57 | if tokens.errors.len() > 0 [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!tokens.errors.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] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.96s [INFO] running `Command { std: "docker" "inspect" "9a0323b8ec1d7492a302c6874956882b773369558f7e5dcf1a3cf6fa8bc049ff", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "9a0323b8ec1d7492a302c6874956882b773369558f7e5dcf1a3cf6fa8bc049ff", kill_on_drop: false }` [INFO] [stdout] 9a0323b8ec1d7492a302c6874956882b773369558f7e5dcf1a3cf6fa8bc049ff