diff --git a/debugger/src/internals.rs b/debugger/src/internals.rs index 46dc1b3b..a64ca716 100644 --- a/debugger/src/internals.rs +++ b/debugger/src/internals.rs @@ -1,5 +1,5 @@ use anyhow::Context; -use std::collections::HashMap; +use std::{collections::HashMap, path::PathBuf}; use transport::{ requests, responses, types::{Source, SourceBreakpoint, ThreadId}, @@ -156,34 +156,46 @@ impl DebuggerInternals { return Ok(()); } - let first_breakpoint = self.breakpoints.values().next().unwrap(); - - let req = requests::RequestBody::SetBreakpoints(requests::SetBreakpoints { - source: Source { - name: first_breakpoint.name.clone(), - path: Some(first_breakpoint.path.clone()), + // group breakpoints by source file and send in multiple batches + let breakpoints_by_source = self.breakpoints_by_source(); + + for (source, breakpoints) in &breakpoints_by_source { + let req = requests::RequestBody::SetBreakpoints(requests::SetBreakpoints { + source: Source { + name: Some(source.display().to_string()), + path: Some(source.clone()), + ..Default::default() + }, + lines: Some(breakpoints.iter().map(|b| b.line).collect()), + breakpoints: Some( + breakpoints + .iter() + .map(|b| SourceBreakpoint { + line: b.line, + ..Default::default() + }) + .collect(), + ), ..Default::default() - }, - lines: Some(self.breakpoints.values().map(|b| b.line).collect()), - breakpoints: Some( - self.breakpoints - .values() - .map(|b| SourceBreakpoint { - line: b.line, - ..Default::default() - }) - .collect(), - ), - ..Default::default() - }); - - let _ = self - .client - .send(req) - .context("broadcasting breakpoints to debugee")?; + }); + + let _ = self + .client + .send(req) + .context("broadcasting breakpoints to debugee")?; + } Ok(()) } + fn breakpoints_by_source(&self) -> HashMap> { + let mut out = HashMap::new(); + for breakpoint in self.breakpoints.values() { + let file_breakpoints = out.entry(breakpoint.path.clone()).or_insert(Vec::new()); + file_breakpoints.push(breakpoint.clone()); + } + out + } + fn next_id(&mut self) -> BreakpointId { self.current_breakpoint_id += 1; self.current_breakpoint_id