From f28c5af61657c707548bdc8650c30b31c28e0058 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 23 Sep 2008 12:53:44 +0000 Subject: [PATCH] Fixed exception double clicking code-coverage class node when that class didn't contain any methods. Console pad: support calling methods like "this.M()" using the syntax "M()". git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3552 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../CodeCoverage/Project/CodeCoverage.csproj | 5 ++-- .../Project/Src/CodeCoverageClassTreeNode.cs | 12 ++++++++-- .../Src/Expressions/EvaluateAstVisitor.cs | 24 +++++++++++++------ 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/AddIns/Misc/CodeCoverage/Project/CodeCoverage.csproj b/src/AddIns/Misc/CodeCoverage/Project/CodeCoverage.csproj index 5ada7fb76a..9dd0f3db4d 100644 --- a/src/AddIns/Misc/CodeCoverage/Project/CodeCoverage.csproj +++ b/src/AddIns/Misc/CodeCoverage/Project/CodeCoverage.csproj @@ -1,4 +1,4 @@ - + Library ICSharpCode.CodeCoverage @@ -15,6 +15,7 @@ 4096 4 false + v2.0 ..\..\..\..\..\AddIns\AddIns\Misc\CodeCoverage\ @@ -118,4 +119,4 @@ - \ No newline at end of file + diff --git a/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoverageClassTreeNode.cs b/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoverageClassTreeNode.cs index eb3ae126ab..34ddc2b680 100644 --- a/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoverageClassTreeNode.cs +++ b/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoverageClassTreeNode.cs @@ -20,10 +20,18 @@ namespace ICSharpCode.CodeCoverage public override void ActivateItem() { if (Nodes.Count > 0) { - CodeCoverageMethodTreeNode methodNode = (CodeCoverageMethodTreeNode)Nodes[0]; - if (methodNode.Method.SequencePoints.Count > 0) { + CodeCoverageMethodTreeNode methodNode = Nodes[0] as CodeCoverageMethodTreeNode; + if (methodNode != null && methodNode.Method.SequencePoints.Count > 0) { FileService.OpenFile(methodNode.Method.SequencePoints[0].Document); } + // when the first node is a property: + CodeCoverageMethodsTreeNode methodsNode = Nodes[0] as CodeCoverageMethodsTreeNode; + if (methodsNode != null && methodsNode.Methods.Count > 0) { + var sequencePoints = methodsNode.Methods[0].SequencePoints; + if (sequencePoints != null) { + FileService.OpenFile(sequencePoints[0].Document); + } + } } } diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Expressions/EvaluateAstVisitor.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Expressions/EvaluateAstVisitor.cs index 065ffacfb9..0699b72a2f 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Expressions/EvaluateAstVisitor.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Expressions/EvaluateAstVisitor.cs @@ -93,18 +93,28 @@ namespace Debugger.AddIn public override object VisitInvocationExpression(InvocationExpression invocationExpression, object data) { + Value target; + string methodName; MemberReferenceExpression memberRef = invocationExpression.TargetObject as MemberReferenceExpression; - if (memberRef == null) { - throw new GetValueException("Member reference expected duting method invocation"); + if (memberRef != null) { + target = ((Value)memberRef.TargetObject.AcceptVisitor(this, null)).GetPermanentReference(); + methodName = memberRef.MemberName; + } else { + IdentifierExpression ident = invocationExpression.TargetObject as IdentifierExpression; + if (ident != null) { + target = context.GetThisValue(); + methodName = ident.Identifier; + } else { + throw new GetValueException("Member reference expected for method invocation"); + } } - Value target = ((Value)memberRef.TargetObject.AcceptVisitor(this, null)).GetPermanentReference(); List args = new List(); foreach(Expression expr in invocationExpression.Arguments) { args.Add(((Value)expr.AcceptVisitor(this, null)).GetPermanentReference()); } - MethodInfo method = target.Type.GetMember(memberRef.MemberName, BindingFlags.Method | BindingFlags.IncludeSuperType) as MethodInfo; + MethodInfo method = target.Type.GetMember(methodName, BindingFlags.Method | BindingFlags.IncludeSuperType) as MethodInfo; if (method == null) { - throw new GetValueException("Method " + memberRef.MemberName + " not found"); + throw new GetValueException("Method " + methodName + " not found"); } return target.InvokeMethod(method, args.ToArray()); } @@ -175,8 +185,8 @@ namespace Debugger.AddIn // case BinaryOperatorType.GreaterThanOrEqual : // val.PrimitiveValue = (right.PrimitiveValue >= left.PrimitiveValue); // break; - default : - throw new NotImplementedException("BinaryOperator: " + binaryOperatorExpression.Op + "!"); + default: + throw new NotImplementedException("BinaryOperator: " + binaryOperatorExpression.Op); } } catch (System.Exception e) { throw new GetValueException(e.Message);