[INFO] cloning repository https://github.com/jazzycamel/rustymonkey [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/jazzycamel/rustymonkey" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fjazzycamel%2Frustymonkey", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fjazzycamel%2Frustymonkey'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] 5e3473e99a8a21554b7ae4756a37dfcdee08c773 [INFO] linting jazzycamel/rustymonkey against nightly for clippy-nonminimal_bool-denied [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fjazzycamel%2Frustymonkey" "/workspace/builds/worker-3-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-3-tc1/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/jazzycamel/rustymonkey [INFO] finished tweaking git repo https://github.com/jazzycamel/rustymonkey [INFO] tweaked toml for git repo https://github.com/jazzycamel/rustymonkey written to /workspace/builds/worker-3-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/jazzycamel/rustymonkey 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/jazzycamel/rustymonkey 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] [stderr] Blocking waiting for file lock on package cache [INFO] [stderr] Updating crates.io index [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded as-any v0.3.1 [INFO] [stderr] Downloaded bumpalo v3.15.4 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-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] 454c3dedd20d2b7b7213acbb1717372b2d0b4ea9f8a72a4e989d4c547364fec8 [INFO] running `Command { std: "docker" "start" "-a" "454c3dedd20d2b7b7213acbb1717372b2d0b4ea9f8a72a4e989d4c547364fec8", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "454c3dedd20d2b7b7213acbb1717372b2d0b4ea9f8a72a4e989d4c547364fec8", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "454c3dedd20d2b7b7213acbb1717372b2d0b4ea9f8a72a4e989d4c547364fec8", kill_on_drop: false }` [INFO] [stdout] 454c3dedd20d2b7b7213acbb1717372b2d0b4ea9f8a72a4e989d4c547364fec8 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-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] 01f2de0410a3fc86f43957b3b7ed3e370674335e0ab168c1edef6dfe763e2ac5 [INFO] running `Command { std: "docker" "start" "-a" "01f2de0410a3fc86f43957b3b7ed3e370674335e0ab168c1edef6dfe763e2ac5", kill_on_drop: false }` [INFO] [stderr] Checking as-any v0.3.1 [INFO] [stderr] Checking whoami v1.5.1 [INFO] [stderr] Checking dyn-clone v1.0.17 [INFO] [stderr] Checking rustymonkey v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: method `as_str` is never used [INFO] [stdout] --> src/token.rs:44:12 [INFO] [stdout] | [INFO] [stdout] 43 | impl TokenType { [INFO] [stdout] | -------------- method in this implementation [INFO] [stdout] 44 | pub fn as_str(&self) -> &'static str { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `new` is never used [INFO] [stdout] --> src/token.rs:104:12 [INFO] [stdout] | [INFO] [stdout] 103 | impl Token { [INFO] [stdout] | ---------- associated function in this implementation [INFO] [stdout] 104 | pub fn new(token_type: TokenType, literal: String) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `to_concrete_statement` is never used [INFO] [stdout] --> src/ast.rs:59:8 [INFO] [stdout] | [INFO] [stdout] 59 | pub fn to_concrete_statement(statement: &Box) -> Box { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `to_concrete_expression` is never used [INFO] [stdout] --> src/ast.rs:69:8 [INFO] [stdout] | [INFO] [stdout] 69 | pub fn to_concrete_expression(expression: &Box) -> Box { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `Program` is never constructed [INFO] [stdout] --> src/ast.rs:74:12 [INFO] [stdout] | [INFO] [stdout] 74 | pub struct Program { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `new` is never used [INFO] [stdout] --> src/ast.rs:101:12 [INFO] [stdout] | [INFO] [stdout] 100 | impl Program { [INFO] [stdout] | ------------ associated function in this implementation [INFO] [stdout] 101 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `Identifier` is never constructed [INFO] [stdout] --> src/ast.rs:109:12 [INFO] [stdout] | [INFO] [stdout] 109 | pub struct Identifier { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `LetStatement` is never constructed [INFO] [stdout] --> src/ast.rs:125:12 [INFO] [stdout] | [INFO] [stdout] 125 | pub struct LetStatement { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ReturnStatement` is never constructed [INFO] [stdout] --> src/ast.rs:142:12 [INFO] [stdout] | [INFO] [stdout] 142 | pub struct ReturnStatement { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `IntegerLiteral` is never constructed [INFO] [stdout] --> src/ast.rs:168:12 [INFO] [stdout] | [INFO] [stdout] 168 | pub struct IntegerLiteral { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ExpressionStatement` is never constructed [INFO] [stdout] --> src/ast.rs:184:12 [INFO] [stdout] | [INFO] [stdout] 184 | pub struct ExpressionStatement { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `PrefixExpression` is never constructed [INFO] [stdout] --> src/ast.rs:204:12 [INFO] [stdout] | [INFO] [stdout] 204 | pub struct PrefixExpression { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `InfixExpression` is never constructed [INFO] [stdout] --> src/ast.rs:221:12 [INFO] [stdout] | [INFO] [stdout] 221 | pub struct InfixExpression { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `Precedence` is never used [INFO] [stdout] --> src/parser.rs:7:6 [INFO] [stdout] | [INFO] [stdout] 7 | enum Precedence { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `precedence_for_token_type` is never used [INFO] [stdout] --> src/parser.rs:17:4 [INFO] [stdout] | [INFO] [stdout] 17 | fn precedence_for_token_type(token_type: &TokenType) -> Precedence { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `Parser` is never constructed [INFO] [stdout] --> src/parser.rs:32:8 [INFO] [stdout] | [INFO] [stdout] 32 | struct Parser { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/parser.rs:40:12 [INFO] [stdout] | [INFO] [stdout] 39 | impl Parser { [INFO] [stdout] | ----------- associated items in this implementation [INFO] [stdout] 40 | pub fn new(lexer: Lexer) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 52 | fn next_token(&mut self) { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 57 | fn current_token_is(&self, token_type: TokenType) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 61 | fn peek_token_is(&self, token_type: TokenType) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 65 | fn expect_peek(&mut self, token_type: TokenType) -> bool { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 75 | fn peek_error(&mut self, token_type: TokenType) { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 82 | fn peek_precedence(&self) -> Precedence { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 86 | fn current_precedence(&self) -> Precedence { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 90 | pub fn parse_program(&mut self) -> Program { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 103 | pub fn errors(&self) -> Vec { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 107 | fn parse_statement(&mut self) -> Option> { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 115 | fn parse_let_statement(&mut self) -> Option> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 144 | fn parse_return_statement(&mut self) -> Option> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 162 | fn parse_expression_statement(&mut self) -> Option> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 176 | fn parse_expression(&mut self, precedence: Precedence) -> Option> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 202 | fn parse_identifier(&mut self) -> Option> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 209 | fn parser_integer_literal(&mut self) -> Option> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 225 | fn parse_prefix_expression(&mut self) -> Option> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 237 | fn parse_infix_expression(&mut self, left: Box) -> Option> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `EOF` contains a capitalized acronym [INFO] [stdout] --> src/token.rs:4:5 [INFO] [stdout] | [INFO] [stdout] 4 | EOF, [INFO] [stdout] | ^^^ help: consider making the acronym lowercase, except the initial letter (notice the capitalization): `Eof` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] = note: `#[warn(clippy::upper_case_acronyms)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/token.rs:83:42 [INFO] [stdout] | [INFO] [stdout] 83 | pub fn lookup_identifier(identifier: &String) -> TokenType { [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] 83 ~ pub fn lookup_identifier(identifier: &str) -> TokenType { [INFO] [stdout] 84 ~ match identifier { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/lexer.rs:23:9 [INFO] [stdout] | [INFO] [stdout] 23 | 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: use: `('a'..='z').contains(&ch)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] = note: `#[warn(clippy::manual_range_contains)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/lexer.rs:23:35 [INFO] [stdout] | [INFO] [stdout] 23 | 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: use: `('A'..='Z').contains(&ch)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/lexer.rs:27:9 [INFO] [stdout] | [INFO] [stdout] 27 | '0' <= ch && ch <= '9' [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: use: `('0'..='9').contains(&ch)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/lexer.rs:121:9 [INFO] [stdout] | [INFO] [stdout] 121 | return token; [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] 121 - return token; [INFO] [stdout] 121 + token [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `&Box`. Consider using just `&T` [INFO] [stdout] --> src/ast.rs:59:61 [INFO] [stdout] | [INFO] [stdout] 59 | pub fn to_concrete_statement(statement: &Box) -> Box { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ help: try: `&dyn Statement` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrowed_box [INFO] [stdout] = note: `#[warn(clippy::borrowed_box)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `&Box`. Consider using just `&T` [INFO] [stdout] --> src/ast.rs:69:63 [INFO] [stdout] | [INFO] [stdout] 69 | pub fn to_concrete_expression(expression: &Box) -> Box { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ help: try: `&dyn Expression` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrowed_box [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/ast.rs:82:12 [INFO] [stdout] | [INFO] [stdout] 82 | if self.statements.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!self.statements.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: calling `push_str()` using a single-character string literal [INFO] [stdout] --> src/ast.rs:162:9 [INFO] [stdout] | [INFO] [stdout] 162 | out.push_str(";"); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: consider using `push` with a character literal: `out.push(';')` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_add_str [INFO] [stdout] = note: `#[warn(clippy::single_char_add_str)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `self.expression` after checking its variant with `is_none` [INFO] [stdout] --> src/ast.rs:198:29 [INFO] [stdout] | [INFO] [stdout] 195 | if self.expression.is_none() { [INFO] [stdout] | ---------------------------- help: try: `if let Some() = &self.expression` [INFO] [stdout] ... [INFO] [stdout] 198 | write!(f, "{}", self.expression.as_ref().unwrap()) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] = note: `#[warn(clippy::unnecessary_unwrap)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/parser.rs:68:13 [INFO] [stdout] | [INFO] [stdout] 68 | return true; [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 68 - return true; [INFO] [stdout] 68 + true [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/parser.rs:71:13 [INFO] [stdout] | [INFO] [stdout] 71 | return false; [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 71 - return false; [INFO] [stdout] 71 + false [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/parser.rs:100:9 [INFO] [stdout] | [INFO] [stdout] 100 | return program; [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 100 - return program; [INFO] [stdout] 100 + program [INFO] [stdout] | [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/parser.rs:94:13 [INFO] [stdout] | [INFO] [stdout] 94 | / match self.parse_statement() { [INFO] [stdout] 95 | | Some(statement) => program.statements.push(statement), [INFO] [stdout] 96 | | None => {} [INFO] [stdout] 97 | | } [INFO] [stdout] | |_____________^ help: try: `if let Some(statement) = self.parse_statement() { program.statements.push(statement) }` [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] [INFO] [stdout] [INFO] [stdout] warning: name `EOF` contains a capitalized acronym [INFO] [stdout] --> src/token.rs:4:5 [INFO] [stdout] | [INFO] [stdout] 4 | EOF, [INFO] [stdout] | ^^^ help: consider making the acronym lowercase, except the initial letter (notice the capitalization): `Eof` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] = note: `#[warn(clippy::upper_case_acronyms)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/token.rs:83:42 [INFO] [stdout] | [INFO] [stdout] 83 | pub fn lookup_identifier(identifier: &String) -> TokenType { [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] 83 ~ pub fn lookup_identifier(identifier: &str) -> TokenType { [INFO] [stdout] 84 ~ match identifier { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/lexer.rs:23:9 [INFO] [stdout] | [INFO] [stdout] 23 | 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: use: `('a'..='z').contains(&ch)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] = note: `#[warn(clippy::manual_range_contains)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/lexer.rs:23:35 [INFO] [stdout] | [INFO] [stdout] 23 | 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: use: `('A'..='Z').contains(&ch)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/lexer.rs:27:9 [INFO] [stdout] | [INFO] [stdout] 27 | '0' <= ch && ch <= '9' [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: use: `('0'..='9').contains(&ch)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/lexer.rs:121:9 [INFO] [stdout] | [INFO] [stdout] 121 | return token; [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] 121 - return token; [INFO] [stdout] 121 + token [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `&Box`. Consider using just `&T` [INFO] [stdout] --> src/ast.rs:59:61 [INFO] [stdout] | [INFO] [stdout] 59 | pub fn to_concrete_statement(statement: &Box) -> Box { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ help: try: `&dyn Statement` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrowed_box [INFO] [stdout] = note: `#[warn(clippy::borrowed_box)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `&Box`. Consider using just `&T` [INFO] [stdout] --> src/ast.rs:69:63 [INFO] [stdout] | [INFO] [stdout] 69 | pub fn to_concrete_expression(expression: &Box) -> Box { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ help: try: `&dyn Expression` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrowed_box [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/ast.rs:82:12 [INFO] [stdout] | [INFO] [stdout] 82 | if self.statements.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!self.statements.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: calling `push_str()` using a single-character string literal [INFO] [stdout] --> src/ast.rs:162:9 [INFO] [stdout] | [INFO] [stdout] 162 | out.push_str(";"); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: consider using `push` with a character literal: `out.push(';')` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_add_str [INFO] [stdout] = note: `#[warn(clippy::single_char_add_str)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `self.expression` after checking its variant with `is_none` [INFO] [stdout] --> src/ast.rs:198:29 [INFO] [stdout] | [INFO] [stdout] 195 | if self.expression.is_none() { [INFO] [stdout] | ---------------------------- help: try: `if let Some() = &self.expression` [INFO] [stdout] ... [INFO] [stdout] 198 | write!(f, "{}", self.expression.as_ref().unwrap()) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] = note: `#[warn(clippy::unnecessary_unwrap)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/parser.rs:68:13 [INFO] [stdout] | [INFO] [stdout] 68 | return true; [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 68 - return true; [INFO] [stdout] 68 + true [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/parser.rs:71:13 [INFO] [stdout] | [INFO] [stdout] 71 | return false; [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 71 - return false; [INFO] [stdout] 71 + false [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/parser.rs:100:9 [INFO] [stdout] | [INFO] [stdout] 100 | return program; [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 100 - return program; [INFO] [stdout] 100 + program [INFO] [stdout] | [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/parser.rs:94:13 [INFO] [stdout] | [INFO] [stdout] 94 | / match self.parse_statement() { [INFO] [stdout] 95 | | Some(statement) => program.statements.push(statement), [INFO] [stdout] 96 | | None => {} [INFO] [stdout] 97 | | } [INFO] [stdout] | |_____________^ help: try: `if let Some(statement) = self.parse_statement() { program.statements.push(statement) }` [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] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/parser.rs:262:12 [INFO] [stdout] | [INFO] [stdout] 262 | 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: you seem to be trying to use `&Box`. Consider using just `&T` [INFO] [stdout] --> src/parser.rs:273:38 [INFO] [stdout] | [INFO] [stdout] 273 | fn test_let_statement(statement: &Box, name: &str) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ help: try: `&dyn Statement` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrowed_box [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/parser.rs:280:9 [INFO] [stdout] | [INFO] [stdout] 280 | return true; [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 280 - return true; [INFO] [stdout] 280 + true [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `&Box`. Consider using just `&T` [INFO] [stdout] --> src/parser.rs:283:41 [INFO] [stdout] | [INFO] [stdout] 283 | fn test_integer_literal(expression: &Box, value: i64) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ help: try: `&dyn Expression` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrowed_box [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/parser.rs:288:9 [INFO] [stdout] | [INFO] [stdout] 288 | return true; [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 288 - return true; [INFO] [stdout] 288 + true [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/parser.rs:359:17 [INFO] [stdout] | [INFO] [stdout] 359 | assert!(!expression_statement.expression.is_none()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `expression_statement.expression.is_some()` [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] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.76s [INFO] running `Command { std: "docker" "inspect" "01f2de0410a3fc86f43957b3b7ed3e370674335e0ab168c1edef6dfe763e2ac5", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "01f2de0410a3fc86f43957b3b7ed3e370674335e0ab168c1edef6dfe763e2ac5", kill_on_drop: false }` [INFO] [stdout] 01f2de0410a3fc86f43957b3b7ed3e370674335e0ab168c1edef6dfe763e2ac5