bool AnalyzeTargetExpression (RefactoringOptions options, ICSharpCode.NRefactory.CSharp.CompilationUnit unit) { var data = options.GetTextEditorData (); var target = unit.GetNodeAt (data.Caret.Line, data.Caret.Column); if (target == null) return false; if (target.Parent is MemberReferenceExpression && ((MemberReferenceExpression)target.Parent).GetChildByRole (MemberReferenceExpression.Roles.Identifier) == target) { var memberReference = (MemberReferenceExpression)target.Parent; target = memberReference.Target; var targetResult = options.GetResolver ().Resolve (new ExpressionResult (data.GetTextBetween (target.StartLocation.Line, target.StartLocation.Column, target.EndLocation.Line, target.EndLocation.Column)), resolvePosition); if (targetResult.StaticResolve) modifiers = MonoDevelop.Projects.Dom.Modifiers.Static; declaringType = options.Dom.GetType (targetResult.ResolvedType); methodName = memberReference.MemberName; } else if (target is Identifier) { if (options.ResolveResult != null) { declaringType = options.ResolveResult.CallingType; } else { declaringType = options.Document.CompilationUnit.GetTypeAt (options.Document.Editor.Caret.Line, options.Document.Editor.Caret.Column); } methodName = data.GetTextBetween (target.StartLocation.Line, target.StartLocation.Column, target.EndLocation.Line, target.EndLocation.Column); } if (declaringType != null && !HasCompatibleMethod (declaringType, methodName, invocation)) { if (declaringType.HasParts) declaringType = declaringType.Parts.FirstOrDefault (t => t.CompilationUnit.FileName == options.Document.FileName) ?? declaringType; if (declaringType == null || declaringType.CompilationUnit == null) return false; var doc = ProjectDomService.GetParsedDocument (declaringType.SourceProjectDom, declaringType.CompilationUnit.FileName); declaringType = doc.CompilationUnit.GetTypeAt (declaringType.Location) ?? declaringType; return true; } return false; }
InvocationExpression GetInvocation (ICSharpCode.NRefactory.CSharp.CompilationUnit unit, TextEditorData data) { var containingNode = unit.GetNodeAt (data.Caret.Line, data.Caret.Column); var curNode = containingNode; while (curNode != null && !(curNode is InvocationExpression)) { curNode = curNode.Parent; } return curNode as InvocationExpression; }
IType GetDelegateType (RefactoringOptions options, ICSharpCode.NRefactory.CSharp.CompilationUnit unit) { var data = options.GetTextEditorData (); var containingNode = unit.GetNodeAt (data.Caret.Line, data.Caret.Column); var parent = containingNode.Parent; while (parent != null) { if (parent is AssignmentExpression) { AssignmentExpression assignment = (AssignmentExpression)parent; if (assignment.Operator != AssignmentOperatorType.Add && assignment.Operator != AssignmentOperatorType.Subtract && assignment.Operator != AssignmentOperatorType.Assign) return null; var resolveResult = ResolveAssignment (options, assignment); if (resolveResult == null) return null; IType type = options.Dom.GetType (resolveResult.ResolvedType); if (type == null || type.ClassType != ClassType.Delegate) return null; return type; } parent = parent.Parent; } return null; }