[INFO] crate glr-parser 0.0.1 is already in cache [INFO] extracting crate glr-parser 0.0.1 into work/ex/clippy-test-run/sources/stable/reg/glr-parser/0.0.1 [INFO] extracting crate glr-parser 0.0.1 into work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/glr-parser/0.0.1 [INFO] validating manifest of glr-parser-0.0.1 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 glr-parser-0.0.1 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 glr-parser-0.0.1 [INFO] removed 0 missing tests [INFO] finished frobbing glr-parser-0.0.1 [INFO] frobbed toml for glr-parser-0.0.1 written to work/ex/clippy-test-run/sources/stable/reg/glr-parser/0.0.1/Cargo.toml [INFO] started frobbing glr-parser-0.0.1 [INFO] removed 0 missing tests [INFO] finished frobbing glr-parser-0.0.1 [INFO] frobbed toml for glr-parser-0.0.1 written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/glr-parser/0.0.1/Cargo.toml [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "generate-lockfile" "--manifest-path" "Cargo.toml" "-Zno-index-update"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "generate-lockfile" "--manifest-path" "Cargo.toml" "-Zno-index-update"` [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 glr-parser-0.0.1 against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-4/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/reg/glr-parser/0.0.1:/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] 9dcf6ebce48164087afc9e84a273849699ff2ad8b8dcfa9c7506c4b82d82e81a [INFO] running `"docker" "start" "-a" "9dcf6ebce48164087afc9e84a273849699ff2ad8b8dcfa9c7506c4b82d82e81a"` [INFO] [stderr] Checking glr-parser v0.0.1 (/opt/crater/workdir) [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/glr.rs:247:5 [INFO] [stderr] | [INFO] [stderr] 247 | return offsets; [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: remove `return` as shown: `offsets` [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: unneeded return statement [INFO] [stderr] --> src/glr.rs:247:5 [INFO] [stderr] | [INFO] [stderr] 247 | return offsets; [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: remove `return` as shown: `offsets` [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: length comparison to zero [INFO] [stderr] --> src/glr_lex.rs:35:12 [INFO] [stderr] | [INFO] [stderr] 35 | if re_string.len() > 0 { re_string.push('|'); } [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!re_string.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: single-character string constant used as pattern [INFO] [stderr] --> src/glr_lex.rs:46:37 [INFO] [stderr] | [INFO] [stderr] 46 | for line in lex_re_string.split("\n") { [INFO] [stderr] | ^^^^ help: try using a char instead: `'\n'` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_char_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/glr_lex.rs:47:12 [INFO] [stderr] | [INFO] [stderr] 47 | if line.trim().len() == 0 {continue} [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `line.trim().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: the variable `index` is used as a loop counter. Consider using `for (index, item) in line.split("=").enumerate()` or similar iterators [INFO] [stderr] --> src/glr_lex.rs:50:21 [INFO] [stderr] | [INFO] [stderr] 50 | for item in line.split("=") { [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::explicit_counter_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_counter_loop [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/glr_lex.rs:50:32 [INFO] [stderr] | [INFO] [stderr] 50 | for item in line.split("=") { [INFO] [stderr] | ^^^ help: try using a char instead: `'='` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: the function has a cyclomatic complexity of 26 [INFO] [stderr] --> src/glr_grammar.rs:27:1 [INFO] [stderr] | [INFO] [stderr] 27 | / pub fn grammar_gen(_grammar_str: &str, terminal_tokens: Rc>) -> Vec>{ [INFO] [stderr] 28 | | let grammar_str = _grammar_str.to_string() + "\n"; [INFO] [stderr] 29 | | let mut ret: Vec> = vec![]; [INFO] [stderr] 30 | | [INFO] [stderr] ... | [INFO] [stderr] 371 | | ret [INFO] [stderr] 372 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cyclomatic_complexity)] on by default [INFO] [stderr] = help: you could split it up into multiple smaller functions [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cyclomatic_complexity [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/glr_grammar.rs:43:52 [INFO] [stderr] | [INFO] [stderr] 43 | fn get_from_cache(orig: &Arc, entry: &Vec>>, cache: &HashMap, Vec>>>) -> Vec>> { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ help: change this to: `&[Vec>]` [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: called `.get_mut().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/glr_grammar.rs:66:37 [INFO] [stderr] | [INFO] [stderr] 66 | new_entry.get_mut(index).unwrap().push(atom.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `new_entry[index]` [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_mut().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/glr_grammar.rs:72:29 [INFO] [stderr] | [INFO] [stderr] 72 | new_entry.get_mut(index).unwrap().push(atom.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `new_entry[index]` [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/glr_grammar.rs:83:12 [INFO] [stderr] | [INFO] [stderr] 83 | if ret.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!ret.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: length comparison to zero [INFO] [stderr] --> src/glr_grammar.rs:171:20 [INFO] [stderr] | [INFO] [stderr] 171 | if word.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!word.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: length comparison to zero [INFO] [stderr] --> src/glr_grammar.rs:185:20 [INFO] [stderr] | [INFO] [stderr] 185 | if word.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!word.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: length comparison to zero [INFO] [stderr] --> src/glr_grammar.rs:223:20 [INFO] [stderr] | [INFO] [stderr] 223 | if word.len() > 0 { // same as above ' ' matching [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!word.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: length comparison to zero [INFO] [stderr] --> src/glr_grammar.rs:260:28 [INFO] [stderr] | [INFO] [stderr] 260 | if word.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!word.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 seem to be trying to use `&Box`. Consider using just `&T` [INFO] [stderr] --> src/glr_grammar.rs:378:90 [INFO] [stderr] | [INFO] [stderr] 378 | fn gen_grammars(prod: Vec>, counter: &mut HashMap, n_count: &mut Box) -> (Vec>, Vec) { [INFO] [stderr] | ^^^^^^^^^^^^^ help: try: `&mut u16` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::borrowed_box)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrowed_box [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/glr_grammar.rs:482:12 [INFO] [stderr] | [INFO] [stderr] 482 | if ret.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `ret.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 seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/glr.rs:58:9 [INFO] [stderr] | [INFO] [stderr] 58 | / match grammars_hashmap.entry(symbol_name) { [INFO] [stderr] 59 | | Occupied(entry) => { [INFO] [stderr] 60 | | entry.into_mut().push(Arc::new(*item)); [INFO] [stderr] 61 | | }, [INFO] [stderr] 62 | | _ => {} [INFO] [stderr] 63 | | } [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] 58 | if let Occupied(entry) = grammars_hashmap.entry(symbol_name) { [INFO] [stderr] 59 | entry.into_mut().push(Arc::new(*item)); [INFO] [stderr] 60 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/glr.rs:75:5 [INFO] [stderr] | [INFO] [stderr] 75 | / loop { [INFO] [stderr] 76 | | let current_symbol = match symbols.pop() {Some(x) => x, None => break}; [INFO] [stderr] 77 | | [INFO] [stderr] 78 | | match *current_symbol { [INFO] [stderr] ... | [INFO] [stderr] 102 | | } [INFO] [stderr] 103 | | } [INFO] [stderr] | |_____^ help: try: `while let Some(x) = symbols.pop() { .. }` [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/glr.rs:166:37 [INFO] [stderr] | [INFO] [stderr] 166 | production: &Vec>, [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: change this to: `&[Arc]` [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/glr.rs:182:40 [INFO] [stderr] | [INFO] [stderr] 182 | if item.production.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `item.production.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/glr.rs:217:37 [INFO] [stderr] | [INFO] [stderr] 217 | production: &Vec>, [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: change this to: `&[Arc]` [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/glr.rs:231:32 [INFO] [stderr] | [INFO] [stderr] 231 | if item.production.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `item.production.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: this loop could be written as a `while let` loop [INFO] [stderr] --> src/glr.rs:261:5 [INFO] [stderr] | [INFO] [stderr] 261 | / loop { [INFO] [stderr] 262 | | let mut loop_item = match working_items.pop() {Some(x) => x, None => break}; [INFO] [stderr] 263 | | [INFO] [stderr] 264 | | if !ret_cache.contains(&loop_item) { [INFO] [stderr] ... | [INFO] [stderr] 332 | | [INFO] [stderr] 333 | | } [INFO] [stderr] | |_____^ help: try: `while let Some(x) = working_items.pop() { .. }` [INFO] [stderr] | [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: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/glr.rs:312:9 [INFO] [stderr] | [INFO] [stderr] 312 | / match grammars_hashmap.get(&symbol_name) { [INFO] [stderr] 313 | | Some(grammer_items) => { [INFO] [stderr] 314 | | for each_grammar in grammer_items.iter() { [INFO] [stderr] 315 | | for each_production in get_real_productions(&grammars_hashmap, &each_grammar.production, &mut real_prod_cache).iter() { [INFO] [stderr] ... | [INFO] [stderr] 330 | | None => {} [INFO] [stderr] 331 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [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] 312 | if let Some(grammer_items) = grammars_hashmap.get(&symbol_name) { [INFO] [stderr] 313 | for each_grammar in grammer_items.iter() { [INFO] [stderr] 314 | for each_production in get_real_productions(&grammars_hashmap, &each_grammar.production, &mut real_prod_cache).iter() { [INFO] [stderr] 315 | for terminal_atom in terminals.iter() { [INFO] [stderr] 316 | let lr_item = Arc::new(LRItem { [INFO] [stderr] 317 | stacktop: 0, [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/glr.rs:367:13 [INFO] [stderr] | [INFO] [stderr] 367 | cc: &Vec>, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: change this to: `&[Arc]` [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: parameter of type `HashMap` should be generalized over different hashers [INFO] [stderr] --> src/glr.rs:426:40 [INFO] [stderr] | [INFO] [stderr] 426 | pub fn create_table(grammars_hashmap: &HashMap>>, initial_item: Arc) -> (Vec>>>, Vec>) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::implicit_hasher)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#implicit_hasher [INFO] [stderr] help: consider adding a type parameter [INFO] [stderr] | [INFO] [stderr] 426 | pub fn create_table(grammars_hashmap: &HashMap>, S>, initial_item: Arc) -> (Vec>>>, Vec>) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: very complex type used. Consider factoring parts into `type` definitions [INFO] [stderr] --> src/glr.rs:426:110 [INFO] [stderr] | [INFO] [stderr] 426 | pub fn create_table(grammars_hashmap: &HashMap>>, initial_item: Arc) -> (Vec>>>, Vec>) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::type_complexity)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#type_complexity [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/glr.rs:476:40 [INFO] [stderr] | [INFO] [stderr] 476 | if item.production.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!item.production.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: length comparison to zero [INFO] [stderr] --> src/glr_lex.rs:35:12 [INFO] [stderr] | [INFO] [stderr] 35 | if re_string.len() > 0 { re_string.push('|'); } [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!re_string.is_empty()` [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/glr.rs:643:9 [INFO] [stderr] | [INFO] [stderr] 643 | / loop { [INFO] [stderr] 644 | | match childrens.pop() { [INFO] [stderr] 645 | | Some(n) => { [INFO] [stderr] 646 | | match n { [INFO] [stderr] ... | [INFO] [stderr] 657 | | } [INFO] [stderr] 658 | | } [INFO] [stderr] | |_________^ help: try: `while let Some(n) = childrens.pop() { .. }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] | [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: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/glr.rs:646:21 [INFO] [stderr] | [INFO] [stderr] 646 | / match n { [INFO] [stderr] 647 | | Some(mut x) => { [INFO] [stderr] 648 | | for item in x { [INFO] [stderr] 649 | | let mut _item = item; [INFO] [stderr] ... | [INFO] [stderr] 653 | | None => {} [INFO] [stderr] 654 | | } [INFO] [stderr] | |_____________________^ [INFO] [stderr] | [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] 646 | if let Some(mut x) = n { [INFO] [stderr] 647 | for item in x { [INFO] [stderr] 648 | let mut _item = item; [INFO] [stderr] 649 | childrens.push(mem::replace(&mut _item.children, None)); [INFO] [stderr] 650 | } [INFO] [stderr] 651 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/glr_lex.rs:46:37 [INFO] [stderr] | [INFO] [stderr] 46 | for line in lex_re_string.split("\n") { [INFO] [stderr] | ^^^^ help: try using a char instead: `'\n'` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_char_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/glr_lex.rs:47:12 [INFO] [stderr] | [INFO] [stderr] 47 | if line.trim().len() == 0 {continue} [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `line.trim().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: the variable `index` is used as a loop counter. Consider using `for (index, item) in line.split("=").enumerate()` or similar iterators [INFO] [stderr] --> src/glr_lex.rs:50:21 [INFO] [stderr] | [INFO] [stderr] 50 | for item in line.split("=") { [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] warning: parameter of type `HashMap` should be generalized over different hashers [INFO] [stderr] --> src/glr.rs:666:48 [INFO] [stderr] | [INFO] [stderr] | [INFO] [stderr] 666 | pub fn parse(words: Vec>, action: Vec>>>, goto: Vec>) -> Vec>>{ [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = note: #[warn(clippy::explicit_counter_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_counter_loop [INFO] [stderr] [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#implicit_hasher [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/glr_lex.rs:50:32 [INFO] [stderr] | [INFO] [stderr] 50 | for item in line.split("=") { [INFO] [stderr] | ^^^ help: try using a char instead: `'='` [INFO] [stderr] help: consider adding a type parameter [INFO] [stderr] | [INFO] [stderr] 666 | pub fn parse(words: Vec>, action: Vec>, S>>, goto: Vec>) -> Vec>>{ [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: parameter of type `HashSet` should be generalized over different hashers [INFO] [stderr] --> src/glr.rs:666:64 [INFO] [stderr] | [INFO] [stderr] 666 | pub fn parse(words: Vec>, action: Vec>>>, goto: Vec>) -> Vec>>{ [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#implicit_hasher [INFO] [stderr] help: consider adding a type parameter [INFO] [stderr] | [INFO] [stderr] 666 | pub fn parse(words: Vec>, action: Vec, S>>>, goto: Vec>) -> Vec>>{ [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: parameter of type `HashMap` should be generalized over different hashers [INFO] [stderr] --> src/glr.rs:666:101 [INFO] [stderr] | [INFO] [stderr] 666 | pub fn parse(words: Vec>, action: Vec>>>, goto: Vec>) -> Vec>>{ [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#implicit_hasher [INFO] [stderr] help: consider adding a type parameter [INFO] [stderr] | [INFO] [stderr] 666 | pub fn parse(words: Vec>, action: Vec>>>, goto: Vec>) -> Vec>>{ [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: this function has too many arguments (14/7) [INFO] [stderr] --> src/glr.rs:668:5 [INFO] [stderr] | [INFO] [stderr] 668 | / fn _parse(words: Vec>, [INFO] [stderr] 669 | | action: Vec>>>, [INFO] [stderr] 670 | | goto: Vec>, [INFO] [stderr] 671 | | tree_stack: VecDeque>, [INFO] [stderr] ... | [INFO] [stderr] 853 | | paralle_trees [INFO] [stderr] 854 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::too_many_arguments)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#too_many_arguments [INFO] [stderr] [INFO] [stderr] warning: very complex type used. Consider factoring parts into `type` definitions [INFO] [stderr] --> src/glr.rs:704:23 [INFO] [stderr] | [INFO] [stderr] 704 | let (tx, rx): (Sender>>>, Receiver>>>) = mpsc::channel(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#type_complexity [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/glr.rs:720:44 [INFO] [stderr] | [INFO] [stderr] 720 | let __word_index = word_index.clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `word_index` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/glr.rs:724:39 [INFO] [stderr] | [INFO] [stderr] 724 | let __state = state.clone(); [INFO] [stderr] | ^^^^^^^^^^^^^ help: try removing the `clone` call: `state` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] error: this loop never actually loops [INFO] [stderr] --> src/glr.rs:751:21 [INFO] [stderr] | [INFO] [stderr] 751 | / for item in table_items.iter() [INFO] [stderr] 752 | | { [INFO] [stderr] 753 | | table_item = item.clone(); [INFO] [stderr] 754 | | break; [INFO] [stderr] 755 | | } [INFO] [stderr] | |_____________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::never_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#never_loop [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/glr.rs:762:29 [INFO] [stderr] | [INFO] [stderr] 762 | / match op_lr_item { [INFO] [stderr] 763 | | Some(_lr_item) =>{ [INFO] [stderr] 764 | | let symbol = glr_grammar::get_atom_string(_lr_item.symbol.clone()); [INFO] [stderr] 765 | | [INFO] [stderr] ... | [INFO] [stderr] 810 | | None => {} [INFO] [stderr] 811 | | } [INFO] [stderr] | |_____________________________^ [INFO] [stderr] | [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] 762 | if let Some(_lr_item) = op_lr_item { [INFO] [stderr] 763 | let symbol = glr_grammar::get_atom_string(_lr_item.symbol.clone()); [INFO] [stderr] 764 | [INFO] [stderr] 765 | let mut _cut_count = 0u32; [INFO] [stderr] 766 | for item in _lr_item.production.iter() { [INFO] [stderr] 767 | state_stack.pop(); [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/glr.rs:794:49 [INFO] [stderr] | [INFO] [stderr] 794 | / match tree_stack.pop_back() {Some(mut x) => { [INFO] [stderr] 795 | | // x.parent = Some(new_tree_node.downgrade()); [INFO] [stderr] 796 | | tree_node_children.push_front(x); [INFO] [stderr] 797 | | }, None => {}} [INFO] [stderr] | |______________________________________________________________^ [INFO] [stderr] | [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] 794 | if let Some(mut x) = tree_stack.pop_back() { [INFO] [stderr] 795 | // x.parent = Some(new_tree_node.downgrade()); [INFO] [stderr] 796 | tree_node_children.push_front(x); [INFO] [stderr] 797 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: the function has a cyclomatic complexity of 26 [INFO] [stderr] --> src/glr_grammar.rs:27:1 [INFO] [stderr] | [INFO] [stderr] 27 | / pub fn grammar_gen(_grammar_str: &str, terminal_tokens: Rc>) -> Vec>{ [INFO] [stderr] 28 | | let grammar_str = _grammar_str.to_string() + "\n"; [INFO] [stderr] 29 | | let mut ret: Vec> = vec![]; [INFO] [stderr] 30 | | [INFO] [stderr] ... | [INFO] [stderr] 371 | | ret [INFO] [stderr] 372 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cyclomatic_complexity)] on by default [INFO] [stderr] = help: you could split it up into multiple smaller functions [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cyclomatic_complexity [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/glr_grammar.rs:43:52 [INFO] [stderr] | [INFO] [stderr] 43 | fn get_from_cache(orig: &Arc, entry: &Vec>>, cache: &HashMap, Vec>>>) -> Vec>> { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ help: change this to: `&[Vec>]` [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] error: aborting due to previous error [INFO] [stderr] [INFO] [stderr] warning: called `.get_mut().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/glr_grammar.rs:66:37 [INFO] [stderr] | [INFO] [stderr] 66 | new_entry.get_mut(index).unwrap().push(atom.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `new_entry[index]` [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_mut().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/glr_grammar.rs:72:29 [INFO] [stderr] | [INFO] [stderr] 72 | new_entry.get_mut(index).unwrap().push(atom.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `new_entry[index]` [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/glr_grammar.rs:83:12 [INFO] [stderr] | [INFO] [stderr] 83 | if ret.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!ret.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: Could not compile `glr-parser`. [INFO] [stderr] warning: build failed, waiting for other jobs to finish... [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/glr_grammar.rs:171:20 [INFO] [stderr] | [INFO] [stderr] 171 | if word.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!word.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: length comparison to zero [INFO] [stderr] --> src/glr_grammar.rs:185:20 [INFO] [stderr] | [INFO] [stderr] 185 | if word.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!word.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: length comparison to zero [INFO] [stderr] --> src/glr_grammar.rs:223:20 [INFO] [stderr] | [INFO] [stderr] 223 | if word.len() > 0 { // same as above ' ' matching [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!word.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: length comparison to zero [INFO] [stderr] --> src/glr_grammar.rs:260:28 [INFO] [stderr] | [INFO] [stderr] 260 | if word.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!word.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 seem to be trying to use `&Box`. Consider using just `&T` [INFO] [stderr] --> src/glr_grammar.rs:378:90 [INFO] [stderr] | [INFO] [stderr] 378 | fn gen_grammars(prod: Vec>, counter: &mut HashMap, n_count: &mut Box) -> (Vec>, Vec) { [INFO] [stderr] | ^^^^^^^^^^^^^ help: try: `&mut u16` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::borrowed_box)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrowed_box [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/glr_grammar.rs:482:12 [INFO] [stderr] | [INFO] [stderr] 482 | if ret.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `ret.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 seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/glr.rs:58:9 [INFO] [stderr] | [INFO] [stderr] 58 | / match grammars_hashmap.entry(symbol_name) { [INFO] [stderr] 59 | | Occupied(entry) => { [INFO] [stderr] 60 | | entry.into_mut().push(Arc::new(*item)); [INFO] [stderr] 61 | | }, [INFO] [stderr] 62 | | _ => {} [INFO] [stderr] 63 | | } [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] 58 | if let Occupied(entry) = grammars_hashmap.entry(symbol_name) { [INFO] [stderr] 59 | entry.into_mut().push(Arc::new(*item)); [INFO] [stderr] 60 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/glr.rs:75:5 [INFO] [stderr] | [INFO] [stderr] 75 | / loop { [INFO] [stderr] 76 | | let current_symbol = match symbols.pop() {Some(x) => x, None => break}; [INFO] [stderr] 77 | | [INFO] [stderr] 78 | | match *current_symbol { [INFO] [stderr] ... | [INFO] [stderr] 102 | | } [INFO] [stderr] 103 | | } [INFO] [stderr] | |_____^ help: try: `while let Some(x) = symbols.pop() { .. }` [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/glr.rs:166:37 [INFO] [stderr] | [INFO] [stderr] 166 | production: &Vec>, [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: change this to: `&[Arc]` [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/glr.rs:182:40 [INFO] [stderr] | [INFO] [stderr] 182 | if item.production.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `item.production.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/glr.rs:217:37 [INFO] [stderr] | [INFO] [stderr] 217 | production: &Vec>, [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: change this to: `&[Arc]` [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/glr.rs:231:32 [INFO] [stderr] | [INFO] [stderr] 231 | if item.production.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `item.production.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: this loop could be written as a `while let` loop [INFO] [stderr] --> src/glr.rs:261:5 [INFO] [stderr] | [INFO] [stderr] 261 | / loop { [INFO] [stderr] 262 | | let mut loop_item = match working_items.pop() {Some(x) => x, None => break}; [INFO] [stderr] 263 | | [INFO] [stderr] 264 | | if !ret_cache.contains(&loop_item) { [INFO] [stderr] ... | [INFO] [stderr] 332 | | [INFO] [stderr] 333 | | } [INFO] [stderr] | |_____^ help: try: `while let Some(x) = working_items.pop() { .. }` [INFO] [stderr] | [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: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/glr.rs:312:9 [INFO] [stderr] | [INFO] [stderr] 312 | / match grammars_hashmap.get(&symbol_name) { [INFO] [stderr] 313 | | Some(grammer_items) => { [INFO] [stderr] 314 | | for each_grammar in grammer_items.iter() { [INFO] [stderr] 315 | | for each_production in get_real_productions(&grammars_hashmap, &each_grammar.production, &mut real_prod_cache).iter() { [INFO] [stderr] ... | [INFO] [stderr] 330 | | None => {} [INFO] [stderr] 331 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [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] 312 | if let Some(grammer_items) = grammars_hashmap.get(&symbol_name) { [INFO] [stderr] 313 | for each_grammar in grammer_items.iter() { [INFO] [stderr] 314 | for each_production in get_real_productions(&grammars_hashmap, &each_grammar.production, &mut real_prod_cache).iter() { [INFO] [stderr] 315 | for terminal_atom in terminals.iter() { [INFO] [stderr] 316 | let lr_item = Arc::new(LRItem { [INFO] [stderr] 317 | stacktop: 0, [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/glr.rs:367:13 [INFO] [stderr] | [INFO] [stderr] 367 | cc: &Vec>, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: change this to: `&[Arc]` [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: parameter of type `HashMap` should be generalized over different hashers [INFO] [stderr] --> src/glr.rs:426:40 [INFO] [stderr] | [INFO] [stderr] 426 | pub fn create_table(grammars_hashmap: &HashMap>>, initial_item: Arc) -> (Vec>>>, Vec>) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::implicit_hasher)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#implicit_hasher [INFO] [stderr] help: consider adding a type parameter [INFO] [stderr] | [INFO] [stderr] 426 | pub fn create_table(grammars_hashmap: &HashMap>, S>, initial_item: Arc) -> (Vec>>>, Vec>) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: very complex type used. Consider factoring parts into `type` definitions [INFO] [stderr] --> src/glr.rs:426:110 [INFO] [stderr] | [INFO] [stderr] 426 | pub fn create_table(grammars_hashmap: &HashMap>>, initial_item: Arc) -> (Vec>>>, Vec>) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::type_complexity)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#type_complexity [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/glr.rs:476:40 [INFO] [stderr] | [INFO] [stderr] 476 | if item.production.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!item.production.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: this loop could be written as a `while let` loop [INFO] [stderr] --> src/glr.rs:643:9 [INFO] [stderr] | [INFO] [stderr] 643 | / loop { [INFO] [stderr] 644 | | match childrens.pop() { [INFO] [stderr] 645 | | Some(n) => { [INFO] [stderr] 646 | | match n { [INFO] [stderr] ... | [INFO] [stderr] 657 | | } [INFO] [stderr] 658 | | } [INFO] [stderr] | |_________^ help: try: `while let Some(n) = childrens.pop() { .. }` [INFO] [stderr] | [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: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/glr.rs:646:21 [INFO] [stderr] | [INFO] [stderr] 646 | / match n { [INFO] [stderr] 647 | | Some(mut x) => { [INFO] [stderr] 648 | | for item in x { [INFO] [stderr] 649 | | let mut _item = item; [INFO] [stderr] ... | [INFO] [stderr] 653 | | None => {} [INFO] [stderr] 654 | | } [INFO] [stderr] | |_____________________^ [INFO] [stderr] | [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] 646 | if let Some(mut x) = n { [INFO] [stderr] 647 | for item in x { [INFO] [stderr] 648 | let mut _item = item; [INFO] [stderr] 649 | childrens.push(mem::replace(&mut _item.children, None)); [INFO] [stderr] 650 | } [INFO] [stderr] 651 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: parameter of type `HashMap` should be generalized over different hashers [INFO] [stderr] --> src/glr.rs:666:48 [INFO] [stderr] | [INFO] [stderr] 666 | pub fn parse(words: Vec>, action: Vec>>>, goto: Vec>) -> Vec>>{ [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#implicit_hasher [INFO] [stderr] help: consider adding a type parameter [INFO] [stderr] | [INFO] [stderr] 666 | pub fn parse(words: Vec>, action: Vec>, S>>, goto: Vec>) -> Vec>>{ [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: parameter of type `HashSet` should be generalized over different hashers [INFO] [stderr] --> src/glr.rs:666:64 [INFO] [stderr] | [INFO] [stderr] 666 | pub fn parse(words: Vec>, action: Vec>>>, goto: Vec>) -> Vec>>{ [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#implicit_hasher [INFO] [stderr] help: consider adding a type parameter [INFO] [stderr] | [INFO] [stderr] 666 | pub fn parse(words: Vec>, action: Vec, S>>>, goto: Vec>) -> Vec>>{ [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: parameter of type `HashMap` should be generalized over different hashers [INFO] [stderr] --> src/glr.rs:666:101 [INFO] [stderr] | [INFO] [stderr] 666 | pub fn parse(words: Vec>, action: Vec>>>, goto: Vec>) -> Vec>>{ [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#implicit_hasher [INFO] [stderr] help: consider adding a type parameter [INFO] [stderr] | [INFO] [stderr] 666 | pub fn parse(words: Vec>, action: Vec>>>, goto: Vec>) -> Vec>>{ [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: this function has too many arguments (14/7) [INFO] [stderr] --> src/glr.rs:668:5 [INFO] [stderr] | [INFO] [stderr] 668 | / fn _parse(words: Vec>, [INFO] [stderr] 669 | | action: Vec>>>, [INFO] [stderr] 670 | | goto: Vec>, [INFO] [stderr] 671 | | tree_stack: VecDeque>, [INFO] [stderr] ... | [INFO] [stderr] 853 | | paralle_trees [INFO] [stderr] 854 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::too_many_arguments)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#too_many_arguments [INFO] [stderr] [INFO] [stderr] warning: very complex type used. Consider factoring parts into `type` definitions [INFO] [stderr] --> src/glr.rs:704:23 [INFO] [stderr] | [INFO] [stderr] 704 | let (tx, rx): (Sender>>>, Receiver>>>) = mpsc::channel(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#type_complexity [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/glr.rs:720:44 [INFO] [stderr] | [INFO] [stderr] 720 | let __word_index = word_index.clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `word_index` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/glr.rs:724:39 [INFO] [stderr] | [INFO] [stderr] 724 | let __state = state.clone(); [INFO] [stderr] | ^^^^^^^^^^^^^ help: try removing the `clone` call: `state` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] error: this loop never actually loops [INFO] [stderr] --> src/glr.rs:751:21 [INFO] [stderr] | [INFO] [stderr] 751 | / for item in table_items.iter() [INFO] [stderr] 752 | | { [INFO] [stderr] 753 | | table_item = item.clone(); [INFO] [stderr] 754 | | break; [INFO] [stderr] 755 | | } [INFO] [stderr] | |_____________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::never_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#never_loop [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/glr.rs:762:29 [INFO] [stderr] | [INFO] [stderr] 762 | / match op_lr_item { [INFO] [stderr] 763 | | Some(_lr_item) =>{ [INFO] [stderr] 764 | | let symbol = glr_grammar::get_atom_string(_lr_item.symbol.clone()); [INFO] [stderr] 765 | | [INFO] [stderr] ... | [INFO] [stderr] 810 | | None => {} [INFO] [stderr] 811 | | } [INFO] [stderr] | |_____________________________^ [INFO] [stderr] | [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] 762 | if let Some(_lr_item) = op_lr_item { [INFO] [stderr] 763 | let symbol = glr_grammar::get_atom_string(_lr_item.symbol.clone()); [INFO] [stderr] 764 | [INFO] [stderr] 765 | let mut _cut_count = 0u32; [INFO] [stderr] 766 | for item in _lr_item.production.iter() { [INFO] [stderr] 767 | state_stack.pop(); [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/glr.rs:794:49 [INFO] [stderr] | [INFO] [stderr] 794 | / match tree_stack.pop_back() {Some(mut x) => { [INFO] [stderr] 795 | | // x.parent = Some(new_tree_node.downgrade()); [INFO] [stderr] 796 | | tree_node_children.push_front(x); [INFO] [stderr] 797 | | }, None => {}} [INFO] [stderr] | |______________________________________________________________^ [INFO] [stderr] | [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] 794 | if let Some(mut x) = tree_stack.pop_back() { [INFO] [stderr] 795 | // x.parent = Some(new_tree_node.downgrade()); [INFO] [stderr] 796 | tree_node_children.push_front(x); [INFO] [stderr] 797 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: aborting due to previous error [INFO] [stderr] [INFO] [stderr] error: Could not compile `glr-parser`. [INFO] [stderr] [INFO] [stderr] To learn more, run the command again with --verbose. [INFO] running `"docker" "inspect" "9dcf6ebce48164087afc9e84a273849699ff2ad8b8dcfa9c7506c4b82d82e81a"` [INFO] running `"docker" "rm" "-f" "9dcf6ebce48164087afc9e84a273849699ff2ad8b8dcfa9c7506c4b82d82e81a"` [INFO] [stdout] 9dcf6ebce48164087afc9e84a273849699ff2ad8b8dcfa9c7506c4b82d82e81a