diff --git a/src/AddIns/Debugger/Debugger.AddIn/Service/WindowsDebugger.cs b/src/AddIns/Debugger/Debugger.AddIn/Service/WindowsDebugger.cs index cacfef1084..30e4b2f892 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Service/WindowsDebugger.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Service/WindowsDebugger.cs @@ -774,8 +774,6 @@ namespace ICSharpCode.SharpDevelop.Services int[] ilRanges; int methodToken; if (debuggerDecompilerService.GetILAndTokenByLineNumber(token, dbb.LineNumber, out ilRanges, out methodToken)) { - dbb.ILFrom = ilRanges[0]; - dbb.ILTo = ilRanges[1]; // create BP breakpoint = new ILBreakpoint( debugger, @@ -783,7 +781,7 @@ namespace ICSharpCode.SharpDevelop.Services dbb.LineNumber, memberReference.MetadataToken.ToInt32(), methodToken, - dbb.ILFrom, + ilRanges[0], dbb.IsEnabled); debugger.Breakpoints.Add(breakpoint); diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs index 69ebc08bb2..b278a53c3d 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs @@ -235,17 +235,16 @@ namespace ICSharpCode.AvalonEdit.AddIn // no bookmark on the line: create a new breakpoint ITextEditor textEditor = TextView.Services.GetService(typeof(ITextEditor)) as ITextEditor; if (textEditor != null) { - DebuggerService.ToggleBreakpointAt(textEditor, line); + DebuggerService.ToggleBreakpointAt(textEditor, line, typeof(BreakpointBookmark)); return; } // create breakpoint for the other posible active contents var viewContent = WorkbenchSingleton.Workbench.ActiveContent as AbstractViewContentWithoutFile; - if (viewContent != null && viewContent.Tag is MemberReference) { - var memberReference = (MemberReference)viewContent.Tag; + if (viewContent != null) { textEditor = viewContent.Services.GetService(typeof(ITextEditor)) as ITextEditor; if (textEditor != null) { - DebuggerService.ToggleBreakpointAt(memberReference, textEditor, line); + DebuggerService.ToggleBreakpointAt(textEditor, line, typeof(DecompiledBreakpointBookmark)); return; } } diff --git a/src/AddIns/DisplayBindings/ILSpyAddIn/DebuggerDecompilerService.cs b/src/AddIns/DisplayBindings/ILSpyAddIn/DebuggerDecompilerService.cs index 970c71efc3..f74d8c3122 100644 --- a/src/AddIns/DisplayBindings/ILSpyAddIn/DebuggerDecompilerService.cs +++ b/src/AddIns/DisplayBindings/ILSpyAddIn/DebuggerDecompilerService.cs @@ -10,6 +10,7 @@ using ICSharpCode.Decompiler.Ast; using ICSharpCode.Decompiler.ILAst; using ICSharpCode.ILSpyAddIn.LaunchILSpy; using ICSharpCode.SharpDevelop.Debugging; +using ICSharpCode.SharpDevelop.Project; using Mono.Cecil; namespace ICSharpCode.ILSpyAddIn @@ -24,6 +25,7 @@ namespace ICSharpCode.ILSpyAddIn static DebuggerDecompilerService() { DebugInformation = new ConcurrentDictionary(); + ProjectService.SolutionClosed += delegate { DebugInformation.Clear(); }; } internal static IDebuggerDecompilerService Instance { get; private set; } diff --git a/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs b/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs index 75b2faa3d1..beffdd4c0e 100644 --- a/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs +++ b/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs @@ -11,8 +11,6 @@ using ICSharpCode.Decompiler; using ICSharpCode.Decompiler.Ast; using ICSharpCode.ILSpyAddIn.LaunchILSpy; using ICSharpCode.ILSpyAddIn.ViewContent; -using ICSharpCode.NRefactory.CSharp; -using ICSharpCode.NRefactory.Utils; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Debugging; @@ -41,6 +39,8 @@ namespace ICSharpCode.ILSpyAddIn readonly CodeView codeView; readonly CancellationTokenSource cancellation = new CancellationTokenSource(); + MemberReference decompiledType; + #region Constructor public DecompiledViewContent(string assemblyFile, string fullTypeName, string entityTag) { @@ -86,14 +86,6 @@ namespace ICSharpCode.ILSpyAddIn get { return true; } } - public MemberReference MemberReference { - get; private set; - } - - public override object Tag { - get { return MemberReference; } - } - #endregion #region Dispose @@ -176,17 +168,13 @@ namespace ICSharpCode.ILSpyAddIn astBuilder.GenerateCode(textOutput); // save decompilation data - var nodes = TreeTraversal - .PreOrder((AstNode)astBuilder.CompilationUnit, n => n.Children) - .Where(n => n is AttributedNode && n.Annotation>() != null); - MemberReference = typeDefinition; + decompiledType = typeDefinition; - int token = MemberReference.MetadataToken.ToInt32(); + int token = decompiledType.MetadataToken.ToInt32(); var info = new DecompileInformation { CodeMappings = astBuilder.CodeMappings, LocalVariables = astBuilder.LocalVariables, - DecompiledMemberReferences = astBuilder.DecompiledMemberReferences, - AstNodes = nodes + DecompiledMemberReferences = astBuilder.DecompiledMemberReferences }; // save the data @@ -227,10 +215,10 @@ namespace ICSharpCode.ILSpyAddIn { if (!DebuggerService.IsDebuggerStarted) return; - if (MemberReference == null || MemberReference.MetadataToken == null) + if (decompiledType == null || decompiledType.MetadataToken == null) return; - int typeToken = MemberReference.MetadataToken.ToInt32(); + int typeToken = decompiledType.MetadataToken.ToInt32(); if (!DebuggerDecompilerService.DebugInformation.ContainsKey(typeToken)) return; var decompilerService = DebuggerDecompilerService.Instance; diff --git a/src/Main/Base/Project/Src/Bookmarks/BookmarkConverter.cs b/src/Main/Base/Project/Src/Bookmarks/BookmarkConverter.cs index 5ae0660ec2..5424a6551d 100644 --- a/src/Main/Base/Project/Src/Bookmarks/BookmarkConverter.cs +++ b/src/Main/Base/Project/Src/Bookmarks/BookmarkConverter.cs @@ -56,10 +56,8 @@ namespace ICSharpCode.SharpDevelop.Bookmarks action = (Debugging.BreakpointAction)Enum.Parse(typeof(Debugging.BreakpointAction), v[5]); scriptLanguage = v[6]; script = v[7]; - int ilfrom = Convert.ToInt32(v[8]); - int ilto = Convert.ToInt32(v[9]); - bbm = new DecompiledBreakpointBookmark(null, ilfrom, ilto, fileName, new Location(columnNumber, lineNumber), action, scriptLanguage, script); + bbm = new DecompiledBreakpointBookmark(fileName, new Location(columnNumber, lineNumber), action, scriptLanguage, script); bbm.IsEnabled = bool.Parse(v[4]); bbm.Action = action; bbm.ScriptLanguage = scriptLanguage; @@ -126,10 +124,6 @@ namespace ICSharpCode.SharpDevelop.Bookmarks b.Append(bbm.ScriptLanguage); b.Append('|'); b.Append(bbm.Condition); - b.Append('|'); - b.Append(bbm.ILFrom); - b.Append('|'); - b.Append(bbm.ILTo); } else if (bookmark is Debugging.BreakpointBookmark) { var bbm = (Debugging.BreakpointBookmark)bookmark; b.Append('|'); diff --git a/src/Main/Base/Project/Src/Commands/DebugCommands.cs b/src/Main/Base/Project/Src/Commands/DebugCommands.cs index 4e3d89e78f..2ea7f29f88 100644 --- a/src/Main/Base/Project/Src/Commands/DebugCommands.cs +++ b/src/Main/Base/Project/Src/Commands/DebugCommands.cs @@ -121,18 +121,20 @@ namespace ICSharpCode.SharpDevelop.Project.Commands { var viewContent = WorkbenchSingleton.Workbench.ActiveContent; ITextEditorProvider provider = viewContent as ITextEditorProvider; + ITextEditor editor = null; if (provider != null) { - ITextEditor editor = provider.TextEditor; + editor = provider.TextEditor; if (!string.IsNullOrEmpty(editor.FileName)) { - DebuggerService.ToggleBreakpointAt(editor, editor.Caret.Line); + DebuggerService.ToggleBreakpointAt(editor, editor.Caret.Line, typeof(BreakpointBookmark)); } } else { - if (viewContent is AbstractViewContentWithoutFile) { - dynamic codeView = ((AbstractViewContentWithoutFile)viewContent).Control; - var editor = codeView.TextEditor as ITextEditor; - if (editor != null && !string.IsNullOrEmpty(editor.FileName)) - DebuggerService.ToggleBreakpointAt(editor, editor.Caret.Line); + var view = viewContent as AbstractViewContentWithoutFile; + if (view != null) { + editor = view.GetService(typeof(ITextEditor)) as ITextEditor; + if (editor != null) { + DebuggerService.ToggleBreakpointAt(editor, editor.Caret.Line, typeof(DecompiledBreakpointBookmark)); + } } } } diff --git a/src/Main/Base/Project/Src/Gui/AbstractViewContentWithoutFile.cs b/src/Main/Base/Project/Src/Gui/AbstractViewContentWithoutFile.cs index 274e5d58f9..c7e7340f2c 100644 --- a/src/Main/Base/Project/Src/Gui/AbstractViewContentWithoutFile.cs +++ b/src/Main/Base/Project/Src/Gui/AbstractViewContentWithoutFile.cs @@ -16,13 +16,6 @@ namespace ICSharpCode.SharpDevelop.Gui /// public abstract class AbstractViewContentWithoutFile : AbstractViewContent, ICustomizedCommands { - /// - /// Gets specific information (from implementations) regarding this view content. - /// - public virtual object Tag { - get { return null; } - } - public override bool IsViewOnly { get { return false; } } diff --git a/src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs b/src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs index fbfd2a379f..26be9ea858 100644 --- a/src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs +++ b/src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs @@ -3,7 +3,6 @@ using System; using System.Windows.Media; -using ICSharpCode.AvalonEdit.Document; using ICSharpCode.Core; using ICSharpCode.NRefactory; using ICSharpCode.SharpDevelop.Bookmarks; diff --git a/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs b/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs index b6cbc79038..70253c545e 100644 --- a/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs +++ b/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs @@ -3,9 +3,7 @@ using System; using System.Collections.Generic; -using System.IO; using System.Text; -using System.Windows; using System.Windows.Forms; using ICSharpCode.Core; @@ -226,22 +224,29 @@ namespace ICSharpCode.SharpDevelop.Debugging } } - public static void ToggleBreakpointAt(ITextEditor editor, int lineNumber) + /// + /// Toggles a breakpoint bookmark. + /// + /// Text editor where the bookmark is toggled. + /// Line number. + /// Type of breakpoint bookmark. + /// Optional constructor parameters. + public static void ToggleBreakpointAt(ITextEditor editor, int lineNumber, Type breakpointType, object[] parameters = null) { + if (editor == null) + throw new ArgumentNullException("editor"); + + if (breakpointType == null) + throw new ArgumentNullException("breakpointType"); + + if (!typeof(BreakpointBookmark).IsAssignableFrom(breakpointType)) + throw new ArgumentException("breakpointType is not a BreakpointBookmark"); + BookmarkManager.ToggleBookmark( editor, lineNumber, b => b.CanToggle && b is BreakpointBookmark, - location => new BreakpointBookmark(editor.FileName, location, BreakpointAction.Break, "", "")); - } - - public static void ToggleBreakpointAt(MemberReference memberReference, ITextEditor editor, int lineNumber) - { - // no bookmark on the line: create a new breakpoint - BookmarkManager.ToggleBookmark( - editor, lineNumber, - b => b.CanToggle, - location => new DecompiledBreakpointBookmark( - memberReference, 0, 0, editor.FileName, location, BreakpointAction.Break, "", "")); + location => (BreakpointBookmark)Activator.CreateInstance(breakpointType, + parameters ?? new object[] { editor.FileName, location, BreakpointAction.Break, "", ""})); } /* TODO: reimplement this stuff diff --git a/src/Main/Base/Project/Src/Services/Debugger/DecompiledBreakpointBookmark.cs b/src/Main/Base/Project/Src/Services/Debugger/DecompiledBreakpointBookmark.cs index 72a6273c10..a7a3175a26 100644 --- a/src/Main/Base/Project/Src/Services/Debugger/DecompiledBreakpointBookmark.cs +++ b/src/Main/Base/Project/Src/Services/Debugger/DecompiledBreakpointBookmark.cs @@ -15,19 +15,10 @@ namespace ICSharpCode.SharpDevelop.Bookmarks MemberReference memberReference; string assemblyFile; - public DecompiledBreakpointBookmark(MemberReference member, int ilFrom, int ilTo, FileName fileName, Location location, BreakpointAction action, string scriptLanguage, string script) : base(fileName, location, action, scriptLanguage, script) + public DecompiledBreakpointBookmark(FileName fileName, Location location, BreakpointAction action, string scriptLanguage, string script) + : base(fileName, location, action, scriptLanguage, script) { - this.memberReference = member; - this.ILFrom = ilFrom; - this.ILTo = ILTo; - } - - public int ILFrom { - get; set; - } - - public int ILTo { - get; set; + } public MemberReference MemberReference {