[INFO] updating cached repository julioolvr/rlox [INFO] running `"git" "fetch" "--all"` [INFO] [stdout] Fetching origin [INFO] [stderr] From git://github.com/julioolvr/rlox [INFO] [stderr] * branch HEAD -> FETCH_HEAD [INFO] running `"git" "clone" "work/cache/sources/gh/julioolvr/rlox" "work/ex/clippy-test-run/sources/stable/gh/julioolvr/rlox"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable/gh/julioolvr/rlox'... [INFO] [stderr] done. [INFO] running `"git" "clone" "work/cache/sources/gh/julioolvr/rlox" "work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/julioolvr/rlox"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/julioolvr/rlox'... [INFO] [stderr] done. [INFO] running `"git" "rev-parse" "HEAD"` [INFO] [stdout] b8908c5eca599cb2ab16dde00d47507c5b004de0 [INFO] sha for GitHub repo julioolvr/rlox: b8908c5eca599cb2ab16dde00d47507c5b004de0 [INFO] validating manifest of julioolvr/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 julioolvr/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 julioolvr/rlox [INFO] finished frobbing julioolvr/rlox [INFO] frobbed toml for julioolvr/rlox written to work/ex/clippy-test-run/sources/stable/gh/julioolvr/rlox/Cargo.toml [INFO] started frobbing julioolvr/rlox [INFO] finished frobbing julioolvr/rlox [INFO] frobbed toml for julioolvr/rlox written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/julioolvr/rlox/Cargo.toml [INFO] crate julioolvr/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 julioolvr/rlox against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-7/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/gh/julioolvr/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" "-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] 8565230bd026eb866c3d6ba7bbace5ac30633a2b2b0cdef88391c676cc25d111 [INFO] running `"docker" "start" "-a" "8565230bd026eb866c3d6ba7bbace5ac30633a2b2b0cdef88391c676cc25d111"` [INFO] [stderr] Checking rlox v0.1.0 (/opt/crater/workdir) [INFO] [stderr] warning: Unnecessary `>= y + 1` or `x - 1 >=` [INFO] [stderr] --> src/rlox/scanner/char_scanner.rs:139:12 [INFO] [stderr] | [INFO] [stderr] 139 | if self.current >= self.source.len() + 1 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::int_plus_one)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#int_plus_one [INFO] [stderr] help: change `>= y + 1` to `> y` as shown [INFO] [stderr] | [INFO] [stderr] 139 | if self.current > self.source.len() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/rlox/lox_value/lox_func.rs:94:9 [INFO] [stderr] | [INFO] [stderr] 94 | return result; [INFO] [stderr] | ^^^^^^^^^^^^^^ help: remove `return` as shown: `result` [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] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/rlox/interpreter/mod.rs:271:24 [INFO] [stderr] | [INFO] [stderr] 271 | } else { [INFO] [stderr] | ________________________^ [INFO] [stderr] 272 | | if !left_value.is_truthy() { [INFO] [stderr] 273 | | return Ok(left_value); [INFO] [stderr] 274 | | } [INFO] [stderr] 275 | | } [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] 271 | } else if !left_value.is_truthy() { [INFO] [stderr] 272 | return Ok(left_value); [INFO] [stderr] 273 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: Unnecessary `>= y + 1` or `x - 1 >=` [INFO] [stderr] --> src/rlox/scanner/char_scanner.rs:139:12 [INFO] [stderr] | [INFO] [stderr] 139 | if self.current >= self.source.len() + 1 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::int_plus_one)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#int_plus_one [INFO] [stderr] help: change `>= y + 1` to `> y` as shown [INFO] [stderr] | [INFO] [stderr] 139 | if self.current > self.source.len() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/rlox/lox_value/lox_func.rs:94:9 [INFO] [stderr] | [INFO] [stderr] 94 | return result; [INFO] [stderr] | ^^^^^^^^^^^^^^ help: remove `return` as shown: `result` [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] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/rlox/interpreter/mod.rs:271:24 [INFO] [stderr] | [INFO] [stderr] 271 | } else { [INFO] [stderr] | ________________________^ [INFO] [stderr] 272 | | if !left_value.is_truthy() { [INFO] [stderr] 273 | | return Ok(left_value); [INFO] [stderr] 274 | | } [INFO] [stderr] 275 | | } [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] 271 | } else if !left_value.is_truthy() { [INFO] [stderr] 272 | return Ok(left_value); [INFO] [stderr] 273 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: methods called `is_*` usually take self by reference or no self; consider choosing a less ambiguous name [INFO] [stderr] --> src/rlox/scanner/char_scanner.rs:117:17 [INFO] [stderr] | [INFO] [stderr] 117 | fn is_match(&mut self, c: char) -> bool { [INFO] [stderr] | ^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::wrong_self_convention)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wrong_self_convention [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/rlox/parser/token_parser.rs:26:12 [INFO] [stderr] | [INFO] [stderr] 26 | 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: useless use of `format!` [INFO] [stderr] --> src/rlox/parser/token_parser.rs:68:13 [INFO] [stderr] | [INFO] [stderr] 68 | format!("Expected `{{` before class body."), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"Expected `{{` before class body.".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/rlox/parser/token_parser.rs:78:13 [INFO] [stderr] | [INFO] [stderr] 78 | format!("Expected `}}` after class body."), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"Expected `}}` after class body.".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] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/rlox/parser/token_parser.rs:546:9 [INFO] [stderr] | [INFO] [stderr] 546 | self.tokens.get(self.current).unwrap() [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `self.tokens[self.current]` [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] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/rlox/parser/token_parser.rs:550:9 [INFO] [stderr] | [INFO] [stderr] 550 | self.tokens.get(self.current - 1).unwrap() [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `self.tokens[self.current - 1]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: large size difference between variants [INFO] [stderr] --> src/rlox/parser/stmt.rs:14:5 [INFO] [stderr] | [INFO] [stderr] 14 | Class(Token, Option, Vec), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::large_enum_variant)] on by default [INFO] [stderr] help: consider boxing the large fields to reduce the total size of the enum [INFO] [stderr] --> src/rlox/parser/stmt.rs:14:5 [INFO] [stderr] | [INFO] [stderr] 14 | Class(Token, Option, Vec), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stderr] [INFO] [stderr] warning: You are using an explicit closure for cloning elements [INFO] [stderr] --> src/rlox/lox_value/lox_class.rs:25:9 [INFO] [stderr] | [INFO] [stderr] 25 | / self.methods [INFO] [stderr] 26 | | .get(name) [INFO] [stderr] 27 | | .map(|method| method.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] 25 | self.methods [INFO] [stderr] 26 | .get(name).cloned() [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/lox_value/lox_class.rs:82:13 [INFO] [stderr] | [INFO] [stderr] 82 | / match init { [INFO] [stderr] 83 | | &LoxValue::Func(ref callable) => callable.arity(), [INFO] [stderr] 84 | | _ => panic!("Can't get non-func as method from an instance"), [INFO] [stderr] 85 | | } [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] 82 | match *init { [INFO] [stderr] 83 | LoxValue::Func(ref callable) => callable.arity(), [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: use of `ok_or` followed by a function call [INFO] [stderr] --> src/rlox/lox_value/lox_instance.rs:33:14 [INFO] [stderr] | [INFO] [stderr] 33 | .ok_or(RuntimeError::UndefinedProperty(name.clone())) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `ok_or_else(|| RuntimeError::UndefinedProperty(name.clone()))` [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: You are using an explicit closure for cloning elements [INFO] [stderr] --> src/rlox/lox_value/lox_instance.rs:25:9 [INFO] [stderr] | [INFO] [stderr] 25 | / self.state [INFO] [stderr] 26 | | .get(&name.lexeme) [INFO] [stderr] 27 | | .map(|property| property.clone()) [INFO] [stderr] | |_____________________________________________^ [INFO] [stderr] | [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] 25 | self.state [INFO] [stderr] 26 | .get(&name.lexeme).cloned() [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: strict comparison of f32 or f64 [INFO] [stderr] --> src/rlox/lox_value/mod.rs:169:70 [INFO] [stderr] | [INFO] [stderr] 169 | (&LoxValue::Number(number), &LoxValue::Number(other)) => number == other, [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: consider comparing them within some error: `(number - other).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/rlox/lox_value/mod.rs:169:70 [INFO] [stderr] | [INFO] [stderr] 169 | (&LoxValue::Number(number), &LoxValue::Number(other)) => number == other, [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: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/interpreter/mod.rs:89:43 [INFO] [stderr] | [INFO] [stderr] 89 | let resolved_superclass = if let &Some(ref superclass) = superclass { [INFO] [stderr] | ___________________________________________^ [INFO] [stderr] 90 | | let superclass = match self.interpret_expr(superclass)? { [INFO] [stderr] 91 | | LoxValue::Class(ref class) => class.clone(), [INFO] [stderr] 92 | | _ => return Err(RuntimeError::InvalidSuperclass(token.clone())), [INFO] [stderr] ... | [INFO] [stderr] 102 | | None [INFO] [stderr] 103 | | }; [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] 89 | let resolved_superclass = if let Some(ref superclass) = *superclass { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/interpreter/mod.rs:106:21 [INFO] [stderr] | [INFO] [stderr] 106 | / match method_statement { [INFO] [stderr] 107 | | &Stmt::Func(ref name, _, _) => { [INFO] [stderr] 108 | | let method = LoxValue::Func(Rc::new(LoxFunc::new( [INFO] [stderr] 109 | | method_statement.clone(), [INFO] [stderr] ... | [INFO] [stderr] 119 | | } [INFO] [stderr] 120 | | }; [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] 106 | match *method_statement { [INFO] [stderr] 107 | Stmt::Func(ref name, _, _) => { [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/rlox/interpreter/mod.rs:142:21 [INFO] [stderr] | [INFO] [stderr] 142 | statements: &Vec, [INFO] [stderr] | ^^^^^^^^^^ help: change this to: `&[Stmt]` [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: `ref` on an entire `let` pattern is discouraged, take a reference with `&` instead [INFO] [stderr] --> src/rlox/interpreter/mod.rs:149:13 [INFO] [stderr] | [INFO] [stderr] 149 | for ref stmt in statements { [INFO] [stderr] | ^^^^^^^^ ---------- help: try: `let stmt = &statements;` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::toplevel_ref_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#toplevel_ref_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/interpreter/mod.rs:233:51 [INFO] [stderr] | [INFO] [stderr] 233 | Expr::Var(ref token, ref distance) => match distance { [INFO] [stderr] | ___________________________________________________^ [INFO] [stderr] 234 | | &Some(distance) => match self.env.borrow().get_at(&token.lexeme, distance) { [INFO] [stderr] 235 | | Ok(value) => Ok(value.clone()), [INFO] [stderr] 236 | | Err(_) => Err(RuntimeError::UndefinedVariable(token.clone())), [INFO] [stderr] ... | [INFO] [stderr] 241 | | }, [INFO] [stderr] 242 | | }, [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] 233 | Expr::Var(ref token, ref distance) => match *distance { [INFO] [stderr] 234 | Some(distance) => match self.env.borrow().get_at(&token.lexeme, distance) { [INFO] [stderr] 235 | Ok(value) => Ok(value.clone()), [INFO] [stderr] 236 | Err(_) => Err(RuntimeError::UndefinedVariable(token.clone())), [INFO] [stderr] 237 | }, [INFO] [stderr] 238 | None => match self.globals.borrow().get(&token.lexeme) { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/interpreter/mod.rs:246:17 [INFO] [stderr] | [INFO] [stderr] 246 | / match distance { [INFO] [stderr] 247 | | &Some(distance) => match self.env.borrow_mut().assign_at( [INFO] [stderr] 248 | | &token.lexeme, [INFO] [stderr] 249 | | value.clone(), [INFO] [stderr] ... | [INFO] [stderr] 261 | | }, [INFO] [stderr] 262 | | } [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] 246 | match *distance { [INFO] [stderr] 247 | Some(distance) => match self.env.borrow_mut().assign_at( [INFO] [stderr] 248 | &token.lexeme, [INFO] [stderr] 249 | value.clone(), [INFO] [stderr] 250 | distance, [INFO] [stderr] 251 | ) { [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/interpreter/mod.rs:327:52 [INFO] [stderr] | [INFO] [stderr] 327 | Expr::This(ref token, ref distance) => match distance { [INFO] [stderr] | ____________________________________________________^ [INFO] [stderr] 328 | | &Some(distance) => match self.env.borrow().get_at(&token.lexeme, distance) { [INFO] [stderr] 329 | | Ok(value) => Ok(value.clone()), [INFO] [stderr] 330 | | Err(_) => Err(RuntimeError::UndefinedVariable(token.clone())), [INFO] [stderr] ... | [INFO] [stderr] 335 | | }, [INFO] [stderr] 336 | | }, [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] 327 | Expr::This(ref token, ref distance) => match *distance { [INFO] [stderr] 328 | Some(distance) => match self.env.borrow().get_at(&token.lexeme, distance) { [INFO] [stderr] 329 | Ok(value) => Ok(value.clone()), [INFO] [stderr] 330 | Err(_) => Err(RuntimeError::UndefinedVariable(token.clone())), [INFO] [stderr] 331 | }, [INFO] [stderr] 332 | None => match self.globals.borrow().get(&token.lexeme) { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/interpreter/mod.rs:337:57 [INFO] [stderr] | [INFO] [stderr] 337 | Expr::Super(_, ref method, ref distance) => match distance { [INFO] [stderr] | _________________________________________________________^ [INFO] [stderr] 338 | | &Some(distance) => { [INFO] [stderr] 339 | | let superclass = self.env [INFO] [stderr] 340 | | .borrow() [INFO] [stderr] ... | [INFO] [stderr] 375 | | )), [INFO] [stderr] 376 | | }, [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] 337 | Expr::Super(_, ref method, ref distance) => match *distance { [INFO] [stderr] 338 | Some(distance) => { [INFO] [stderr] 339 | let superclass = self.env [INFO] [stderr] 340 | .borrow() [INFO] [stderr] 341 | .get_at(&"super".to_string(), distance) [INFO] [stderr] 342 | .expect("Couldn't find `super` when interpreting"); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `rlox::environment::Environment` [INFO] [stderr] --> src/rlox/environment/mod.rs:18:5 [INFO] [stderr] | [INFO] [stderr] 18 | / pub fn new() -> Environment { [INFO] [stderr] 19 | | Environment { [INFO] [stderr] 20 | | values: HashMap::new(), [INFO] [stderr] 21 | | enclosing: None, [INFO] [stderr] 22 | | } [INFO] [stderr] 23 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default_derive)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default_derive [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 12 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/rlox/environment/mod.rs:47:35 [INFO] [stderr] | [INFO] [stderr] 47 | pub fn assign(&mut self, key: &String, val: LoxValue) -> Result<(), EnvironmentError> { [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] help: change this to [INFO] [stderr] | [INFO] [stderr] 47 | pub fn assign(&mut self, key: &str, val: LoxValue) -> Result<(), EnvironmentError> { [INFO] [stderr] | ^^^^ [INFO] [stderr] help: change `key.clone()` to [INFO] [stderr] | [INFO] [stderr] 52 | Err(EnvironmentError::UndefinedVariable(key.to_string())) [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/rlox/environment/mod.rs:58:14 [INFO] [stderr] | [INFO] [stderr] 58 | key: &String, [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] help: change this to [INFO] [stderr] | [INFO] [stderr] 58 | key: &str, [INFO] [stderr] | ^^^^ [INFO] [stderr] help: change `key.clone()` to [INFO] [stderr] | [INFO] [stderr] 70 | None => Err(EnvironmentError::UndefinedVariable(key.to_string())), [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/rlox/environment/mod.rs:74:28 [INFO] [stderr] | [INFO] [stderr] 74 | pub fn get(&self, key: &String) -> Result { [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] help: change this to [INFO] [stderr] | [INFO] [stderr] 74 | pub fn get(&self, key: &str) -> Result { [INFO] [stderr] | ^^^^ [INFO] [stderr] help: change `key.clone()` to [INFO] [stderr] | [INFO] [stderr] 77 | None => Err(EnvironmentError::UndefinedVariable(key.to_string())), [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/rlox/environment/mod.rs:81:31 [INFO] [stderr] | [INFO] [stderr] 81 | pub fn get_at(&self, key: &String, distance: usize) -> Result { [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] help: change this to [INFO] [stderr] | [INFO] [stderr] 81 | pub fn get_at(&self, key: &str, distance: usize) -> Result { [INFO] [stderr] | ^^^^ [INFO] [stderr] help: change `key.clone()` to [INFO] [stderr] | [INFO] [stderr] 90 | None => Err(EnvironmentError::UndefinedVariable(key.to_string())), [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: `ref` on an entire `let` pattern is discouraged, take a reference with `&` instead [INFO] [stderr] --> src/rlox/resolver/mod.rs:35:13 [INFO] [stderr] | [INFO] [stderr] 35 | for ref mut stmt in ast { [INFO] [stderr] | ^^^^^^^^^^^^ --- help: try: `let stmt = &mut ast;` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#toplevel_ref_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/resolver/mod.rs:92:17 [INFO] [stderr] | [INFO] [stderr] 92 | / if let &mut Some(ref mut superclass) = superclass { [INFO] [stderr] 93 | | self.class_type = Some(ClassType::SubClass); [INFO] [stderr] 94 | | self.resolve_expression(superclass); [INFO] [stderr] 95 | | self.begin_scope(); [INFO] [stderr] 96 | | self.define("super".to_string()); [INFO] [stderr] 97 | | } [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] 92 | if let Some(ref mut superclass) = *superclass { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^ [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/rlox/resolver/mod.rs:103:21 [INFO] [stderr] | [INFO] [stderr] 103 | / match method { [INFO] [stderr] 104 | | &mut Stmt::Func(ref token, ref params, ref mut body) => { [INFO] [stderr] 105 | | self.declare(token.lexeme.clone()); [INFO] [stderr] 106 | | self.define(token.lexeme.clone()); [INFO] [stderr] ... | [INFO] [stderr] 116 | | _ => {} [INFO] [stderr] 117 | | } [INFO] [stderr] | |_____________________^ [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] help: try this [INFO] [stderr] | [INFO] [stderr] 103 | if let &mut Stmt::Func(ref token, ref params, ref mut body) = method { [INFO] [stderr] 104 | self.declare(token.lexeme.clone()); [INFO] [stderr] 105 | self.define(token.lexeme.clone()); [INFO] [stderr] 106 | [INFO] [stderr] 107 | let function_type = if token.lexeme == "init" { [INFO] [stderr] 108 | FunctionType::Initializer [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/resolver/mod.rs:103:21 [INFO] [stderr] | [INFO] [stderr] 103 | / match method { [INFO] [stderr] 104 | | &mut Stmt::Func(ref token, ref params, ref mut body) => { [INFO] [stderr] 105 | | self.declare(token.lexeme.clone()); [INFO] [stderr] 106 | | self.define(token.lexeme.clone()); [INFO] [stderr] ... | [INFO] [stderr] 116 | | _ => {} [INFO] [stderr] 117 | | } [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] 103 | match *method { [INFO] [stderr] 104 | Stmt::Func(ref token, ref params, ref mut body) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: `ref` on an entire `let` pattern is discouraged, take a reference with `&` instead [INFO] [stderr] --> src/rlox/resolver/mod.rs:156:21 [INFO] [stderr] | [INFO] [stderr] 156 | for ref mut arg in arguments { [INFO] [stderr] | ^^^^^^^^^^^ --------- help: try: `let arg = &mut arguments;` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#toplevel_ref_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/resolver/mod.rs:198:17 [INFO] [stderr] | [INFO] [stderr] 198 | / match class_type { [INFO] [stderr] 199 | | &ClassType::Class => { [INFO] [stderr] 200 | | panic!("UnexpectedTokenError: Cannot use `super` without a superclass.") [INFO] [stderr] 201 | | } [INFO] [stderr] ... | [INFO] [stderr] 213 | | } [INFO] [stderr] 214 | | } [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] 198 | match *class_type { [INFO] [stderr] 199 | ClassType::Class => { [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/rlox/resolver/mod.rs:231:17 [INFO] [stderr] | [INFO] [stderr] 231 | params: &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: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/resolver/mod.rs:244:9 [INFO] [stderr] | [INFO] [stderr] 244 | / match body { [INFO] [stderr] 245 | | &mut Stmt::Block(ref mut stmts) => for stmt in stmts { [INFO] [stderr] 246 | | self.resolve_statement(stmt); [INFO] [stderr] 247 | | }, [INFO] [stderr] 248 | | _ => panic!("The body of a function should never be other than Stmt::Block"), [INFO] [stderr] 249 | | } [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] 244 | match *body { [INFO] [stderr] 245 | Stmt::Block(ref mut stmts) => for stmt in stmts { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: this public function dereferences a raw pointer but is not marked `unsafe` [INFO] [stderr] --> src/rlox/wasm.rs:12:39 [INFO] [stderr] | [INFO] [stderr] 12 | incoming_str = CStr::from_ptr(data).to_str().unwrap().to_owned(); [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::not_unsafe_ptr_arg_deref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#not_unsafe_ptr_arg_deref [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/rlox/api.rs:86:8 [INFO] [stderr] | [INFO] [stderr] 86 | if scanner_errors.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!scanner_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: redundant closure found [INFO] [stderr] --> src/rlox/api.rs:89:18 [INFO] [stderr] | [INFO] [stderr] 89 | .map(|err| Error::Scanner(err)) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `Error::Scanner` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_closure)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stderr] [INFO] [stderr] warning: redundant closure found [INFO] [stderr] --> src/rlox/api.rs:103:51 [INFO] [stderr] | [INFO] [stderr] 103 | Err(errors) => Err(errors.into_iter().map(|err| Error::Parser(err)).collect()), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `Error::Parser` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stderr] [INFO] [stderr] warning: Err(_) will match all errors, maybe not a good idea [INFO] [stderr] --> src/rlox/api.rs:136:13 [INFO] [stderr] | [INFO] [stderr] 136 | Err(_) => panic!("Error reading input line"), [INFO] [stderr] | ^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_wild_err_arm)] on by default [INFO] [stderr] = note: to remove this warning, match each error separately or use unreachable macro [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_wild_err_arm [INFO] [stderr] [INFO] [stderr] error: aborting due to 2 previous errors [INFO] [stderr] [INFO] [stderr] error: Could not compile `rlox`. [INFO] [stderr] warning: build failed, waiting for other jobs to finish... [INFO] [stderr] warning: methods called `is_*` usually take self by reference or no self; consider choosing a less ambiguous name [INFO] [stderr] --> src/rlox/scanner/char_scanner.rs:117:17 [INFO] [stderr] | [INFO] [stderr] 117 | fn is_match(&mut self, c: char) -> bool { [INFO] [stderr] | ^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::wrong_self_convention)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wrong_self_convention [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/rlox/scanner/mod.rs:35:21 [INFO] [stderr] | [INFO] [stderr] 35 | let token = tokens.get(0).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&tokens[0]` [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] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/rlox/scanner/mod.rs:122:29 [INFO] [stderr] | [INFO] [stderr] 122 | let token = tokens.get(0).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&tokens[0]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/scanner/mod.rs:126:17 [INFO] [stderr] | [INFO] [stderr] 126 | / match token [INFO] [stderr] 127 | | .literal [INFO] [stderr] 128 | | .as_ref() [INFO] [stderr] 129 | | .expect("Missing literal in token") { [INFO] [stderr] 130 | | &Literal::String(ref value) => assert_eq!(value, "some string"), [INFO] [stderr] 131 | | _ => assert!(false, "Should be a Literal::String"), [INFO] [stderr] 132 | | } [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] 126 | match *token [INFO] [stderr] 127 | .literal [INFO] [stderr] 128 | .as_ref() [INFO] [stderr] 129 | .expect("Missing literal in token") { [INFO] [stderr] 130 | Literal::String(ref value) => assert_eq!(value, "some string"), [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/rlox/scanner/mod.rs:141:29 [INFO] [stderr] | [INFO] [stderr] 141 | let token = tokens.get(0).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&tokens[0]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/scanner/mod.rs:145:17 [INFO] [stderr] | [INFO] [stderr] 145 | / match token [INFO] [stderr] 146 | | .literal [INFO] [stderr] 147 | | .as_ref() [INFO] [stderr] 148 | | .expect("Missing literal in token") { [INFO] [stderr] 149 | | &Literal::Number(value) => assert_eq!(value, 123.45), [INFO] [stderr] 150 | | _ => assert!(false, "Should be a Literal::Number"), [INFO] [stderr] 151 | | } [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] 145 | match *token [INFO] [stderr] 146 | .literal [INFO] [stderr] 147 | .as_ref() [INFO] [stderr] 148 | .expect("Missing literal in token") { [INFO] [stderr] 149 | Literal::Number(value) => assert_eq!(value, 123.45), [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: strict comparison of f32 or f64 [INFO] [stderr] --> src/rlox/scanner/mod.rs:149:48 [INFO] [stderr] | [INFO] [stderr] 149 | &Literal::Number(value) => assert_eq!(value, 123.45), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ [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/rlox/scanner/mod.rs:149:48 [INFO] [stderr] | [INFO] [stderr] 149 | &Literal::Number(value) => assert_eq!(value, 123.45), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#float_cmp [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: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/rlox/scanner/mod.rs:160:29 [INFO] [stderr] | [INFO] [stderr] 160 | let token = tokens.get(0).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&tokens[0]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/rlox/parser/token_parser.rs:26:12 [INFO] [stderr] | [INFO] [stderr] 26 | 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: useless use of `format!` [INFO] [stderr] --> src/rlox/parser/token_parser.rs:68:13 [INFO] [stderr] | [INFO] [stderr] 68 | format!("Expected `{{` before class body."), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"Expected `{{` before class body.".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/rlox/parser/token_parser.rs:78:13 [INFO] [stderr] | [INFO] [stderr] 78 | format!("Expected `}}` after class body."), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"Expected `}}` after class body.".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] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/rlox/parser/token_parser.rs:546:9 [INFO] [stderr] | [INFO] [stderr] 546 | self.tokens.get(self.current).unwrap() [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `self.tokens[self.current]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/rlox/parser/token_parser.rs:550:9 [INFO] [stderr] | [INFO] [stderr] 550 | self.tokens.get(self.current - 1).unwrap() [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `self.tokens[self.current - 1]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: large size difference between variants [INFO] [stderr] --> src/rlox/parser/stmt.rs:14:5 [INFO] [stderr] | [INFO] [stderr] 14 | Class(Token, Option, Vec), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::large_enum_variant)] on by default [INFO] [stderr] help: consider boxing the large fields to reduce the total size of the enum [INFO] [stderr] --> src/rlox/parser/stmt.rs:14:5 [INFO] [stderr] | [INFO] [stderr] 14 | Class(Token, Option, Vec), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stderr] [INFO] [stderr] warning: You are using an explicit closure for cloning elements [INFO] [stderr] --> src/rlox/lox_value/lox_class.rs:25:9 [INFO] [stderr] | [INFO] [stderr] 25 | / self.methods [INFO] [stderr] 26 | | .get(name) [INFO] [stderr] 27 | | .map(|method| method.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] 25 | self.methods [INFO] [stderr] 26 | .get(name).cloned() [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/lox_value/lox_class.rs:82:13 [INFO] [stderr] | [INFO] [stderr] 82 | / match init { [INFO] [stderr] 83 | | &LoxValue::Func(ref callable) => callable.arity(), [INFO] [stderr] 84 | | _ => panic!("Can't get non-func as method from an instance"), [INFO] [stderr] 85 | | } [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] 82 | match *init { [INFO] [stderr] 83 | LoxValue::Func(ref callable) => callable.arity(), [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: use of `ok_or` followed by a function call [INFO] [stderr] --> src/rlox/lox_value/lox_instance.rs:33:14 [INFO] [stderr] | [INFO] [stderr] 33 | .ok_or(RuntimeError::UndefinedProperty(name.clone())) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `ok_or_else(|| RuntimeError::UndefinedProperty(name.clone()))` [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: You are using an explicit closure for cloning elements [INFO] [stderr] --> src/rlox/lox_value/lox_instance.rs:25:9 [INFO] [stderr] | [INFO] [stderr] 25 | / self.state [INFO] [stderr] 26 | | .get(&name.lexeme) [INFO] [stderr] 27 | | .map(|property| property.clone()) [INFO] [stderr] | |_____________________________________________^ [INFO] [stderr] | [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] 25 | self.state [INFO] [stderr] 26 | .get(&name.lexeme).cloned() [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: strict comparison of f32 or f64 [INFO] [stderr] --> src/rlox/lox_value/mod.rs:169:70 [INFO] [stderr] | [INFO] [stderr] 169 | (&LoxValue::Number(number), &LoxValue::Number(other)) => number == other, [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: consider comparing them within some error: `(number - other).abs() < error` [INFO] [stderr] | [INFO] [stderr] note: std::f32::EPSILON and std::f64::EPSILON are available. [INFO] [stderr] --> src/rlox/lox_value/mod.rs:169:70 [INFO] [stderr] | [INFO] [stderr] 169 | (&LoxValue::Number(number), &LoxValue::Number(other)) => number == other, [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: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/interpreter/mod.rs:89:43 [INFO] [stderr] | [INFO] [stderr] 89 | let resolved_superclass = if let &Some(ref superclass) = superclass { [INFO] [stderr] | ___________________________________________^ [INFO] [stderr] 90 | | let superclass = match self.interpret_expr(superclass)? { [INFO] [stderr] 91 | | LoxValue::Class(ref class) => class.clone(), [INFO] [stderr] 92 | | _ => return Err(RuntimeError::InvalidSuperclass(token.clone())), [INFO] [stderr] ... | [INFO] [stderr] 102 | | None [INFO] [stderr] 103 | | }; [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] 89 | let resolved_superclass = if let Some(ref superclass) = *superclass { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/interpreter/mod.rs:106:21 [INFO] [stderr] | [INFO] [stderr] 106 | / match method_statement { [INFO] [stderr] 107 | | &Stmt::Func(ref name, _, _) => { [INFO] [stderr] 108 | | let method = LoxValue::Func(Rc::new(LoxFunc::new( [INFO] [stderr] 109 | | method_statement.clone(), [INFO] [stderr] ... | [INFO] [stderr] 119 | | } [INFO] [stderr] 120 | | }; [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] 106 | match *method_statement { [INFO] [stderr] 107 | Stmt::Func(ref name, _, _) => { [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/rlox/interpreter/mod.rs:142:21 [INFO] [stderr] | [INFO] [stderr] 142 | statements: &Vec, [INFO] [stderr] | ^^^^^^^^^^ help: change this to: `&[Stmt]` [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: `ref` on an entire `let` pattern is discouraged, take a reference with `&` instead [INFO] [stderr] --> src/rlox/interpreter/mod.rs:149:13 [INFO] [stderr] | [INFO] [stderr] 149 | for ref stmt in statements { [INFO] [stderr] | ^^^^^^^^ ---------- help: try: `let stmt = &statements;` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::toplevel_ref_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#toplevel_ref_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/interpreter/mod.rs:233:51 [INFO] [stderr] | [INFO] [stderr] 233 | Expr::Var(ref token, ref distance) => match distance { [INFO] [stderr] | ___________________________________________________^ [INFO] [stderr] 234 | | &Some(distance) => match self.env.borrow().get_at(&token.lexeme, distance) { [INFO] [stderr] 235 | | Ok(value) => Ok(value.clone()), [INFO] [stderr] 236 | | Err(_) => Err(RuntimeError::UndefinedVariable(token.clone())), [INFO] [stderr] ... | [INFO] [stderr] 241 | | }, [INFO] [stderr] 242 | | }, [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] 233 | Expr::Var(ref token, ref distance) => match *distance { [INFO] [stderr] 234 | Some(distance) => match self.env.borrow().get_at(&token.lexeme, distance) { [INFO] [stderr] 235 | Ok(value) => Ok(value.clone()), [INFO] [stderr] 236 | Err(_) => Err(RuntimeError::UndefinedVariable(token.clone())), [INFO] [stderr] 237 | }, [INFO] [stderr] 238 | None => match self.globals.borrow().get(&token.lexeme) { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/interpreter/mod.rs:246:17 [INFO] [stderr] | [INFO] [stderr] 246 | / match distance { [INFO] [stderr] 247 | | &Some(distance) => match self.env.borrow_mut().assign_at( [INFO] [stderr] 248 | | &token.lexeme, [INFO] [stderr] 249 | | value.clone(), [INFO] [stderr] ... | [INFO] [stderr] 261 | | }, [INFO] [stderr] 262 | | } [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] 246 | match *distance { [INFO] [stderr] 247 | Some(distance) => match self.env.borrow_mut().assign_at( [INFO] [stderr] 248 | &token.lexeme, [INFO] [stderr] 249 | value.clone(), [INFO] [stderr] 250 | distance, [INFO] [stderr] 251 | ) { [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/interpreter/mod.rs:327:52 [INFO] [stderr] | [INFO] [stderr] 327 | Expr::This(ref token, ref distance) => match distance { [INFO] [stderr] | ____________________________________________________^ [INFO] [stderr] 328 | | &Some(distance) => match self.env.borrow().get_at(&token.lexeme, distance) { [INFO] [stderr] 329 | | Ok(value) => Ok(value.clone()), [INFO] [stderr] 330 | | Err(_) => Err(RuntimeError::UndefinedVariable(token.clone())), [INFO] [stderr] ... | [INFO] [stderr] 335 | | }, [INFO] [stderr] 336 | | }, [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] 327 | Expr::This(ref token, ref distance) => match *distance { [INFO] [stderr] 328 | Some(distance) => match self.env.borrow().get_at(&token.lexeme, distance) { [INFO] [stderr] 329 | Ok(value) => Ok(value.clone()), [INFO] [stderr] 330 | Err(_) => Err(RuntimeError::UndefinedVariable(token.clone())), [INFO] [stderr] 331 | }, [INFO] [stderr] 332 | None => match self.globals.borrow().get(&token.lexeme) { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/interpreter/mod.rs:337:57 [INFO] [stderr] | [INFO] [stderr] 337 | Expr::Super(_, ref method, ref distance) => match distance { [INFO] [stderr] | _________________________________________________________^ [INFO] [stderr] 338 | | &Some(distance) => { [INFO] [stderr] 339 | | let superclass = self.env [INFO] [stderr] 340 | | .borrow() [INFO] [stderr] ... | [INFO] [stderr] 375 | | )), [INFO] [stderr] 376 | | }, [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] 337 | Expr::Super(_, ref method, ref distance) => match *distance { [INFO] [stderr] 338 | Some(distance) => { [INFO] [stderr] 339 | let superclass = self.env [INFO] [stderr] 340 | .borrow() [INFO] [stderr] 341 | .get_at(&"super".to_string(), distance) [INFO] [stderr] 342 | .expect("Couldn't find `super` when interpreting"); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `rlox::environment::Environment` [INFO] [stderr] --> src/rlox/environment/mod.rs:18:5 [INFO] [stderr] | [INFO] [stderr] 18 | / pub fn new() -> Environment { [INFO] [stderr] 19 | | Environment { [INFO] [stderr] 20 | | values: HashMap::new(), [INFO] [stderr] 21 | | enclosing: None, [INFO] [stderr] 22 | | } [INFO] [stderr] 23 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default_derive)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default_derive [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 12 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/rlox/environment/mod.rs:47:35 [INFO] [stderr] | [INFO] [stderr] 47 | pub fn assign(&mut self, key: &String, val: LoxValue) -> Result<(), EnvironmentError> { [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] help: change this to [INFO] [stderr] | [INFO] [stderr] 47 | pub fn assign(&mut self, key: &str, val: LoxValue) -> Result<(), EnvironmentError> { [INFO] [stderr] | ^^^^ [INFO] [stderr] help: change `key.clone()` to [INFO] [stderr] | [INFO] [stderr] 52 | Err(EnvironmentError::UndefinedVariable(key.to_string())) [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/rlox/environment/mod.rs:58:14 [INFO] [stderr] | [INFO] [stderr] 58 | key: &String, [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] help: change this to [INFO] [stderr] | [INFO] [stderr] 58 | key: &str, [INFO] [stderr] | ^^^^ [INFO] [stderr] help: change `key.clone()` to [INFO] [stderr] | [INFO] [stderr] 70 | None => Err(EnvironmentError::UndefinedVariable(key.to_string())), [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/rlox/environment/mod.rs:74:28 [INFO] [stderr] | [INFO] [stderr] 74 | pub fn get(&self, key: &String) -> Result { [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] help: change this to [INFO] [stderr] | [INFO] [stderr] 74 | pub fn get(&self, key: &str) -> Result { [INFO] [stderr] | ^^^^ [INFO] [stderr] help: change `key.clone()` to [INFO] [stderr] | [INFO] [stderr] 77 | None => Err(EnvironmentError::UndefinedVariable(key.to_string())), [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/rlox/environment/mod.rs:81:31 [INFO] [stderr] | [INFO] [stderr] 81 | pub fn get_at(&self, key: &String, distance: usize) -> Result { [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] help: change this to [INFO] [stderr] | [INFO] [stderr] 81 | pub fn get_at(&self, key: &str, distance: usize) -> Result { [INFO] [stderr] | ^^^^ [INFO] [stderr] help: change `key.clone()` to [INFO] [stderr] | [INFO] [stderr] 90 | None => Err(EnvironmentError::UndefinedVariable(key.to_string())), [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: `ref` on an entire `let` pattern is discouraged, take a reference with `&` instead [INFO] [stderr] --> src/rlox/resolver/mod.rs:35:13 [INFO] [stderr] | [INFO] [stderr] 35 | for ref mut stmt in ast { [INFO] [stderr] | ^^^^^^^^^^^^ --- help: try: `let stmt = &mut ast;` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#toplevel_ref_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/resolver/mod.rs:92:17 [INFO] [stderr] | [INFO] [stderr] 92 | / if let &mut Some(ref mut superclass) = superclass { [INFO] [stderr] 93 | | self.class_type = Some(ClassType::SubClass); [INFO] [stderr] 94 | | self.resolve_expression(superclass); [INFO] [stderr] 95 | | self.begin_scope(); [INFO] [stderr] 96 | | self.define("super".to_string()); [INFO] [stderr] 97 | | } [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] 92 | if let Some(ref mut superclass) = *superclass { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^ [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/rlox/resolver/mod.rs:103:21 [INFO] [stderr] | [INFO] [stderr] 103 | / match method { [INFO] [stderr] 104 | | &mut Stmt::Func(ref token, ref params, ref mut body) => { [INFO] [stderr] 105 | | self.declare(token.lexeme.clone()); [INFO] [stderr] 106 | | self.define(token.lexeme.clone()); [INFO] [stderr] ... | [INFO] [stderr] 116 | | _ => {} [INFO] [stderr] 117 | | } [INFO] [stderr] | |_____________________^ [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] help: try this [INFO] [stderr] | [INFO] [stderr] 103 | if let &mut Stmt::Func(ref token, ref params, ref mut body) = method { [INFO] [stderr] 104 | self.declare(token.lexeme.clone()); [INFO] [stderr] 105 | self.define(token.lexeme.clone()); [INFO] [stderr] 106 | [INFO] [stderr] 107 | let function_type = if token.lexeme == "init" { [INFO] [stderr] 108 | FunctionType::Initializer [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/resolver/mod.rs:103:21 [INFO] [stderr] | [INFO] [stderr] 103 | / match method { [INFO] [stderr] 104 | | &mut Stmt::Func(ref token, ref params, ref mut body) => { [INFO] [stderr] 105 | | self.declare(token.lexeme.clone()); [INFO] [stderr] 106 | | self.define(token.lexeme.clone()); [INFO] [stderr] ... | [INFO] [stderr] 116 | | _ => {} [INFO] [stderr] 117 | | } [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] 103 | match *method { [INFO] [stderr] 104 | Stmt::Func(ref token, ref params, ref mut body) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: `ref` on an entire `let` pattern is discouraged, take a reference with `&` instead [INFO] [stderr] --> src/rlox/resolver/mod.rs:156:21 [INFO] [stderr] | [INFO] [stderr] 156 | for ref mut arg in arguments { [INFO] [stderr] | ^^^^^^^^^^^ --------- help: try: `let arg = &mut arguments;` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#toplevel_ref_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/resolver/mod.rs:198:17 [INFO] [stderr] | [INFO] [stderr] 198 | / match class_type { [INFO] [stderr] 199 | | &ClassType::Class => { [INFO] [stderr] 200 | | panic!("UnexpectedTokenError: Cannot use `super` without a superclass.") [INFO] [stderr] 201 | | } [INFO] [stderr] ... | [INFO] [stderr] 213 | | } [INFO] [stderr] 214 | | } [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] 198 | match *class_type { [INFO] [stderr] 199 | ClassType::Class => { [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/rlox/resolver/mod.rs:231:17 [INFO] [stderr] | [INFO] [stderr] 231 | params: &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: you don't need to add `&` to all patterns [INFO] [stderr] --> src/rlox/resolver/mod.rs:244:9 [INFO] [stderr] | [INFO] [stderr] 244 | / match body { [INFO] [stderr] 245 | | &mut Stmt::Block(ref mut stmts) => for stmt in stmts { [INFO] [stderr] 246 | | self.resolve_statement(stmt); [INFO] [stderr] 247 | | }, [INFO] [stderr] 248 | | _ => panic!("The body of a function should never be other than Stmt::Block"), [INFO] [stderr] 249 | | } [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] 244 | match *body { [INFO] [stderr] 245 | Stmt::Block(ref mut stmts) => for stmt in stmts { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: this public function dereferences a raw pointer but is not marked `unsafe` [INFO] [stderr] --> src/rlox/wasm.rs:12:39 [INFO] [stderr] | [INFO] [stderr] 12 | incoming_str = CStr::from_ptr(data).to_str().unwrap().to_owned(); [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::not_unsafe_ptr_arg_deref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#not_unsafe_ptr_arg_deref [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/rlox/api.rs:86:8 [INFO] [stderr] | [INFO] [stderr] 86 | if scanner_errors.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!scanner_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: redundant closure found [INFO] [stderr] --> src/rlox/api.rs:89:18 [INFO] [stderr] | [INFO] [stderr] 89 | .map(|err| Error::Scanner(err)) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `Error::Scanner` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_closure)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stderr] [INFO] [stderr] warning: redundant closure found [INFO] [stderr] --> src/rlox/api.rs:103:51 [INFO] [stderr] | [INFO] [stderr] 103 | Err(errors) => Err(errors.into_iter().map(|err| Error::Parser(err)).collect()), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `Error::Parser` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stderr] [INFO] [stderr] warning: Err(_) will match all errors, maybe not a good idea [INFO] [stderr] --> src/rlox/api.rs:136:13 [INFO] [stderr] | [INFO] [stderr] 136 | Err(_) => panic!("Error reading input line"), [INFO] [stderr] | ^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_wild_err_arm)] on by default [INFO] [stderr] = note: to remove this warning, match each error separately or use unreachable macro [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_wild_err_arm [INFO] [stderr] [INFO] [stderr] error: aborting due to 3 previous errors [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" "8565230bd026eb866c3d6ba7bbace5ac30633a2b2b0cdef88391c676cc25d111"` [INFO] running `"docker" "rm" "-f" "8565230bd026eb866c3d6ba7bbace5ac30633a2b2b0cdef88391c676cc25d111"` [INFO] [stdout] 8565230bd026eb866c3d6ba7bbace5ac30633a2b2b0cdef88391c676cc25d111