Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey Stedfast <jestedfa@microsoft.com>2019-06-04 23:25:35 +0300
committerJeffrey Stedfast <jestedfa@microsoft.com>2019-06-05 16:37:51 +0300
commita94aba185efcb7fd3aa2f977ba241623a4197dc9 (patch)
treec13fcd93dda0bfce4c690e5712fea4535166f16c /main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.VSTextView
parent794d45c338a9372744c70849e5f7081100929b64 (diff)
[Debugger] Added new breakpoint span resolver for C#
Fixes https://devdiv.visualstudio.com/DevDiv/_workitems/edit/887700/
Diffstat (limited to 'main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.VSTextView')
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.VSTextView/BreakpointManager.cs43
1 files changed, 27 insertions, 16 deletions
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.VSTextView/BreakpointManager.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.VSTextView/BreakpointManager.cs
index f3f690e450..93058fe629 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.VSTextView/BreakpointManager.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.VSTextView/BreakpointManager.cs
@@ -37,15 +37,17 @@ namespace MonoDevelop.Debugger
void TextBuffer_Changed (object sender, TextContentChangedEventArgs e)
{
foreach (var breakpoint in breakpoints.Values) {
- var newSpan = breakpoint.TrackingSpan.GetSpan (e.After);
- if (newSpan.IsEmpty) {
+ var span = breakpoint.TrackingSpan.GetSpan (e.After);
+
+ if (span.IsEmpty || string.IsNullOrWhiteSpace (span.GetText ())) {
DebuggingService.Breakpoints.Remove (breakpoint.Breakpoint);
continue;
}
- var newLineNumber = e.After.GetLineFromPosition (newSpan.Start).LineNumber + 1;
- if (breakpoint.Breakpoint.Line != newLineNumber) {
+
+ var newLineNumber = e.After.GetLineFromPosition (span.Start).LineNumber + 1;
+
+ if (breakpoint.Breakpoint.Line != newLineNumber)
DebuggingService.Breakpoints.UpdateBreakpointLine (breakpoint.Breakpoint, newLineNumber);
- }
}
}
@@ -58,38 +60,47 @@ namespace MonoDevelop.Debugger
private Dictionary<Breakpoint, ManagerBreakpoint> breakpoints = new Dictionary<Breakpoint, ManagerBreakpoint> ();
- private void OnBreakpointsChanged (object sender, EventArgs eventArgs)
+ private async void OnBreakpointsChanged (object sender, EventArgs eventArgs)
{
- var snapshot = textBuffer.CurrentSnapshot;
var newBreakpoints = new Dictionary<Breakpoint, ManagerBreakpoint> ();
- bool needsUpdate = false;
+ var snapshot = textBuffer.CurrentSnapshot;
+ var needsUpdate = false;
+
foreach (var breakpoint in DebuggingService.Breakpoints.GetBreakpointsAtFile (textDocument.FilePath)) {
if (breakpoint.Line > snapshot.LineCount)
continue;
+
if (eventArgs is BreakpointEventArgs breakpointEventArgs && breakpointEventArgs.Breakpoint == breakpoint)
needsUpdate = true;
- var newSpan = snapshot.GetLineFromLineNumber (breakpoint.Line - 1).Extent;
+
+ var line = snapshot.GetLineFromLineNumber (breakpoint.Line - 1);
+ var position = line.Start.Position + breakpoint.Column;
+ var span = await DebuggingService.GetBreakpointSpanAsync (textDocument, position);
+
if (breakpoints.TryGetValue (breakpoint, out var existingBreakpoint)) {
newBreakpoints.Add (breakpoint, existingBreakpoint);
- if (existingBreakpoint.Span != newSpan.Span) {
- // Update if anything was modifed
+ if (existingBreakpoint.Span != span) {
+ // Update if anything was modified
+ existingBreakpoint.Span = span;
needsUpdate = true;
- existingBreakpoint.Span = newSpan.Span;
}
} else {
// Update if anything was added
- needsUpdate = true;
- newBreakpoints.Add (breakpoint, new ManagerBreakpoint () {
+ newBreakpoints.Add (breakpoint, new ManagerBreakpoint {
Breakpoint = breakpoint,
- TrackingSpan = snapshot.CreateTrackingSpan (newSpan, SpanTrackingMode.EdgeExclusive),
- Span = newSpan.Span
+ TrackingSpan = snapshot.CreateTrackingSpan (span, SpanTrackingMode.EdgeExclusive),
+ Span = span
});
+ needsUpdate = true;
}
}
+
// Update if anything was removed
if (needsUpdate || breakpoints.Keys.Except (newBreakpoints.Keys).Any ())
needsUpdate = true;
+
breakpoints = newBreakpoints;
+
if (needsUpdate)
BreakpointsChanged?.Invoke (this, new SnapshotSpanEventArgs (new SnapshotSpan (snapshot, 0, snapshot.Length)));
}