From 8ca826b7f7b756098b461e0942ad4cf304ba6d28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Karlas=CC=8C?= Date: Wed, 24 Aug 2016 14:39:01 +0200 Subject: [PATCH] Added support for storing breakpoints as relative paths via optional baseDir parameter in BreakpointStore Save/Load methods --- .../Mono.Debugging.Client/BreakEvent.cs | 12 +++---- .../Mono.Debugging.Client/Breakpoint.cs | 33 ++++++++++++------- .../Mono.Debugging.Client/BreakpointStore.cs | 8 ++--- .../Mono.Debugging.Client/Catchpoint.cs | 6 ++-- .../FunctionBreakpoint.cs | 6 ++-- 5 files changed, 38 insertions(+), 27 deletions(-) diff --git a/Mono.Debugging/Mono.Debugging.Client/BreakEvent.cs b/Mono.Debugging/Mono.Debugging.Client/BreakEvent.cs index b1b264b2f..d731d4d85 100644 --- a/Mono.Debugging/Mono.Debugging.Client/BreakEvent.cs +++ b/Mono.Debugging/Mono.Debugging.Client/BreakEvent.cs @@ -50,7 +50,7 @@ public BreakEvent () { } - internal BreakEvent (XmlElement elem) + internal BreakEvent (XmlElement elem, string baseDir) { string s = elem.GetAttribute ("enabled"); if (s.Length > 0) @@ -85,7 +85,7 @@ internal BreakEvent (XmlElement elem) breakIfConditionChanges = false; } - internal virtual XmlElement ToXml (XmlDocument doc) + internal virtual XmlElement ToXml (XmlDocument doc, string baseDir) { XmlElement elem = doc.CreateElement (GetType().Name); if (!enabled) @@ -108,14 +108,14 @@ internal virtual XmlElement ToXml (XmlDocument doc) return elem; } - internal static BreakEvent FromXml (XmlElement elem) + internal static BreakEvent FromXml (XmlElement elem, string baseDir) { if (elem.Name == "FunctionBreakpoint") - return new FunctionBreakpoint (elem); + return new FunctionBreakpoint (elem, baseDir); if (elem.Name == "Breakpoint") - return new Breakpoint (elem); + return new Breakpoint (elem, baseDir); if (elem.Name == "Catchpoint") - return new Catchpoint (elem); + return new Catchpoint (elem, baseDir); return null; } diff --git a/Mono.Debugging/Mono.Debugging.Client/Breakpoint.cs b/Mono.Debugging/Mono.Debugging.Client/Breakpoint.cs index 741bfd00d..1610baf86 100644 --- a/Mono.Debugging/Mono.Debugging.Client/Breakpoint.cs +++ b/Mono.Debugging/Mono.Debugging.Client/Breakpoint.cs @@ -27,6 +27,7 @@ using System; using System.Xml; +using System.IO; namespace Mono.Debugging.Client { @@ -50,11 +51,16 @@ public Breakpoint (string fileName, int line) : this (fileName, line, 1) { } - internal Breakpoint (XmlElement elem): base (elem) + internal Breakpoint (XmlElement elem, string baseDir) : base (elem, baseDir) { - string s = elem.GetAttribute ("file"); - if (!string.IsNullOrEmpty (s)) - fileName = s; + string s = elem.GetAttribute ("relfile"); + if (!string.IsNullOrEmpty (s) && baseDir != null) { + fileName = Path.Combine (baseDir, s); + } else { + s = elem.GetAttribute ("file"); + if (!string.IsNullOrEmpty (s)) + fileName = s; + } s = elem.GetAttribute ("line"); if (string.IsNullOrEmpty (s) || !int.TryParse (s, out line)) @@ -64,17 +70,22 @@ internal Breakpoint (XmlElement elem): base (elem) if (string.IsNullOrEmpty (s) || !int.TryParse (s, out column)) column = 1; } - - internal override XmlElement ToXml (XmlDocument doc) + + internal override XmlElement ToXml (XmlDocument doc, string baseDir) { - XmlElement elem = base.ToXml (doc); - - if (!string.IsNullOrEmpty (fileName)) + XmlElement elem = base.ToXml (doc, baseDir); + + if (!string.IsNullOrEmpty (fileName)) { elem.SetAttribute ("file", fileName); - + if (baseDir != null) { + if (fileName.StartsWith (baseDir, StringComparison.Ordinal)) + elem.SetAttribute ("relfile", fileName.Substring (baseDir.Length).TrimStart (Path.DirectorySeparatorChar)); + } + } + elem.SetAttribute ("line", line.ToString ()); elem.SetAttribute ("column", column.ToString ()); - + return elem; } diff --git a/Mono.Debugging/Mono.Debugging.Client/BreakpointStore.cs b/Mono.Debugging/Mono.Debugging.Client/BreakpointStore.cs index 83f2b0b1e..46e7787eb 100644 --- a/Mono.Debugging/Mono.Debugging.Client/BreakpointStore.cs +++ b/Mono.Debugging/Mono.Debugging.Client/BreakpointStore.cs @@ -393,27 +393,27 @@ internal void ResetBreakpoints () } } - public XmlElement Save () + public XmlElement Save (string baseDir = null) { XmlDocument doc = new XmlDocument (); XmlElement elem = doc.CreateElement ("BreakpointStore"); foreach (BreakEvent ev in this) { if (ev.NonUserBreakpoint) continue; - XmlElement be = ev.ToXml (doc); + XmlElement be = ev.ToXml (doc, baseDir); elem.AppendChild (be); } return elem; } - public void Load (XmlElement rootElem) + public void Load (XmlElement rootElem, string baseDir = null) { Clear (); foreach (XmlNode n in rootElem.ChildNodes) { XmlElement elem = n as XmlElement; if (elem == null) continue; - BreakEvent ev = BreakEvent.FromXml (elem); + BreakEvent ev = BreakEvent.FromXml (elem, baseDir); if (ev != null) Add (ev); } diff --git a/Mono.Debugging/Mono.Debugging.Client/Catchpoint.cs b/Mono.Debugging/Mono.Debugging.Client/Catchpoint.cs index 21820a7a1..d4a5e38e6 100644 --- a/Mono.Debugging/Mono.Debugging.Client/Catchpoint.cs +++ b/Mono.Debugging/Mono.Debugging.Client/Catchpoint.cs @@ -46,7 +46,7 @@ public Catchpoint (string exceptionName, bool includeSubclasses) this.includeSubclasses = includeSubclasses; } - internal Catchpoint (XmlElement elem): base (elem) + internal Catchpoint (XmlElement elem, string baseDir): base (elem, baseDir) { exceptionName = elem.GetAttribute ("exceptionName"); @@ -57,9 +57,9 @@ internal Catchpoint (XmlElement elem): base (elem) } } - internal override XmlElement ToXml (XmlDocument doc) + internal override XmlElement ToXml (XmlDocument doc, string baseDir) { - XmlElement elem = base.ToXml (doc); + XmlElement elem = base.ToXml (doc, baseDir); elem.SetAttribute ("exceptionName", exceptionName); elem.SetAttribute ("includeSubclasses", includeSubclasses.ToString ()); return elem; diff --git a/Mono.Debugging/Mono.Debugging.Client/FunctionBreakpoint.cs b/Mono.Debugging/Mono.Debugging.Client/FunctionBreakpoint.cs index 58a0127d3..1d2eda4ca 100644 --- a/Mono.Debugging/Mono.Debugging.Client/FunctionBreakpoint.cs +++ b/Mono.Debugging/Mono.Debugging.Client/FunctionBreakpoint.cs @@ -129,7 +129,7 @@ public static bool TryParseParameters (string text, int startIndex, int endIndex return true; } - internal FunctionBreakpoint (XmlElement elem) : base (elem) + internal FunctionBreakpoint (XmlElement elem, string baseDir) : base (elem, baseDir) { FunctionName = elem.GetAttribute ("function"); @@ -152,9 +152,9 @@ internal FunctionBreakpoint (XmlElement elem) : base (elem) FileName = null; } - internal override XmlElement ToXml (XmlDocument doc) + internal override XmlElement ToXml (XmlDocument doc, string baseDir) { - XmlElement elem = base.ToXml (doc); + XmlElement elem = base.ToXml (doc, baseDir); elem.SetAttribute ("function", FunctionName); elem.SetAttribute ("language", Language);