use crate::command_tree::CommandTree; use crate::directive_actions::DirectiveAction; pub fn directives_from_pass_names(pass_names: &[String]) -> CommandTree { let passes_directives: Vec = pass_names .iter() .map(|pass_name| { if pass_name == "parsing" { CommandTree::nonterm( pass_name, None, vec![ CommandTree::nonterm_no_further_tab_completions("compact", None), CommandTree::nonterm_no_further_tab_completions("expanded", None), CommandTree::nonterm_no_further_tab_completions("trace", None), ], ) } else { CommandTree::nonterm_no_further_tab_completions(pass_name, None) } }) .collect(); CommandTree::Top(get_list(&passes_directives, true)) } fn get_list(passes_directives: &[CommandTree], include_help: bool) -> Vec { use DirectiveAction::*; vec![ CommandTree::terminal("exit", Some("exit the REPL"), vec![], QuitProgram), //TODO there should be an alias for this CommandTree::terminal("quit", Some("exit the REPL"), vec![], QuitProgram), CommandTree::terminal( "help", Some("Print this help message"), if include_help { get_list(passes_directives, false) } else { vec![] }, Help, ), CommandTree::nonterm( "debug", Some("Configure debug information"), vec![ CommandTree::terminal( "list-passes", Some("List all registered compiler passes"), vec![], ListPasses, ), CommandTree::nonterm( "total-time", None, vec![ CommandTree::terminal("on", None, vec![], TotalTimeOn), CommandTree::terminal("off", None, vec![], TotalTimeOff), ], ), CommandTree::nonterm( "stage-times", Some("Computation time per-stage"), vec![ CommandTree::terminal("on", None, vec![], StageTimeOn), CommandTree::terminal("off", None, vec![], StageTimeOff), ], ), ], ), CommandTree::terminal( "doc", Some("Get language-specific help for an item"), vec![], Doc, ), ] }