From 572e95e070dd8c8594dbc2b6d0ca34f643f3a41a Mon Sep 17 00:00:00 2001 From: Tad Hardesty Date: Sat, 30 Nov 2019 19:39:33 -0800 Subject: [PATCH] Pass a Context to the debugger --- src/dreammaker/error.rs | 10 ++++++++++ src/langserver/debugger/mod.rs | 26 ++++++++++++++++++++------ src/langserver/main.rs | 2 +- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/dreammaker/error.rs b/src/dreammaker/error.rs index 86008aa4..3f5038ff 100644 --- a/src/dreammaker/error.rs +++ b/src/dreammaker/error.rs @@ -174,6 +174,16 @@ impl Context { panic!("there were parse errors"); } } + + /// Clone the file list of this Context but not its error list. + pub fn clone_file_list(&self) -> Context { + Context { + files: self.files.clone(), + reverse_files: self.reverse_files.clone(), + errors: Default::default(), + print_severity: Default::default(), + } + } } // ---------------------------------------------------------------------------- diff --git a/src/langserver/debugger/mod.rs b/src/langserver/debugger/mod.rs index 5d38ee9f..e9b64d9d 100644 --- a/src/langserver/debugger/mod.rs +++ b/src/langserver/debugger/mod.rs @@ -37,7 +37,7 @@ use self::dap_types::*; use self::launched::Launched; use self::extools::Extools; -pub fn start_server(dreamseeker_exe: String, objtree: Arc) -> std::io::Result { +pub fn start_server(dreamseeker_exe: String, objtree: Arc, ctx: dm::Context) -> std::io::Result { use std::net::*; let listener = TcpListener::bind((Ipv4Addr::LOCALHOST, 0))?; @@ -51,7 +51,11 @@ pub fn start_server(dreamseeker_exe: String, objtree: Arc) -> std::i drop(listener); let mut input = std::io::BufReader::new(stream.try_clone().unwrap()); - let mut debugger = Debugger::new(dreamseeker_exe, objtree, Box::new(stream)); + let db = DebugDatabase { + files: Arc::new(ctx), + objtree, + }; + let mut debugger = Debugger::new(dreamseeker_exe, db, Box::new(stream)); jrpc_io::run_with_read(&mut input, |message| debugger.handle_input(message)); })?; @@ -84,13 +88,23 @@ pub fn debugger_main>(mut args: I) { Arc::new(parser.parse_object_tree()) }; - let mut debugger = Debugger::new(dreamseeker_exe, objtree, Box::new(std::io::stdout())); + let db = DebugDatabase { + files: Arc::new(ctx), + objtree, + }; + let mut debugger = Debugger::new(dreamseeker_exe, db, Box::new(std::io::stdout())); jrpc_io::run_forever(|message| debugger.handle_input(message)); } +#[derive(Clone)] +struct DebugDatabase { + files: Arc, + objtree: Arc, +} + struct Debugger { dreamseeker_exe: String, - objtree: Arc, + db: DebugDatabase, launched: Option, extools: Option, @@ -99,10 +113,10 @@ struct Debugger { } impl Debugger { - fn new(dreamseeker_exe: String, objtree: Arc, stream: OutStream) -> Self { + fn new(dreamseeker_exe: String, db: DebugDatabase, stream: OutStream) -> Self { Debugger { dreamseeker_exe, - objtree, + db, launched: None, extools: None, diff --git a/src/langserver/main.rs b/src/langserver/main.rs index 360e6284..bf9a9515 100644 --- a/src/langserver/main.rs +++ b/src/langserver/main.rs @@ -1578,7 +1578,7 @@ handle_method_call! { // debugger entry point on StartDebugger(&mut self, params) { extras::StartDebuggerResult { - port: debugger::start_server(params.dreamseeker_exe, self.objtree.clone()).map_err(invalid_request)?, + port: debugger::start_server(params.dreamseeker_exe, self.objtree.clone(), self.context.clone_file_list()).map_err(invalid_request)?, } } }