Switch over everything to new directive paradigm
This commit is contained in:
parent
fe08e64860
commit
10bfeab7e4
@ -9,6 +9,14 @@ pub enum DirectiveAction {
|
|||||||
Help,
|
Help,
|
||||||
QuitProgram,
|
QuitProgram,
|
||||||
ListPasses,
|
ListPasses,
|
||||||
|
ShowImmediate,
|
||||||
|
Show,
|
||||||
|
Hide,
|
||||||
|
TotalTimeOff,
|
||||||
|
TotalTimeOn,
|
||||||
|
StageTimeOff,
|
||||||
|
StageTimeOn,
|
||||||
|
Doc,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DirectiveAction {
|
impl DirectiveAction {
|
||||||
@ -36,8 +44,81 @@ impl DirectiveAction {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some(buf)
|
Some(buf)
|
||||||
|
},
|
||||||
|
ShowImmediate => {
|
||||||
|
let cur_state = repl.get_cur_language_state();
|
||||||
|
let stage_name = match arguments.get(1) {
|
||||||
|
Some(s) => s.to_string(),
|
||||||
|
None => return Some(format!("Must specify a thing to debug")),
|
||||||
|
};
|
||||||
|
let meta = LangMetaRequest::ImmediateDebug(DebugAsk::ByStage { stage_name: stage_name.clone() });
|
||||||
|
|
||||||
|
let response = match cur_state.request_meta(meta) {
|
||||||
|
LangMetaResponse::ImmediateDebug(DebugResponse { ask, value }) => {
|
||||||
|
if (ask != DebugAsk::ByStage { stage_name: stage_name }) {
|
||||||
|
return Some(format!("Didn't get debug stage requested"));
|
||||||
}
|
}
|
||||||
|
value
|
||||||
|
},
|
||||||
|
_ => return Some(format!("Invalid language meta response")),
|
||||||
|
};
|
||||||
|
Some(response)
|
||||||
|
},
|
||||||
|
Show => {
|
||||||
|
let stage_name = match arguments.get(0) {
|
||||||
|
Some(s) => s.to_string(),
|
||||||
|
None => return Some(format!("Must specify a stage to show")),
|
||||||
|
};
|
||||||
|
let ask = DebugAsk::ByStage { stage_name };
|
||||||
|
repl.options.debug_asks.insert(ask);
|
||||||
|
None
|
||||||
|
},
|
||||||
|
Hide => {
|
||||||
|
let stage_name = match arguments.get(0) {
|
||||||
|
Some(s) => s.to_string(),
|
||||||
|
None => return Some(format!("Must specify a stage to hide")),
|
||||||
|
};
|
||||||
|
let ask = DebugAsk::ByStage { stage_name };
|
||||||
|
repl.options.debug_asks.remove(&ask);
|
||||||
|
None
|
||||||
|
},
|
||||||
|
TotalTimeOff => total_time_off(repl, arguments),
|
||||||
|
TotalTimeOn => total_time_on(repl, arguments),
|
||||||
|
StageTimeOff => stage_time_off(repl, arguments),
|
||||||
|
StageTimeOn => stage_time_on(repl, arguments),
|
||||||
|
Doc => doc(repl, arguments),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn total_time_on(repl: &mut Repl, _: &[&str]) -> InterpreterDirectiveOutput {
|
||||||
|
repl.options.show_total_time = true;
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
fn total_time_off(repl: &mut Repl, _: &[&str]) -> InterpreterDirectiveOutput {
|
||||||
|
repl.options.show_total_time = false;
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
fn stage_time_on(repl: &mut Repl, _: &[&str]) -> InterpreterDirectiveOutput {
|
||||||
|
repl.options.show_stage_times = true;
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
fn stage_time_off(repl: &mut Repl, _: &[&str]) -> InterpreterDirectiveOutput {
|
||||||
|
repl.options.show_stage_times = false;
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
fn doc(repl: &mut Repl, arguments: &[&str]) -> InterpreterDirectiveOutput {
|
||||||
|
arguments.get(0).map(|cmd| {
|
||||||
|
let source = cmd.to_string();
|
||||||
|
let meta = LangMetaRequest::Docs { source };
|
||||||
|
let cur_state = repl.get_cur_language_state();
|
||||||
|
match cur_state.request_meta(meta) {
|
||||||
|
LangMetaResponse::Docs { doc_string } => Some(doc_string),
|
||||||
|
_ => Some(format!("Invalid doc response"))
|
||||||
|
}
|
||||||
|
}).unwrap_or(Some(format!(":docs needs an argument")))
|
||||||
|
}
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
use std::fmt::Write as FmtWrite;
|
use std::fmt::Write as FmtWrite;
|
||||||
use itertools::Itertools;
|
|
||||||
|
|
||||||
use crate::repl::Repl;
|
use crate::repl::Repl;
|
||||||
use crate::repl::command_tree::CommandTree;
|
use crate::repl::command_tree::CommandTree;
|
||||||
@ -22,60 +21,16 @@ pub fn directives_from_pass_names(pass_names: &Vec<String>) -> CommandTree {
|
|||||||
Some("Configure debug information"),
|
Some("Configure debug information"),
|
||||||
vec![
|
vec![
|
||||||
CommandTree::terminal_act("list-passes", Some("List all registered compiler passes"), vec![], ListPasses),
|
CommandTree::terminal_act("list-passes", Some("List all registered compiler passes"), vec![], ListPasses),
|
||||||
CommandTree::terminal("show-immediate", None, passes_directives.clone(),
|
CommandTree::terminal_act("show-immediate", None, passes_directives.clone(), ShowImmediate),
|
||||||
Box::new(|repl: &mut Repl, cmds: &[&str]| {
|
CommandTree::terminal_act("show", None, passes_directives.clone(), Show),
|
||||||
let cur_state = repl.get_cur_language_state();
|
CommandTree::terminal_act("hide", None, passes_directives.clone(), Hide),
|
||||||
let stage_name = match cmds.get(1) {
|
|
||||||
Some(s) => s.to_string(),
|
|
||||||
None => return Some(format!("Must specify a thing to debug")),
|
|
||||||
};
|
|
||||||
let meta = LangMetaRequest::ImmediateDebug(DebugAsk::ByStage { stage_name: stage_name.clone() });
|
|
||||||
|
|
||||||
let response = match cur_state.request_meta(meta) {
|
|
||||||
LangMetaResponse::ImmediateDebug(DebugResponse { ask, value }) => {
|
|
||||||
if (ask != DebugAsk::ByStage { stage_name: stage_name }) {
|
|
||||||
return Some(format!("Didn't get debug stage requested"));
|
|
||||||
}
|
|
||||||
value
|
|
||||||
},
|
|
||||||
_ => return Some(format!("Invalid language meta response")),
|
|
||||||
};
|
|
||||||
Some(response)
|
|
||||||
})),
|
|
||||||
CommandTree::terminal("show", None, passes_directives.clone(), Box::new(|repl: &mut Repl, cmds: &[&str]| {
|
|
||||||
let stage_name = match cmds.get(0) {
|
|
||||||
Some(s) => s.to_string(),
|
|
||||||
None => return Some(format!("Must specify a stage to show")),
|
|
||||||
};
|
|
||||||
let ask = DebugAsk::ByStage { stage_name };
|
|
||||||
repl.options.debug_asks.insert(ask);
|
|
||||||
None
|
|
||||||
})),
|
|
||||||
CommandTree::terminal("hide", None, passes_directives.clone(), Box::new(|repl: &mut Repl, cmds: &[&str]| {
|
|
||||||
let stage_name = match cmds.get(0) {
|
|
||||||
Some(s) => s.to_string(),
|
|
||||||
None => return Some(format!("Must specify a stage to hide")),
|
|
||||||
};
|
|
||||||
let ask = DebugAsk::ByStage { stage_name };
|
|
||||||
repl.options.debug_asks.remove(&ask);
|
|
||||||
None
|
|
||||||
})),
|
|
||||||
CommandTree::nonterm("total-time", None, vec![
|
CommandTree::nonterm("total-time", None, vec![
|
||||||
CommandTree::terminal("on", None, vec![], Box::new(|repl: &mut Repl, _: &[&str]| {
|
CommandTree::terminal_act("on", None, vec![], TotalTimeOn),
|
||||||
repl.options.show_total_time = true;
|
CommandTree::terminal_act("off", None, vec![], TotalTimeOff),
|
||||||
None
|
|
||||||
})),
|
|
||||||
CommandTree::terminal("off", None, vec![], Box::new(turn_off)),
|
|
||||||
]),
|
]),
|
||||||
CommandTree::nonterm("stage-times", Some("Computation time per-stage"), vec![
|
CommandTree::nonterm("stage-times", Some("Computation time per-stage"), vec![
|
||||||
CommandTree::terminal("on", None, vec![], Box::new(|repl: &mut Repl, _: &[&str]| {
|
CommandTree::terminal_act("on", None, vec![], StageTimeOn),
|
||||||
repl.options.show_stage_times = true;
|
CommandTree::terminal_act("off", None, vec![], StageTimeOff),
|
||||||
None
|
|
||||||
})),
|
|
||||||
CommandTree::terminal("off", None, vec![], Box::new(|repl: &mut Repl, _: &[&str]| {
|
|
||||||
repl.options.show_stage_times = false;
|
|
||||||
None
|
|
||||||
})),
|
|
||||||
])
|
])
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
@ -87,21 +42,7 @@ pub fn directives_from_pass_names(pass_names: &Vec<String>) -> CommandTree {
|
|||||||
CommandTree::nonterm("go", None, vec![]),
|
CommandTree::nonterm("go", None, vec![]),
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
CommandTree::terminal("doc", Some("Get language-specific help for an item"), vec![], Box::new(|repl: &mut Repl, cmds: &[&str]| {
|
CommandTree::terminal_act("doc", Some("Get language-specific help for an item"), vec![], Doc),
|
||||||
cmds.get(0).map(|cmd| {
|
|
||||||
let source = cmd.to_string();
|
|
||||||
let meta = LangMetaRequest::Docs { source };
|
|
||||||
let cur_state = repl.get_cur_language_state();
|
|
||||||
match cur_state.request_meta(meta) {
|
|
||||||
LangMetaResponse::Docs { doc_string } => Some(doc_string),
|
|
||||||
_ => Some(format!("Invalid doc response"))
|
|
||||||
}
|
|
||||||
}).unwrap_or(Some(format!(":docs needs an argument")))
|
|
||||||
}))
|
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn turn_off(repl: &mut Repl, _cmds: &[&str]) -> Option<String> {
|
|
||||||
repl.options.show_total_time = false;
|
|
||||||
None
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user