[INFO] updating cached repository jffjs/rlox [INFO] running `"git" "fetch" "--all"` [INFO] [stdout] Fetching origin [INFO] [stderr] From git://github.com/jffjs/rlox [INFO] [stderr] * branch HEAD -> FETCH_HEAD [INFO] running `"git" "clone" "work/cache/sources/gh/jffjs/rlox" "work/ex/clippy-test-run/sources/stable/gh/jffjs/rlox"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable/gh/jffjs/rlox'... [INFO] [stderr] done. [INFO] running `"git" "clone" "work/cache/sources/gh/jffjs/rlox" "work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/jffjs/rlox"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/jffjs/rlox'... [INFO] [stderr] done. [INFO] running `"git" "rev-parse" "HEAD"` [INFO] [stdout] ecd5a906d7c5ae499ce8114e963d2fd5a80e89f9 [INFO] sha for GitHub repo jffjs/rlox: ecd5a906d7c5ae499ce8114e963d2fd5a80e89f9 [INFO] validating manifest of jffjs/rlox 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 jffjs/rlox 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 jffjs/rlox [INFO] finished frobbing jffjs/rlox [INFO] frobbed toml for jffjs/rlox written to work/ex/clippy-test-run/sources/stable/gh/jffjs/rlox/Cargo.toml [INFO] started frobbing jffjs/rlox [INFO] finished frobbing jffjs/rlox [INFO] frobbed toml for jffjs/rlox written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/jffjs/rlox/Cargo.toml [INFO] crate jffjs/rlox 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 jffjs/rlox against stable+rustflags=-Dclippy::into_iter_on_array for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-3/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/jffjs/rlox:/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 -Dclippy::into_iter_on_array" "-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] 2498ce2501da4f14d650112393d7a7cad4bc3f9d02b5a45b71868b811d948fac [INFO] running `"docker" "start" "-a" "2498ce2501da4f14d650112393d7a7cad4bc3f9d02b5a45b71868b811d948fac"` [INFO] [stderr] Checking rlox v0.1.0 (/opt/crater/workdir) [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/parser.rs:136:16 [INFO] [stderr] | [INFO] [stderr] 136 | } else { [INFO] [stderr] | ________________^ [INFO] [stderr] 137 | | if match_type(&tokens[pos], vec![TokenType::Semicolon]) { [INFO] [stderr] 138 | | let stmt = ast::Stmt::var(name); [INFO] [stderr] 139 | | StmtResult::Ok(stmt, pos + 1) [INFO] [stderr] ... | [INFO] [stderr] 142 | | } [INFO] [stderr] 143 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::collapsible_if)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 136 | } else if match_type(&tokens[pos], vec![TokenType::Semicolon]) { [INFO] [stderr] 137 | let stmt = ast::Stmt::var(name); [INFO] [stderr] 138 | StmtResult::Ok(stmt, pos + 1) [INFO] [stderr] 139 | } else { [INFO] [stderr] 140 | StmtResult::Err("Expect ';' after variable declaration.", pos) [INFO] [stderr] 141 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: Creating a reference that is immediately dereferenced. [INFO] [stderr] --> src/parser.rs:604:27 [INFO] [stderr] | [INFO] [stderr] 604 | match (&tokens[pos]).token_type { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: try this: `tokens[pos].token_type` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ref_in_deref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ref_in_deref [INFO] [stderr] [INFO] [stderr] warning: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> src/eval.rs:166:9 [INFO] [stderr] | [INFO] [stderr] 166 | result [INFO] [stderr] | ^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::let_and_return)] on by default [INFO] [stderr] note: this expression can be directly returned [INFO] [stderr] --> src/eval.rs:160:22 [INFO] [stderr] | [INFO] [stderr] 160 | let result = match self.declaration.body.execute(env) { [INFO] [stderr] | ______________________^ [INFO] [stderr] 161 | | Ok(Some(v)) => Ok(v), [INFO] [stderr] 162 | | Ok(None) => Ok(Value::Nil), [INFO] [stderr] 163 | | Err(err) => Err(err) [INFO] [stderr] 164 | | }; [INFO] [stderr] | |_________^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stderr] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/parser.rs:136:16 [INFO] [stderr] | [INFO] [stderr] 136 | } else { [INFO] [stderr] | ________________^ [INFO] [stderr] 137 | | if match_type(&tokens[pos], vec![TokenType::Semicolon]) { [INFO] [stderr] 138 | | let stmt = ast::Stmt::var(name); [INFO] [stderr] 139 | | StmtResult::Ok(stmt, pos + 1) [INFO] [stderr] ... | [INFO] [stderr] 142 | | } [INFO] [stderr] 143 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::collapsible_if)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 136 | } else if match_type(&tokens[pos], vec![TokenType::Semicolon]) { [INFO] [stderr] 137 | let stmt = ast::Stmt::var(name); [INFO] [stderr] 138 | StmtResult::Ok(stmt, pos + 1) [INFO] [stderr] 139 | } else { [INFO] [stderr] 140 | StmtResult::Err("Expect ';' after variable declaration.", pos) [INFO] [stderr] 141 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: Creating a reference that is immediately dereferenced. [INFO] [stderr] --> src/parser.rs:604:27 [INFO] [stderr] | [INFO] [stderr] 604 | match (&tokens[pos]).token_type { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: try this: `tokens[pos].token_type` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ref_in_deref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ref_in_deref [INFO] [stderr] [INFO] [stderr] warning: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> src/eval.rs:166:9 [INFO] [stderr] | [INFO] [stderr] 166 | result [INFO] [stderr] | ^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::let_and_return)] on by default [INFO] [stderr] note: this expression can be directly returned [INFO] [stderr] --> src/eval.rs:160:22 [INFO] [stderr] | [INFO] [stderr] 160 | let result = match self.declaration.body.execute(env) { [INFO] [stderr] | ______________________^ [INFO] [stderr] 161 | | Ok(Some(v)) => Ok(v), [INFO] [stderr] 162 | | Ok(None) => Ok(Value::Nil), [INFO] [stderr] 163 | | Err(err) => Err(err) [INFO] [stderr] 164 | | }; [INFO] [stderr] | |_________^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/scanner.rs:72:13 [INFO] [stderr] | [INFO] [stderr] 72 | / match self.scan_token() { [INFO] [stderr] 73 | | Err(e) => errors.push(e), [INFO] [stderr] 74 | | _ => () [INFO] [stderr] 75 | | } [INFO] [stderr] | |_____________^ help: try this: `if let Err(e) = self.scan_token() { errors.push(e) }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/scanner.rs:85:12 [INFO] [stderr] | [INFO] [stderr] 85 | if errors.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!errors.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/scanner.rs:276:9 [INFO] [stderr] | [INFO] [stderr] 276 | self.current = self.current + 1 [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `self.current += 1` [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/scanner.rs:280:9 [INFO] [stderr] | [INFO] [stderr] 280 | self.line = self.line + 1 [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `self.line += 1` [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] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/scanner.rs:284:14 [INFO] [stderr] | [INFO] [stderr] 284 | fn substr(s: &String, start: usize, end: usize) -> String { [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: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:17:22 [INFO] [stderr] | [INFO] [stderr] 17 | pub fn parse(tokens: &Vec) -> Result, Vec>> { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/parser.rs:59:8 [INFO] [stderr] | [INFO] [stderr] 59 | if errors.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!errors.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:66:24 [INFO] [stderr] | [INFO] [stderr] 66 | fn declaration(tokens: &Vec, pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:74:32 [INFO] [stderr] | [INFO] [stderr] 74 | fn fun_declaration<'a>(tokens: &'a Vec, mut pos: usize) -> StmtResult<'a> { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/parser.rs:96:53 [INFO] [stderr] | [INFO] [stderr] 96 | TokenType::Comma => pos = pos + 1, [INFO] [stderr] | ^^^^^^^^^^^^^ help: replace it with: `pos += 1` [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] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:120:28 [INFO] [stderr] | [INFO] [stderr] 120 | fn var_declaration(tokens: &Vec, mut pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:149:22 [INFO] [stderr] | [INFO] [stderr] 149 | fn statement(tokens: &Vec, pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:161:25 [INFO] [stderr] | [INFO] [stderr] 161 | fn if_statement(tokens: &Vec, pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:184:26 [INFO] [stderr] | [INFO] [stderr] 184 | fn for_statement(tokens: &Vec, mut pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/parser.rs:199:17 [INFO] [stderr] | [INFO] [stderr] 199 | pos = pos + 2; [INFO] [stderr] | ^^^^^^^^^^^^^ help: replace it with: `pos += 2` [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] warning: manual implementation of an assign operation [INFO] [stderr] --> src/parser.rs:213:41 [INFO] [stderr] | [INFO] [stderr] 213 | TokenType::Semicolon => pos = pos + 1, [INFO] [stderr] | ^^^^^^^^^^^^^ help: replace it with: `pos += 1` [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] warning: manual implementation of an assign operation [INFO] [stderr] --> src/parser.rs:228:42 [INFO] [stderr] | [INFO] [stderr] 228 | TokenType::RightParen => pos = pos + 1, [INFO] [stderr] | ^^^^^^^^^^^^^ help: replace it with: `pos += 1` [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] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:255:33 [INFO] [stderr] | [INFO] [stderr] 255 | fn for_stmt_initializer(tokens: &Vec, pos: usize) -> Option { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:263:31 [INFO] [stderr] | [INFO] [stderr] 263 | fn for_stmt_condition(tokens: &Vec, pos: usize) -> Option { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:270:31 [INFO] [stderr] | [INFO] [stderr] 270 | fn for_stmt_increment(tokens: &Vec, pos: usize) -> Option { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:277:28 [INFO] [stderr] | [INFO] [stderr] 277 | fn while_statement(tokens: &Vec, pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:293:28 [INFO] [stderr] | [INFO] [stderr] 293 | fn print_statement(tokens: &Vec, pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:308:29 [INFO] [stderr] | [INFO] [stderr] 308 | fn return_statement(tokens: &Vec, mut pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/scanner.rs:72:13 [INFO] [stderr] | [INFO] [stderr] 72 | / match self.scan_token() { [INFO] [stderr] 73 | | Err(e) => errors.push(e), [INFO] [stderr] 74 | | _ => () [INFO] [stderr] 75 | | } [INFO] [stderr] | |_____________^ help: try this: `if let Err(e) = self.scan_token() { errors.push(e) }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/scanner.rs:85:12 [INFO] [stderr] | [INFO] [stderr] 85 | if errors.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!errors.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:328:28 [INFO] [stderr] | [INFO] [stderr] 328 | fn block_statement(tokens: &Vec, mut pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:350:33 [INFO] [stderr] | [INFO] [stderr] 350 | fn expression_statement(tokens: &Vec, pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:365:23 [INFO] [stderr] | [INFO] [stderr] 365 | fn expression(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:369:23 [INFO] [stderr] | [INFO] [stderr] 369 | fn assignment(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:393:15 [INFO] [stderr] | [INFO] [stderr] 393 | fn or(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:414:16 [INFO] [stderr] | [INFO] [stderr] 414 | fn and(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:435:21 [INFO] [stderr] | [INFO] [stderr] 435 | fn equality(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:456:23 [INFO] [stderr] | [INFO] [stderr] 456 | fn comparison(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:478:21 [INFO] [stderr] | [INFO] [stderr] 478 | fn addition(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:499:27 [INFO] [stderr] | [INFO] [stderr] 499 | fn multiplication(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/scanner.rs:276:9 [INFO] [stderr] | [INFO] [stderr] 276 | self.current = self.current + 1 [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `self.current += 1` [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/scanner.rs:280:9 [INFO] [stderr] | [INFO] [stderr] 280 | self.line = self.line + 1 [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `self.line += 1` [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] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/scanner.rs:284:14 [INFO] [stderr] | [INFO] [stderr] 284 | fn substr(s: &String, start: usize, end: usize) -> String { [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: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:520:18 [INFO] [stderr] | [INFO] [stderr] 520 | fn unary(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:535:17 [INFO] [stderr] | [INFO] [stderr] 535 | fn call(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/parser.rs:538:13 [INFO] [stderr] | [INFO] [stderr] 538 | / loop { [INFO] [stderr] 539 | | match tokens[pos].token_type { [INFO] [stderr] 540 | | TokenType::LeftParen => { [INFO] [stderr] 541 | | let mut args: Vec = vec![]; [INFO] [stderr] ... | [INFO] [stderr] 576 | | } [INFO] [stderr] 577 | | } [INFO] [stderr] | |_____________^ help: try: `while let TokenType::LeftParen = tokens[pos].token_type { .. }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::while_let_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:584:20 [INFO] [stderr] | [INFO] [stderr] 584 | fn primary(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:17:22 [INFO] [stderr] | [INFO] [stderr] 17 | pub fn parse(tokens: &Vec) -> Result, Vec>> { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/parser.rs:59:8 [INFO] [stderr] | [INFO] [stderr] 59 | if errors.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!errors.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:66:24 [INFO] [stderr] | [INFO] [stderr] 66 | fn declaration(tokens: &Vec, pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:74:32 [INFO] [stderr] | [INFO] [stderr] 74 | fn fun_declaration<'a>(tokens: &'a Vec, mut pos: usize) -> StmtResult<'a> { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/parser.rs:96:53 [INFO] [stderr] | [INFO] [stderr] 96 | TokenType::Comma => pos = pos + 1, [INFO] [stderr] | ^^^^^^^^^^^^^ help: replace it with: `pos += 1` [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] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/token.rs:42:9 [INFO] [stderr] | [INFO] [stderr] 42 | / match self { [INFO] [stderr] 43 | | &Literal::String(ref val) => write!(f, "{}", val), [INFO] [stderr] 44 | | &Literal::Number(ref val) => write!(f, "{}", val), [INFO] [stderr] 45 | | &Literal::True => write!(f, "true"), [INFO] [stderr] 46 | | &Literal::False => write!(f, "false"), [INFO] [stderr] 47 | | &Literal::Nil => write!(f, "nil") [INFO] [stderr] 48 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_ref_pats)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 42 | match *self { [INFO] [stderr] 43 | Literal::String(ref val) => write!(f, "{}", val), [INFO] [stderr] 44 | Literal::Number(ref val) => write!(f, "{}", val), [INFO] [stderr] 45 | Literal::True => write!(f, "true"), [INFO] [stderr] 46 | Literal::False => write!(f, "false"), [INFO] [stderr] 47 | Literal::Nil => write!(f, "nil") [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:120:28 [INFO] [stderr] | [INFO] [stderr] 120 | fn var_declaration(tokens: &Vec, mut pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:149:22 [INFO] [stderr] | [INFO] [stderr] 149 | fn statement(tokens: &Vec, pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:161:25 [INFO] [stderr] | [INFO] [stderr] 161 | fn if_statement(tokens: &Vec, pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:184:26 [INFO] [stderr] | [INFO] [stderr] 184 | fn for_statement(tokens: &Vec, mut pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/parser.rs:199:17 [INFO] [stderr] | [INFO] [stderr] 199 | pos = pos + 2; [INFO] [stderr] | ^^^^^^^^^^^^^ help: replace it with: `pos += 2` [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] warning: manual implementation of an assign operation [INFO] [stderr] --> src/parser.rs:213:41 [INFO] [stderr] | [INFO] [stderr] 213 | TokenType::Semicolon => pos = pos + 1, [INFO] [stderr] | ^^^^^^^^^^^^^ help: replace it with: `pos += 1` [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] warning: manual implementation of an assign operation [INFO] [stderr] --> src/parser.rs:228:42 [INFO] [stderr] | [INFO] [stderr] 228 | TokenType::RightParen => pos = pos + 1, [INFO] [stderr] | ^^^^^^^^^^^^^ help: replace it with: `pos += 1` [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] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:255:33 [INFO] [stderr] | [INFO] [stderr] 255 | fn for_stmt_initializer(tokens: &Vec, pos: usize) -> Option { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:263:31 [INFO] [stderr] | [INFO] [stderr] 263 | fn for_stmt_condition(tokens: &Vec, pos: usize) -> Option { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:270:31 [INFO] [stderr] | [INFO] [stderr] 270 | fn for_stmt_increment(tokens: &Vec, pos: usize) -> Option { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:277:28 [INFO] [stderr] | [INFO] [stderr] 277 | fn while_statement(tokens: &Vec, pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:293:28 [INFO] [stderr] | [INFO] [stderr] 293 | fn print_statement(tokens: &Vec, pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:308:29 [INFO] [stderr] | [INFO] [stderr] 308 | fn return_statement(tokens: &Vec, mut pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:328:28 [INFO] [stderr] | [INFO] [stderr] 328 | fn block_statement(tokens: &Vec, mut pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:350:33 [INFO] [stderr] | [INFO] [stderr] 350 | fn expression_statement(tokens: &Vec, pos: usize) -> StmtResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:365:23 [INFO] [stderr] | [INFO] [stderr] 365 | fn expression(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:369:23 [INFO] [stderr] | [INFO] [stderr] 369 | fn assignment(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:393:15 [INFO] [stderr] | [INFO] [stderr] 393 | fn or(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/ast.rs:167:9 [INFO] [stderr] | [INFO] [stderr] 167 | / match self { [INFO] [stderr] 168 | | &Expr::Assign(ref assign_expr) => { [INFO] [stderr] 169 | | write!(f, "(= {} {})", assign_expr.name.lexeme, assign_expr.value) [INFO] [stderr] 170 | | }, [INFO] [stderr] ... | [INFO] [stderr] 191 | | } [INFO] [stderr] 192 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 167 | match *self { [INFO] [stderr] 168 | Expr::Assign(ref assign_expr) => { [INFO] [stderr] 169 | write!(f, "(= {} {})", assign_expr.name.lexeme, assign_expr.value) [INFO] [stderr] 170 | }, [INFO] [stderr] 171 | Expr::Binary(ref bin_expr) => { [INFO] [stderr] 172 | write!(f, "{}", parenthesize(&bin_expr.operator.lexeme, vec![&bin_expr.left, &bin_expr.right])) [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:414:16 [INFO] [stderr] | [INFO] [stderr] 414 | fn and(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/ast.rs:207:42 [INFO] [stderr] | [INFO] [stderr] 207 | fn parenthesize_call(callee: &str, args: &Vec) -> String { [INFO] [stderr] | ^^^^^^^^^^ help: change this to: `&[Expr]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:435:21 [INFO] [stderr] | [INFO] [stderr] 435 | fn equality(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:456:23 [INFO] [stderr] | [INFO] [stderr] 456 | fn comparison(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:478:21 [INFO] [stderr] | [INFO] [stderr] 478 | fn addition(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:499:27 [INFO] [stderr] | [INFO] [stderr] 499 | fn multiplication(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:520:18 [INFO] [stderr] | [INFO] [stderr] 520 | fn unary(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:535:17 [INFO] [stderr] | [INFO] [stderr] 535 | fn call(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/parser.rs:538:13 [INFO] [stderr] | [INFO] [stderr] 538 | / loop { [INFO] [stderr] 539 | | match tokens[pos].token_type { [INFO] [stderr] 540 | | TokenType::LeftParen => { [INFO] [stderr] 541 | | let mut args: Vec = vec![]; [INFO] [stderr] ... | [INFO] [stderr] 576 | | } [INFO] [stderr] 577 | | } [INFO] [stderr] | |_____________^ help: try: `while let TokenType::LeftParen = tokens[pos].token_type { .. }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::while_let_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:584:20 [INFO] [stderr] | [INFO] [stderr] 584 | fn primary(tokens: &Vec, pos: usize) -> ExprResult { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/eval.rs:9:9 [INFO] [stderr] | [INFO] [stderr] 9 | / match self { [INFO] [stderr] 10 | | &ast::Stmt::Block(ref block_stmt) => { [INFO] [stderr] 11 | | env.push_scope(); [INFO] [stderr] 12 | | for statement in &block_stmt.statements { [INFO] [stderr] ... | [INFO] [stderr] 82 | | } [INFO] [stderr] 83 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 9 | match *self { [INFO] [stderr] 10 | ast::Stmt::Block(ref block_stmt) => { [INFO] [stderr] 11 | env.push_scope(); [INFO] [stderr] 12 | for statement in &block_stmt.statements { [INFO] [stderr] 13 | match statement.execute(env) { [INFO] [stderr] 14 | Ok(None) => (), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/eval.rs:56:29 [INFO] [stderr] | [INFO] [stderr] 56 | let value = match &ret_stmt.value { [INFO] [stderr] | _____________________________^ [INFO] [stderr] 57 | | &Some(ref expr) => expr.evaluate(env)?, [INFO] [stderr] 58 | | &None => Value::Nil [INFO] [stderr] 59 | | }; [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 56 | let value = match ret_stmt.value { [INFO] [stderr] 57 | Some(ref expr) => expr.evaluate(env)?, [INFO] [stderr] 58 | None => Value::Nil [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/eval.rs:100:9 [INFO] [stderr] | [INFO] [stderr] 100 | / match self { [INFO] [stderr] 101 | | &Value::Nil => write!(f, "nil"), [INFO] [stderr] 102 | | &Value::Boolean(b) => write!(f, "{}", b), [INFO] [stderr] 103 | | &Value::Function(ref fun) => write!(f, "", fun), [INFO] [stderr] 104 | | &Value::Number(n) => write!(f, "{}", n), [INFO] [stderr] 105 | | &Value::String(ref s) => write!(f, "\"{}\"", s) [INFO] [stderr] 106 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 100 | match *self { [INFO] [stderr] 101 | Value::Nil => write!(f, "nil"), [INFO] [stderr] 102 | Value::Boolean(b) => write!(f, "{}", b), [INFO] [stderr] 103 | Value::Function(ref fun) => write!(f, "", fun), [INFO] [stderr] 104 | Value::Number(n) => write!(f, "{}", n), [INFO] [stderr] 105 | Value::String(ref s) => write!(f, "\"{}\"", s) [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/eval.rs:112:9 [INFO] [stderr] | [INFO] [stderr] 112 | / match self { [INFO] [stderr] 113 | | &Value::Nil => format!("nil"), [INFO] [stderr] 114 | | &Value::Boolean(b) => format!("{}", b), [INFO] [stderr] 115 | | &Value::Function(ref fun) => format!("{}", fun), [INFO] [stderr] 116 | | &Value::Number(n) => format!("{}", n), [INFO] [stderr] 117 | | &Value::String(ref s) => format!("{}", s) [INFO] [stderr] 118 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 112 | match *self { [INFO] [stderr] 113 | Value::Nil => format!("nil"), [INFO] [stderr] 114 | Value::Boolean(b) => format!("{}", b), [INFO] [stderr] 115 | Value::Function(ref fun) => format!("{}", fun), [INFO] [stderr] 116 | Value::Number(n) => format!("{}", n), [INFO] [stderr] 117 | Value::String(ref s) => format!("{}", s) [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/eval.rs:113:28 [INFO] [stderr] | [INFO] [stderr] 113 | &Value::Nil => format!("nil"), [INFO] [stderr] | ^^^^^^^^^^^^^^ help: consider using .to_string(): `"nil".to_string()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_format)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/token.rs:42:9 [INFO] [stderr] | [INFO] [stderr] 42 | / match self { [INFO] [stderr] 43 | | &Literal::String(ref val) => write!(f, "{}", val), [INFO] [stderr] 44 | | &Literal::Number(ref val) => write!(f, "{}", val), [INFO] [stderr] 45 | | &Literal::True => write!(f, "true"), [INFO] [stderr] 46 | | &Literal::False => write!(f, "false"), [INFO] [stderr] 47 | | &Literal::Nil => write!(f, "nil") [INFO] [stderr] 48 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/eval.rs:117:38 [INFO] [stderr] | [INFO] [stderr] 117 | &Value::String(ref s) => format!("{}", s) [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: consider using .to_string(): `s.to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) [INFO] [stderr] [INFO] [stderr] = note: #[warn(clippy::match_ref_pats)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 42 | match *self { [INFO] [stderr] 43 | Literal::String(ref val) => write!(f, "{}", val), [INFO] [stderr] 44 | Literal::Number(ref val) => write!(f, "{}", val), [INFO] [stderr] 45 | Literal::True => write!(f, "true"), [INFO] [stderr] 46 | Literal::False => write!(f, "false"), [INFO] [stderr] 47 | Literal::Nil => write!(f, "nil") [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/eval.rs:194:9 [INFO] [stderr] | [INFO] [stderr] 194 | / match self { [INFO] [stderr] 195 | | &ast::Expr::Assign(ref assign_expr) => { [INFO] [stderr] 196 | | let name = &assign_expr.name; [INFO] [stderr] 197 | | let value = assign_expr.value.evaluate(env)?; [INFO] [stderr] ... | [INFO] [stderr] 269 | | // _ => panic!("I don't know how to evaluate this yet.") [INFO] [stderr] 270 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 194 | match *self { [INFO] [stderr] 195 | ast::Expr::Assign(ref assign_expr) => { [INFO] [stderr] 196 | let name = &assign_expr.name; [INFO] [stderr] 197 | let value = assign_expr.value.evaluate(env)?; [INFO] [stderr] 198 | match env.assign(name.lexeme.clone(), value.clone()) { [INFO] [stderr] 199 | Ok(_) => Ok(value), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/eval.rs:223:50 [INFO] [stderr] | [INFO] [stderr] 223 | &ast::Expr::Literal(ref lit_expr) => match &lit_expr.value { [INFO] [stderr] | __________________________________________________^ [INFO] [stderr] 224 | | &token::Literal::Nil => Ok(Value::Nil), [INFO] [stderr] 225 | | &token::Literal::True => Ok(Value::Boolean(true)), [INFO] [stderr] 226 | | &token::Literal::False => Ok(Value::Boolean(false)), [INFO] [stderr] 227 | | &token::Literal::Number(n) => Ok(Value::Number(n)), [INFO] [stderr] 228 | | &token::Literal::String(ref s) => Ok(Value::String(s.clone())) [INFO] [stderr] 229 | | }, [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 223 | &ast::Expr::Literal(ref lit_expr) => match lit_expr.value { [INFO] [stderr] 224 | token::Literal::Nil => Ok(Value::Nil), [INFO] [stderr] 225 | token::Literal::True => Ok(Value::Boolean(true)), [INFO] [stderr] 226 | token::Literal::False => Ok(Value::Boolean(false)), [INFO] [stderr] 227 | token::Literal::Number(n) => Ok(Value::Number(n)), [INFO] [stderr] 228 | token::Literal::String(ref s) => Ok(Value::String(s.clone())) [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/eval.rs:275:5 [INFO] [stderr] | [INFO] [stderr] 275 | / match val { [INFO] [stderr] 276 | | &Value::Nil => false, [INFO] [stderr] 277 | | &Value::Boolean(b) => b, [INFO] [stderr] 278 | | _ => true [INFO] [stderr] 279 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 275 | match *val { [INFO] [stderr] 276 | Value::Nil => false, [INFO] [stderr] 277 | Value::Boolean(b) => b, [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: needlessly taken reference of both operands [INFO] [stderr] --> src/eval.rs:289:39 [INFO] [stderr] | [INFO] [stderr] 289 | Value::Function(b_fun) => &a_fun == &b_fun, [INFO] [stderr] | ^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::op_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#op_ref [INFO] [stderr] help: use the values directly [INFO] [stderr] | [INFO] [stderr] 289 | Value::Function(b_fun) => a_fun == b_fun, [INFO] [stderr] | ^^^^^ ^^^^^ [INFO] [stderr] [INFO] [stderr] error: strict comparison of f32 or f64 [INFO] [stderr] --> src/eval.rs:297:37 [INFO] [stderr] | [INFO] [stderr] 297 | Value::Number(b_num) => a_num == b_num, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: consider comparing them within some error: `(a_num - b_num).abs() < error` [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::float_cmp)] on by default [INFO] [stderr] note: std::f32::EPSILON and std::f64::EPSILON are available. [INFO] [stderr] --> src/eval.rs:297:37 [INFO] [stderr] | [INFO] [stderr] 297 | Value::Number(b_num) => a_num == b_num, [INFO] [stderr] | ^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#float_cmp [INFO] [stderr] [INFO] [stderr] warning: this lifetime isn't used in the function definition [INFO] [stderr] --> src/eval.rs:307:21 [INFO] [stderr] | [INFO] [stderr] 307 | fn eval_binary_expr<'a>(operator: &token::Token, [INFO] [stderr] | ^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::extra_unused_lifetimes)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#extra_unused_lifetimes [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/env.rs:21:9 [INFO] [stderr] | [INFO] [stderr] 21 | / match self.scopes.pop() { [INFO] [stderr] 22 | | Some(_) => self.current_scope -= 1, [INFO] [stderr] 23 | | None => () [INFO] [stderr] 24 | | } [INFO] [stderr] | |_________^ help: try this: `if let Some(_) = self.scopes.pop() { self.current_scope -= 1 }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/env.rs:52:29 [INFO] [stderr] | [INFO] [stderr] 52 | pub fn get(&self, name: &String) -> Option<&Value> { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/env.rs:63:34 [INFO] [stderr] | [INFO] [stderr] 63 | fn get_in_scope(&self, name: &String, scope: usize) -> Option<&Value> { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/ast.rs:167:9 [INFO] [stderr] | [INFO] [stderr] 167 | / match self { [INFO] [stderr] 168 | | &Expr::Assign(ref assign_expr) => { [INFO] [stderr] 169 | | write!(f, "(= {} {})", assign_expr.name.lexeme, assign_expr.value) [INFO] [stderr] 170 | | }, [INFO] [stderr] ... | [INFO] [stderr] 191 | | } [INFO] [stderr] 192 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 167 | match *self { [INFO] [stderr] 168 | Expr::Assign(ref assign_expr) => { [INFO] [stderr] 169 | write!(f, "(= {} {})", assign_expr.name.lexeme, assign_expr.value) [INFO] [stderr] 170 | }, [INFO] [stderr] 171 | Expr::Binary(ref bin_expr) => { [INFO] [stderr] 172 | write!(f, "{}", parenthesize(&bin_expr.operator.lexeme, vec![&bin_expr.left, &bin_expr.right])) [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/ast.rs:207:42 [INFO] [stderr] | [INFO] [stderr] 207 | fn parenthesize_call(callee: &str, args: &Vec) -> String { [INFO] [stderr] | ^^^^^^^^^^ help: change this to: `&[Expr]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: you should consider adding a `Default` implementation for `Interpreter` [INFO] [stderr] --> src/lib.rs:19:5 [INFO] [stderr] | [INFO] [stderr] 19 | / pub fn new() -> Interpreter { [INFO] [stderr] 20 | | Interpreter { env: Environment::new() } [INFO] [stderr] 21 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 18 | impl Default for Interpreter { [INFO] [stderr] 19 | fn default() -> Self { [INFO] [stderr] 20 | Self::new() [INFO] [stderr] 21 | } [INFO] [stderr] 22 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/lib.rs:41:28 [INFO] [stderr] | [INFO] [stderr] 41 | if errors.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!errors.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/eval.rs:9:9 [INFO] [stderr] | [INFO] [stderr] 9 | / match self { [INFO] [stderr] 10 | | &ast::Stmt::Block(ref block_stmt) => { [INFO] [stderr] 11 | | env.push_scope(); [INFO] [stderr] 12 | | for statement in &block_stmt.statements { [INFO] [stderr] ... | [INFO] [stderr] 82 | | } [INFO] [stderr] 83 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 9 | match *self { [INFO] [stderr] 10 | ast::Stmt::Block(ref block_stmt) => { [INFO] [stderr] 11 | env.push_scope(); [INFO] [stderr] 12 | for statement in &block_stmt.statements { [INFO] [stderr] 13 | match statement.execute(env) { [INFO] [stderr] 14 | Ok(None) => (), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] error: aborting due to previous error [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/eval.rs:56:29 [INFO] [stderr] | [INFO] [stderr] 56 | let value = match &ret_stmt.value { [INFO] [stderr] | _____________________________^ [INFO] [stderr] 57 | | &Some(ref expr) => expr.evaluate(env)?, [INFO] [stderr] 58 | | &None => Value::Nil [INFO] [stderr] 59 | | }; [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 56 | let value = match ret_stmt.value { [INFO] [stderr] 57 | Some(ref expr) => expr.evaluate(env)?, [INFO] [stderr] 58 | None => Value::Nil [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: Could not compile `rlox`. [INFO] [stderr] warning: build failed, waiting for other jobs to finish... [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/eval.rs:100:9 [INFO] [stderr] | [INFO] [stderr] 100 | / match self { [INFO] [stderr] 101 | | &Value::Nil => write!(f, "nil"), [INFO] [stderr] 102 | | &Value::Boolean(b) => write!(f, "{}", b), [INFO] [stderr] 103 | | &Value::Function(ref fun) => write!(f, "", fun), [INFO] [stderr] 104 | | &Value::Number(n) => write!(f, "{}", n), [INFO] [stderr] 105 | | &Value::String(ref s) => write!(f, "\"{}\"", s) [INFO] [stderr] 106 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 100 | match *self { [INFO] [stderr] 101 | Value::Nil => write!(f, "nil"), [INFO] [stderr] 102 | Value::Boolean(b) => write!(f, "{}", b), [INFO] [stderr] 103 | Value::Function(ref fun) => write!(f, "", fun), [INFO] [stderr] 104 | Value::Number(n) => write!(f, "{}", n), [INFO] [stderr] 105 | Value::String(ref s) => write!(f, "\"{}\"", s) [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/eval.rs:112:9 [INFO] [stderr] | [INFO] [stderr] 112 | / match self { [INFO] [stderr] 113 | | &Value::Nil => format!("nil"), [INFO] [stderr] 114 | | &Value::Boolean(b) => format!("{}", b), [INFO] [stderr] 115 | | &Value::Function(ref fun) => format!("{}", fun), [INFO] [stderr] 116 | | &Value::Number(n) => format!("{}", n), [INFO] [stderr] 117 | | &Value::String(ref s) => format!("{}", s) [INFO] [stderr] 118 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 112 | match *self { [INFO] [stderr] 113 | Value::Nil => format!("nil"), [INFO] [stderr] 114 | Value::Boolean(b) => format!("{}", b), [INFO] [stderr] 115 | Value::Function(ref fun) => format!("{}", fun), [INFO] [stderr] 116 | Value::Number(n) => format!("{}", n), [INFO] [stderr] 117 | Value::String(ref s) => format!("{}", s) [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/eval.rs:113:28 [INFO] [stderr] | [INFO] [stderr] 113 | &Value::Nil => format!("nil"), [INFO] [stderr] | ^^^^^^^^^^^^^^ help: consider using .to_string(): `"nil".to_string()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_format)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/eval.rs:117:38 [INFO] [stderr] | [INFO] [stderr] 117 | &Value::String(ref s) => format!("{}", s) [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: consider using .to_string(): `s.to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/eval.rs:194:9 [INFO] [stderr] | [INFO] [stderr] 194 | / match self { [INFO] [stderr] 195 | | &ast::Expr::Assign(ref assign_expr) => { [INFO] [stderr] 196 | | let name = &assign_expr.name; [INFO] [stderr] 197 | | let value = assign_expr.value.evaluate(env)?; [INFO] [stderr] ... | [INFO] [stderr] 269 | | // _ => panic!("I don't know how to evaluate this yet.") [INFO] [stderr] 270 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 194 | match *self { [INFO] [stderr] 195 | ast::Expr::Assign(ref assign_expr) => { [INFO] [stderr] 196 | let name = &assign_expr.name; [INFO] [stderr] 197 | let value = assign_expr.value.evaluate(env)?; [INFO] [stderr] 198 | match env.assign(name.lexeme.clone(), value.clone()) { [INFO] [stderr] 199 | Ok(_) => Ok(value), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/eval.rs:223:50 [INFO] [stderr] | [INFO] [stderr] 223 | &ast::Expr::Literal(ref lit_expr) => match &lit_expr.value { [INFO] [stderr] | __________________________________________________^ [INFO] [stderr] 224 | | &token::Literal::Nil => Ok(Value::Nil), [INFO] [stderr] 225 | | &token::Literal::True => Ok(Value::Boolean(true)), [INFO] [stderr] 226 | | &token::Literal::False => Ok(Value::Boolean(false)), [INFO] [stderr] 227 | | &token::Literal::Number(n) => Ok(Value::Number(n)), [INFO] [stderr] 228 | | &token::Literal::String(ref s) => Ok(Value::String(s.clone())) [INFO] [stderr] 229 | | }, [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 223 | &ast::Expr::Literal(ref lit_expr) => match lit_expr.value { [INFO] [stderr] 224 | token::Literal::Nil => Ok(Value::Nil), [INFO] [stderr] 225 | token::Literal::True => Ok(Value::Boolean(true)), [INFO] [stderr] 226 | token::Literal::False => Ok(Value::Boolean(false)), [INFO] [stderr] 227 | token::Literal::Number(n) => Ok(Value::Number(n)), [INFO] [stderr] 228 | token::Literal::String(ref s) => Ok(Value::String(s.clone())) [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/eval.rs:275:5 [INFO] [stderr] | [INFO] [stderr] 275 | / match val { [INFO] [stderr] 276 | | &Value::Nil => false, [INFO] [stderr] 277 | | &Value::Boolean(b) => b, [INFO] [stderr] 278 | | _ => true [INFO] [stderr] 279 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 275 | match *val { [INFO] [stderr] 276 | Value::Nil => false, [INFO] [stderr] 277 | Value::Boolean(b) => b, [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: needlessly taken reference of both operands [INFO] [stderr] --> src/eval.rs:289:39 [INFO] [stderr] | [INFO] [stderr] 289 | Value::Function(b_fun) => &a_fun == &b_fun, [INFO] [stderr] | ^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::op_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#op_ref [INFO] [stderr] help: use the values directly [INFO] [stderr] | [INFO] [stderr] 289 | Value::Function(b_fun) => a_fun == b_fun, [INFO] [stderr] | ^^^^^ ^^^^^ [INFO] [stderr] [INFO] [stderr] error: strict comparison of f32 or f64 [INFO] [stderr] --> src/eval.rs:297:37 [INFO] [stderr] | [INFO] [stderr] 297 | Value::Number(b_num) => a_num == b_num, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: consider comparing them within some error: `(a_num - b_num).abs() < error` [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::float_cmp)] on by default [INFO] [stderr] note: std::f32::EPSILON and std::f64::EPSILON are available. [INFO] [stderr] --> src/eval.rs:297:37 [INFO] [stderr] | [INFO] [stderr] 297 | Value::Number(b_num) => a_num == b_num, [INFO] [stderr] | ^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#float_cmp [INFO] [stderr] [INFO] [stderr] warning: this lifetime isn't used in the function definition [INFO] [stderr] --> src/eval.rs:307:21 [INFO] [stderr] | [INFO] [stderr] 307 | fn eval_binary_expr<'a>(operator: &token::Token, [INFO] [stderr] | ^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::extra_unused_lifetimes)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#extra_unused_lifetimes [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/env.rs:21:9 [INFO] [stderr] | [INFO] [stderr] 21 | / match self.scopes.pop() { [INFO] [stderr] 22 | | Some(_) => self.current_scope -= 1, [INFO] [stderr] 23 | | None => () [INFO] [stderr] 24 | | } [INFO] [stderr] | |_________^ help: try this: `if let Some(_) = self.scopes.pop() { self.current_scope -= 1 }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/env.rs:52:29 [INFO] [stderr] | [INFO] [stderr] 52 | pub fn get(&self, name: &String) -> Option<&Value> { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/env.rs:63:34 [INFO] [stderr] | [INFO] [stderr] 63 | fn get_in_scope(&self, name: &String, scope: usize) -> Option<&Value> { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: you should consider adding a `Default` implementation for `Interpreter` [INFO] [stderr] --> src/lib.rs:19:5 [INFO] [stderr] | [INFO] [stderr] 19 | / pub fn new() -> Interpreter { [INFO] [stderr] 20 | | Interpreter { env: Environment::new() } [INFO] [stderr] 21 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 18 | impl Default for Interpreter { [INFO] [stderr] 19 | fn default() -> Self { [INFO] [stderr] 20 | Self::new() [INFO] [stderr] 21 | } [INFO] [stderr] 22 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/lib.rs:41:28 [INFO] [stderr] | [INFO] [stderr] 41 | if errors.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!errors.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] error: aborting due to previous error [INFO] [stderr] [INFO] [stderr] error: Could not compile `rlox`. [INFO] [stderr] [INFO] [stderr] To learn more, run the command again with --verbose. [INFO] running `"docker" "inspect" "2498ce2501da4f14d650112393d7a7cad4bc3f9d02b5a45b71868b811d948fac"` [INFO] running `"docker" "rm" "-f" "2498ce2501da4f14d650112393d7a7cad4bc3f9d02b5a45b71868b811d948fac"` [INFO] [stdout] 2498ce2501da4f14d650112393d7a7cad4bc3f9d02b5a45b71868b811d948fac