in src/csharp/MonoDebugSession.cs [523:590]
public override void SetBreakpoints(Response response, dynamic args)
{
string path = null;
if (args.source != null) {
string p = (string)args.source.path;
if (p != null && p.Trim().Length > 0) {
path = p;
}
}
if (path == null) {
SendErrorResponse(response, 3010, "setBreakpoints: property 'source' is empty or misformed", null, false, true);
return;
}
path = ConvertClientPathToDebugger(path);
if (!HasMonoExtension(path)) {
// we only support breakpoints in files mono can handle
SendResponse(response, new SetBreakpointsResponseBody());
return;
}
var clientLines = args.lines.ToObject<int[]>();
HashSet<int> lin = new HashSet<int>();
for (int i = 0; i < clientLines.Length; i++) {
lin.Add(ConvertClientLineToDebugger(clientLines[i]));
}
// find all breakpoints for the given path and remember their id and line number
var bpts = new List<Tuple<int, int>>();
foreach (var be in _breakpoints) {
var bp = be.Value as Mono.Debugging.Client.Breakpoint;
if (bp != null && bp.FileName == path) {
bpts.Add(new Tuple<int,int>((int)be.Key, (int)bp.Line));
}
}
HashSet<int> lin2 = new HashSet<int>();
foreach (var bpt in bpts) {
if (lin.Contains(bpt.Item2)) {
lin2.Add(bpt.Item2);
}
else {
// Program.Log("cleared bpt #{0} for line {1}", bpt.Item1, bpt.Item2);
BreakEvent b;
if (_breakpoints.TryGetValue(bpt.Item1, out b)) {
_breakpoints.Remove(bpt.Item1);
_session.Breakpoints.Remove(b);
}
}
}
for (int i = 0; i < clientLines.Length; i++) {
var l = ConvertClientLineToDebugger(clientLines[i]);
if (!lin2.Contains(l)) {
var id = _nextBreakpointId++;
_breakpoints.Add(id, _session.Breakpoints.Add(path, l));
// Program.Log("added bpt #{0} for line {1}", id, l);
}
}
var breakpoints = new List<Breakpoint>();
foreach (var l in clientLines) {
breakpoints.Add(new Breakpoint(true, l));
}
SendResponse(response, new SetBreakpointsResponseBody(breakpoints));
}