From f4bc253e89b6f6f880d7f1227f8343b4330d1d2d Mon Sep 17 00:00:00 2001 From: Eusebiu Marcu Date: Thu, 24 Feb 2011 12:29:51 +0200 Subject: [PATCH] first workable debugger --- .../NRefactory/Ast/ExpressionExtensionMethods.cs | 6 +++--- .../AvalonEdit/TextEditorWeakEventManager.cs | 13 +++++++++++++ .../Services/Debugger/DebuggerService.cs | 6 +++++- .../ILSpy.Debugger/ToolTips/TextEditorListener.cs | 13 ++++++++++++- ILSpy/TextView/DecompilerTextView.cs | 1 + 5 files changed, 34 insertions(+), 5 deletions(-) diff --git a/Debugger/Debugger.Core/NRefactory/Ast/ExpressionExtensionMethods.cs b/Debugger/Debugger.Core/NRefactory/Ast/ExpressionExtensionMethods.cs index 48127245a..423989ca4 100644 --- a/Debugger/Debugger.Core/NRefactory/Ast/ExpressionExtensionMethods.cs +++ b/Debugger/Debugger.Core/NRefactory/Ast/ExpressionExtensionMethods.cs @@ -54,7 +54,7 @@ namespace ICSharpCode.NRefactory.Ast if (val != null && val.GetType().FullName == castTo.FullName) return expresion; } - return new CastExpression() { Expression = expresion.Parenthesize(), Type = castTo.GetTypeReference() }; + return new CastExpression() { Expression = expresion.Clone().Parenthesize(), Type = castTo.GetTypeReference() }; } public static Expression GetExpression(this DebugLocalVariableInfo locVar) @@ -95,7 +95,7 @@ namespace ICSharpCode.NRefactory.Ast if (memberInfo.IsStatic) { target = new TypeReferenceExpression() { Type = memberInfo.DeclaringType.GetTypeReference() }; } else { - target = expresion.Clone().CastTo((DebugType)memberInfo.DeclaringType); + target = CastTo(expresion, (DebugType)memberInfo.DeclaringType); } if (memberInfo is DebugFieldInfo) { @@ -141,7 +141,7 @@ namespace ICSharpCode.NRefactory.Ast throw new DebuggerException("Incorrect number of arguments"); List typedArgs = new List(args.Length); for(int i = 0; i < args.Length; i++) { - typedArgs.Add(args[i].Clone().CastTo((DebugType)method.GetParameters()[i].ParameterType)); + typedArgs.Add(CastTo(args[i], (DebugType)method.GetParameters()[i].ParameterType)); } return typedArgs; } diff --git a/Debugger/ILSpy.Debugger/AvalonEdit/TextEditorWeakEventManager.cs b/Debugger/ILSpy.Debugger/AvalonEdit/TextEditorWeakEventManager.cs index 0b9e437f2..e652831d1 100644 --- a/Debugger/ILSpy.Debugger/AvalonEdit/TextEditorWeakEventManager.cs +++ b/Debugger/ILSpy.Debugger/AvalonEdit/TextEditorWeakEventManager.cs @@ -50,5 +50,18 @@ namespace ILSpy.Debugger.AvalonEdit source.MouseHoverStopped += DeliverEvent; } } + + public sealed class MouseDown : WeakEventManagerBase + { + protected override void StopListening(TextEditor source) + { + source.MouseDown -= DeliverEvent; + } + + protected override void StartListening(TextEditor source) + { + source.MouseDown += DeliverEvent; + } + } } } diff --git a/Debugger/ILSpy.Debugger/Services/Debugger/DebuggerService.cs b/Debugger/ILSpy.Debugger/Services/Debugger/DebuggerService.cs index a898aae0d..92ba0a5c0 100644 --- a/Debugger/ILSpy.Debugger/Services/Debugger/DebuggerService.cs +++ b/Debugger/ILSpy.Debugger/Services/Debugger/DebuggerService.cs @@ -210,7 +210,11 @@ namespace ILSpy.Debugger.Services e.ContentToShow = null; } else { - e.ContentToShow = currentDebugger.GetTooltipControl(e.LogicalPosition, variable); + try { + e.ContentToShow = currentDebugger.GetTooltipControl(e.LogicalPosition, variable); + } catch { + return; + } } // FIXME Do proper parsing diff --git a/Debugger/ILSpy.Debugger/ToolTips/TextEditorListener.cs b/Debugger/ILSpy.Debugger/ToolTips/TextEditorListener.cs index fd6aa4bd0..612060006 100644 --- a/Debugger/ILSpy.Debugger/ToolTips/TextEditorListener.cs +++ b/Debugger/ILSpy.Debugger/ToolTips/TextEditorListener.cs @@ -63,9 +63,21 @@ namespace ILSpy.Debugger.ToolTips OnMouseHoverStopped((MouseEventArgs)e); } + if (managerType == typeof(ILSpy.Debugger.AvalonEdit.TextEditorWeakEventManager.MouseDown)) { + OnMouseDown((MouseEventArgs)e); + } + return true; } + void OnMouseDown(MouseEventArgs mouseEventArgs0) + { + if (toolTip != null) + toolTip.IsOpen = false; + + TryCloseExistingPopup(true); + } + void OnMouseHoverStopped(MouseEventArgs e) { if (toolTip != null) @@ -184,7 +196,6 @@ namespace ILSpy.Debugger.ToolTips popup.StaysOpen = true; return popup; } - bool IWeakEventListener.ReceiveWeakEvent(Type managerType, object sender, EventArgs e) { diff --git a/ILSpy/TextView/DecompilerTextView.cs b/ILSpy/TextView/DecompilerTextView.cs index 8029fc21b..af0b6fa83 100644 --- a/ILSpy/TextView/DecompilerTextView.cs +++ b/ILSpy/TextView/DecompilerTextView.cs @@ -86,6 +86,7 @@ namespace ICSharpCode.ILSpy.TextView // wire the mouse events TextEditorWeakEventManager.MouseHover.AddListener(textEditor, TextEditorListener.Instance); TextEditorWeakEventManager.MouseHoverStopped.AddListener(textEditor, TextEditorListener.Instance); + TextEditorWeakEventManager.MouseDown.AddListener(textEditor, TextEditorListener.Instance); textEditor.TextArea.TextView.VisualLinesChanged += (s, e) => iconMargin.InvalidateVisual(); }