[INFO] updating cached repository mzumi/writing-an-interpreter-in-rust [INFO] running `"git" "fetch" "--all"` [INFO] [stdout] Fetching origin [INFO] [stderr] From git://github.com/mzumi/writing-an-interpreter-in-rust [INFO] [stderr] * branch HEAD -> FETCH_HEAD [INFO] running `"git" "clone" "work/cache/sources/gh/mzumi/writing-an-interpreter-in-rust" "work/ex/clippy-test-run/sources/stable/gh/mzumi/writing-an-interpreter-in-rust"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable/gh/mzumi/writing-an-interpreter-in-rust'... [INFO] [stderr] done. [INFO] running `"git" "clone" "work/cache/sources/gh/mzumi/writing-an-interpreter-in-rust" "work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/mzumi/writing-an-interpreter-in-rust"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/mzumi/writing-an-interpreter-in-rust'... [INFO] [stderr] done. [INFO] running `"git" "rev-parse" "HEAD"` [INFO] [stdout] 6b5d30edd90e7dfb45d75ed744c330db355fa562 [INFO] sha for GitHub repo mzumi/writing-an-interpreter-in-rust: 6b5d30edd90e7dfb45d75ed744c330db355fa562 [INFO] validating manifest of mzumi/writing-an-interpreter-in-rust on toolchain stable [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] validating manifest of mzumi/writing-an-interpreter-in-rust on toolchain stable+rustflags=-Dclippy::into_iter_on_array [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] started frobbing mzumi/writing-an-interpreter-in-rust [INFO] finished frobbing mzumi/writing-an-interpreter-in-rust [INFO] frobbed toml for mzumi/writing-an-interpreter-in-rust written to work/ex/clippy-test-run/sources/stable/gh/mzumi/writing-an-interpreter-in-rust/Cargo.toml [INFO] started frobbing mzumi/writing-an-interpreter-in-rust [INFO] finished frobbing mzumi/writing-an-interpreter-in-rust [INFO] frobbed toml for mzumi/writing-an-interpreter-in-rust written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/mzumi/writing-an-interpreter-in-rust/Cargo.toml [INFO] crate mzumi/writing-an-interpreter-in-rust has a lockfile. skipping [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] linting mzumi/writing-an-interpreter-in-rust against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-4/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/gh/mzumi/writing-an-interpreter-in-rust:/opt/crater/workdir:ro,Z" "-v" "/mnt/big/crater/work/local/cargo-home:/opt/crater/cargo-home:ro,Z" "-v" "/mnt/big/crater/work/local/rustup-home:/opt/crater/rustup-home:ro,Z" "-e" "USER_ID=1000" "-e" "SOURCE_DIR=/opt/crater/workdir" "-e" "MAP_USER_ID=1000" "-e" "CARGO_TARGET_DIR=/opt/crater/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/crater/cargo-home" "-e" "RUSTUP_HOME=/opt/crater/rustup-home" "-w" "/opt/crater/workdir" "-m" "1536M" "--network" "none" "rustops/crates-build-env" "/opt/crater/cargo-home/bin/cargo" "+stable" "clippy" "--frozen" "--all" "--all-targets"` [INFO] [stdout] 5329a0ba883bcc2959036fefd9f77a0ba7f2deb81e1557051575a19bfb9ffa82 [INFO] running `"docker" "start" "-a" "5329a0ba883bcc2959036fefd9f77a0ba7f2deb81e1557051575a19bfb9ffa82"` [INFO] [stderr] Checking writing-an-interpreter-in-rust v0.1.0 (/opt/crater/workdir) [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/lexer/lexer.rs:14:13 [INFO] [stderr] | [INFO] [stderr] 14 | input: input, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `input` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_field_names)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/token/token.rs:13:13 [INFO] [stderr] | [INFO] [stderr] 13 | token_type: token_type, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `token_type` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/token/token.rs:14:13 [INFO] [stderr] | [INFO] [stderr] 14 | literal: literal, [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: replace it with: `literal` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/ast/ast.rs:21:19 [INFO] [stderr] | [INFO] [stderr] 21 | Program { statements: statements } [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `statements` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/ast/identifier.rs:13:13 [INFO] [stderr] | [INFO] [stderr] 13 | token: token, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `token` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/ast/identifier.rs:14:13 [INFO] [stderr] | [INFO] [stderr] 14 | value: value, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `value` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/ast/let_statement.rs:13:13 [INFO] [stderr] | [INFO] [stderr] 13 | token: token, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `token` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/ast/let_statement.rs:14:13 [INFO] [stderr] | [INFO] [stderr] 14 | name: name, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/ast/let_statement.rs:15:13 [INFO] [stderr] | [INFO] [stderr] 15 | value: value, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `value` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser/parse_error.rs:17:22 [INFO] [stderr] | [INFO] [stderr] 17 | ParseError { kind: kind } [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `kind` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser/parser.rs:21:13 [INFO] [stderr] | [INFO] [stderr] 21 | current_token: current_token, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `current_token` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser/parser.rs:22:13 [INFO] [stderr] | [INFO] [stderr] 22 | peek_token: peek_token, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `peek_token` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser/parser.rs:79:13 [INFO] [stderr] | [INFO] [stderr] 79 | token: token, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `token` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser/parser.rs:80:13 [INFO] [stderr] | [INFO] [stderr] 80 | name: name, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/lexer/lexer.rs:14:13 [INFO] [stderr] | [INFO] [stderr] 14 | input: input, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `input` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_field_names)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/token/token.rs:13:13 [INFO] [stderr] | [INFO] [stderr] 13 | token_type: token_type, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `token_type` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/token/token.rs:14:13 [INFO] [stderr] | [INFO] [stderr] 14 | literal: literal, [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: replace it with: `literal` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/ast/ast.rs:21:19 [INFO] [stderr] | [INFO] [stderr] 21 | Program { statements: statements } [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `statements` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/ast/identifier.rs:13:13 [INFO] [stderr] | [INFO] [stderr] 13 | token: token, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `token` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/ast/identifier.rs:14:13 [INFO] [stderr] | [INFO] [stderr] 14 | value: value, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `value` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/ast/let_statement.rs:13:13 [INFO] [stderr] | [INFO] [stderr] 13 | token: token, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `token` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/ast/let_statement.rs:14:13 [INFO] [stderr] | [INFO] [stderr] 14 | name: name, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/ast/let_statement.rs:15:13 [INFO] [stderr] | [INFO] [stderr] 15 | value: value, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `value` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser/parse_error.rs:17:22 [INFO] [stderr] | [INFO] [stderr] 17 | ParseError { kind: kind } [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `kind` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser/parser.rs:21:13 [INFO] [stderr] | [INFO] [stderr] 21 | current_token: current_token, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `current_token` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser/parser.rs:22:13 [INFO] [stderr] | [INFO] [stderr] 22 | peek_token: peek_token, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `peek_token` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser/parser.rs:79:13 [INFO] [stderr] | [INFO] [stderr] 79 | token: token, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `token` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser/parser.rs:80:13 [INFO] [stderr] | [INFO] [stderr] 80 | name: name, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: module has the same name as its containing module [INFO] [stderr] --> src/lexer/mod.rs:1:1 [INFO] [stderr] | [INFO] [stderr] 1 | mod lexer; [INFO] [stderr] | ^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::module_inception)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_inception [INFO] [stderr] [INFO] [stderr] warning: module has the same name as its containing module [INFO] [stderr] --> src/token/mod.rs:1:1 [INFO] [stderr] | [INFO] [stderr] 1 | mod token; [INFO] [stderr] | ^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_inception [INFO] [stderr] [INFO] [stderr] warning: module has the same name as its containing module [INFO] [stderr] --> src/repl/mod.rs:1:1 [INFO] [stderr] | [INFO] [stderr] 1 | mod repl; [INFO] [stderr] | ^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_inception [INFO] [stderr] [INFO] [stderr] warning: module has the same name as its containing module [INFO] [stderr] --> src/ast/mod.rs:1:1 [INFO] [stderr] | [INFO] [stderr] 1 | mod ast; [INFO] [stderr] | ^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_inception [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/parser/parse_error.rs:21:9 [INFO] [stderr] | [INFO] [stderr] 21 | / return match self.kind { [INFO] [stderr] 22 | | ParseErrorKind::UnexpectedToken(ref p, ref t) => { [INFO] [stderr] 23 | | format!("expected next token to be {}, got {} instead", [INFO] [stderr] 24 | | t.clone(), [INFO] [stderr] 25 | | p.clone().peek_token.token_type) [INFO] [stderr] 26 | | } [INFO] [stderr] 27 | | }; [INFO] [stderr] | |__________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_return)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] help: remove `return` as shown [INFO] [stderr] | [INFO] [stderr] 21 | match self.kind { [INFO] [stderr] 22 | ParseErrorKind::UnexpectedToken(ref p, ref t) => { [INFO] [stderr] 23 | format!("expected next token to be {}, got {} instead", [INFO] [stderr] 24 | t.clone(), [INFO] [stderr] 25 | p.clone().peek_token.token_type) [INFO] [stderr] 26 | } [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: module has the same name as its containing module [INFO] [stderr] --> src/parser/mod.rs:2:1 [INFO] [stderr] | [INFO] [stderr] 2 | mod parser; [INFO] [stderr] | ^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_inception [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/parser/parser.rs:50:9 [INFO] [stderr] | [INFO] [stderr] 50 | / return match self.current_token.token_type { [INFO] [stderr] 51 | | TokenType::Let => { [INFO] [stderr] 52 | | let let_statement = self.parse_let_statement()?; [INFO] [stderr] 53 | | let s: Result, _> = Ok(Box::new(let_statement)); [INFO] [stderr] ... | [INFO] [stderr] 66 | | } [INFO] [stderr] 67 | | }; [INFO] [stderr] | |__________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] help: remove `return` as shown [INFO] [stderr] | [INFO] [stderr] 50 | match self.current_token.token_type { [INFO] [stderr] 51 | TokenType::Let => { [INFO] [stderr] 52 | let let_statement = self.parse_let_statement()?; [INFO] [stderr] 53 | let s: Result, _> = Ok(Box::new(let_statement)); [INFO] [stderr] 54 | return s; [INFO] [stderr] 55 | } [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: module has the same name as its containing module [INFO] [stderr] --> src/lexer/mod.rs:1:1 [INFO] [stderr] | [INFO] [stderr] 1 | mod lexer; [INFO] [stderr] | ^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::module_inception)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_inception [INFO] [stderr] [INFO] [stderr] warning: module has the same name as its containing module [INFO] [stderr] --> src/token/mod.rs:1:1 [INFO] [stderr] | [INFO] [stderr] 1 | mod token; [INFO] [stderr] | ^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_inception [INFO] [stderr] [INFO] [stderr] warning: module has the same name as its containing module [INFO] [stderr] --> src/repl/mod.rs:1:1 [INFO] [stderr] | [INFO] [stderr] 1 | mod repl; [INFO] [stderr] | ^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_inception [INFO] [stderr] [INFO] [stderr] warning: module has the same name as its containing module [INFO] [stderr] --> src/ast/mod.rs:1:1 [INFO] [stderr] | [INFO] [stderr] 1 | mod ast; [INFO] [stderr] | ^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_inception [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/parser/parse_error.rs:21:9 [INFO] [stderr] | [INFO] [stderr] 21 | / return match self.kind { [INFO] [stderr] 22 | | ParseErrorKind::UnexpectedToken(ref p, ref t) => { [INFO] [stderr] 23 | | format!("expected next token to be {}, got {} instead", [INFO] [stderr] 24 | | t.clone(), [INFO] [stderr] 25 | | p.clone().peek_token.token_type) [INFO] [stderr] 26 | | } [INFO] [stderr] 27 | | }; [INFO] [stderr] | |__________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_return)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] help: remove `return` as shown [INFO] [stderr] | [INFO] [stderr] 21 | match self.kind { [INFO] [stderr] 22 | ParseErrorKind::UnexpectedToken(ref p, ref t) => { [INFO] [stderr] 23 | format!("expected next token to be {}, got {} instead", [INFO] [stderr] 24 | t.clone(), [INFO] [stderr] 25 | p.clone().peek_token.token_type) [INFO] [stderr] 26 | } [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: module has the same name as its containing module [INFO] [stderr] --> src/parser/mod.rs:2:1 [INFO] [stderr] | [INFO] [stderr] 2 | mod parser; [INFO] [stderr] | ^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_inception [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/parser/parser.rs:50:9 [INFO] [stderr] | [INFO] [stderr] 50 | / return match self.current_token.token_type { [INFO] [stderr] 51 | | TokenType::Let => { [INFO] [stderr] 52 | | let let_statement = self.parse_let_statement()?; [INFO] [stderr] 53 | | let s: Result, _> = Ok(Box::new(let_statement)); [INFO] [stderr] ... | [INFO] [stderr] 66 | | } [INFO] [stderr] 67 | | }; [INFO] [stderr] | |__________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] help: remove `return` as shown [INFO] [stderr] | [INFO] [stderr] 50 | match self.current_token.token_type { [INFO] [stderr] 51 | TokenType::Let => { [INFO] [stderr] 52 | let let_statement = self.parse_let_statement()?; [INFO] [stderr] 53 | let s: Result, _> = Ok(Box::new(let_statement)); [INFO] [stderr] 54 | return s; [INFO] [stderr] 55 | } [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/lexer/lexer.rs:44:64 [INFO] [stderr] | [INFO] [stderr] 44 | self.get_equal_or_not_equal_string(&c).unwrap_or(c.to_string()) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| c.to_string())` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::or_fun_call)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/lexer/lexer.rs:125:52 [INFO] [stderr] | [INFO] [stderr] 125 | fn get_equal_or_not_equal_string(&mut self, c: &char) -> Option { [INFO] [stderr] | ^^^^^ help: consider passing by value instead: `char` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::trivially_copy_pass_by_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref [INFO] [stderr] [INFO] [stderr] warning: You are using an explicit closure for cloning elements [INFO] [stderr] --> src/lexer/lexer.rs:136:9 [INFO] [stderr] | [INFO] [stderr] 136 | / self.input [INFO] [stderr] 137 | | .chars() [INFO] [stderr] 138 | | .collect::>() [INFO] [stderr] 139 | | .get(position..self.position) [INFO] [stderr] 140 | | .unwrap() [INFO] [stderr] 141 | | .into_iter() [INFO] [stderr] 142 | | .map(|c| c.clone()) [INFO] [stderr] | |_______________________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::map_clone)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_clone [INFO] [stderr] help: Consider calling the dedicated `cloned` method [INFO] [stderr] | [INFO] [stderr] 136 | self.input [INFO] [stderr] 137 | .chars() [INFO] [stderr] 138 | .collect::>() [INFO] [stderr] 139 | .get(position..self.position) [INFO] [stderr] 140 | .unwrap() [INFO] [stderr] 141 | .into_iter().cloned() [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: this .into_iter() call is equivalent to .iter() and will not move the slice [INFO] [stderr] --> src/lexer/lexer.rs:141:14 [INFO] [stderr] | [INFO] [stderr] 141 | .into_iter() [INFO] [stderr] | ^^^^^^^^^ help: call directly: `iter` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::into_iter_on_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#into_iter_on_ref [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/lexer/lexer.rs:136:9 [INFO] [stderr] | [INFO] [stderr] 136 | / self.input [INFO] [stderr] 137 | | .chars() [INFO] [stderr] 138 | | .collect::>() [INFO] [stderr] 139 | | .get(position..self.position) [INFO] [stderr] 140 | | .unwrap() [INFO] [stderr] | |_____________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::get_unwrap)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 136 | self.input [INFO] [stderr] 137 | .chars() [INFO] [stderr] 138 | .collect::>()[position..self.position] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/lexer/lexer.rs:142:22 [INFO] [stderr] | [INFO] [stderr] 142 | .map(|c| c.clone()) [INFO] [stderr] | ^^^^^^^^^ help: try dereferencing it: `*c` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/token/token_type.rs:47:34 [INFO] [stderr] | [INFO] [stderr] 47 | pub fn lookup_indent(indent: &String) -> Self { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: Matching on `Some` with `ok()` is redundant [INFO] [stderr] --> src/token/token_type.rs:57:9 [INFO] [stderr] | [INFO] [stderr] 57 | / if let Some(t) = token_type.ok() { [INFO] [stderr] 58 | | if keywords.contains(&t) { [INFO] [stderr] 59 | | return t; [INFO] [stderr] 60 | | } [INFO] [stderr] 61 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::if_let_some_result)] on by default [INFO] [stderr] = help: Consider matching on `Ok(t)` and removing the call to `ok` instead [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#if_let_some_result [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/ast/ast.rs:24:12 [INFO] [stderr] | [INFO] [stderr] 24 | if self.statements.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!self.statements.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] error: this loop never actually loops [INFO] [stderr] --> src/ast/ast.rs:25:13 [INFO] [stderr] | [INFO] [stderr] 25 | / for n in self.statements.iter() { [INFO] [stderr] 26 | | return n.token_literal(); [INFO] [stderr] 27 | | } [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::never_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#never_loop [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/ast/return_statement.rs:22:9 [INFO] [stderr] | [INFO] [stderr] 22 | s = s + self.token_literal().as_str(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `s += self.token_literal().as_str()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::assign_op_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assign_op_pattern [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/ast/return_statement.rs:24:13 [INFO] [stderr] | [INFO] [stderr] 24 | s = s + expression.to_string().as_ref(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `s += expression.to_string().as_ref()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assign_op_pattern [INFO] [stderr] [INFO] [stderr] error: aborting due to previous error [INFO] [stderr] [INFO] [stderr] error: Could not compile `writing-an-interpreter-in-rust`. [INFO] [stderr] warning: build failed, waiting for other jobs to finish... [INFO] [stderr] warning: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/lexer/lexer.rs:44:64 [INFO] [stderr] | [INFO] [stderr] 44 | self.get_equal_or_not_equal_string(&c).unwrap_or(c.to_string()) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| c.to_string())` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::or_fun_call)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/lexer/lexer.rs:125:52 [INFO] [stderr] | [INFO] [stderr] 125 | fn get_equal_or_not_equal_string(&mut self, c: &char) -> Option { [INFO] [stderr] | ^^^^^ help: consider passing by value instead: `char` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::trivially_copy_pass_by_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref [INFO] [stderr] [INFO] [stderr] warning: You are using an explicit closure for cloning elements [INFO] [stderr] --> src/lexer/lexer.rs:136:9 [INFO] [stderr] | [INFO] [stderr] 136 | / self.input [INFO] [stderr] 137 | | .chars() [INFO] [stderr] 138 | | .collect::>() [INFO] [stderr] 139 | | .get(position..self.position) [INFO] [stderr] 140 | | .unwrap() [INFO] [stderr] 141 | | .into_iter() [INFO] [stderr] 142 | | .map(|c| c.clone()) [INFO] [stderr] | |_______________________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::map_clone)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_clone [INFO] [stderr] help: Consider calling the dedicated `cloned` method [INFO] [stderr] | [INFO] [stderr] 136 | self.input [INFO] [stderr] 137 | .chars() [INFO] [stderr] 138 | .collect::>() [INFO] [stderr] 139 | .get(position..self.position) [INFO] [stderr] 140 | .unwrap() [INFO] [stderr] 141 | .into_iter().cloned() [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: this .into_iter() call is equivalent to .iter() and will not move the slice [INFO] [stderr] --> src/lexer/lexer.rs:141:14 [INFO] [stderr] | [INFO] [stderr] 141 | .into_iter() [INFO] [stderr] | ^^^^^^^^^ help: call directly: `iter` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::into_iter_on_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#into_iter_on_ref [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/lexer/lexer.rs:136:9 [INFO] [stderr] | [INFO] [stderr] 136 | / self.input [INFO] [stderr] 137 | | .chars() [INFO] [stderr] 138 | | .collect::>() [INFO] [stderr] 139 | | .get(position..self.position) [INFO] [stderr] 140 | | .unwrap() [INFO] [stderr] | |_____________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::get_unwrap)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 136 | self.input [INFO] [stderr] 137 | .chars() [INFO] [stderr] 138 | .collect::>()[position..self.position] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/lexer/lexer.rs:142:22 [INFO] [stderr] | [INFO] [stderr] 142 | .map(|c| c.clone()) [INFO] [stderr] | ^^^^^^^^^ help: try dereferencing it: `*c` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/token/token_type.rs:47:34 [INFO] [stderr] | [INFO] [stderr] 47 | pub fn lookup_indent(indent: &String) -> Self { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: Matching on `Some` with `ok()` is redundant [INFO] [stderr] --> src/token/token_type.rs:57:9 [INFO] [stderr] | [INFO] [stderr] 57 | / if let Some(t) = token_type.ok() { [INFO] [stderr] 58 | | if keywords.contains(&t) { [INFO] [stderr] 59 | | return t; [INFO] [stderr] 60 | | } [INFO] [stderr] 61 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::if_let_some_result)] on by default [INFO] [stderr] = help: Consider matching on `Ok(t)` and removing the call to `ok` instead [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#if_let_some_result [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/ast/ast.rs:24:12 [INFO] [stderr] | [INFO] [stderr] 24 | if self.statements.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!self.statements.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] error: this loop never actually loops [INFO] [stderr] --> src/ast/ast.rs:25:13 [INFO] [stderr] | [INFO] [stderr] 25 | / for n in self.statements.iter() { [INFO] [stderr] 26 | | return n.token_literal(); [INFO] [stderr] 27 | | } [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::never_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#never_loop [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/ast/return_statement.rs:22:9 [INFO] [stderr] | [INFO] [stderr] 22 | s = s + self.token_literal().as_str(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `s += self.token_literal().as_str()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::assign_op_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assign_op_pattern [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/ast/return_statement.rs:24:13 [INFO] [stderr] | [INFO] [stderr] 24 | s = s + expression.to_string().as_ref(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `s += expression.to_string().as_ref()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assign_op_pattern [INFO] [stderr] [INFO] [stderr] error: aborting due to previous error [INFO] [stderr] [INFO] [stderr] error: Could not compile `writing-an-interpreter-in-rust`. [INFO] [stderr] [INFO] [stderr] To learn more, run the command again with --verbose. [INFO] running `"docker" "inspect" "5329a0ba883bcc2959036fefd9f77a0ba7f2deb81e1557051575a19bfb9ffa82"` [INFO] running `"docker" "rm" "-f" "5329a0ba883bcc2959036fefd9f77a0ba7f2deb81e1557051575a19bfb9ffa82"` [INFO] [stdout] 5329a0ba883bcc2959036fefd9f77a0ba7f2deb81e1557051575a19bfb9ffa82