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 != MonoDevelop.Projects.Dom.ClassType.Delegate) { return(null); } return(type); } parent = parent.Parent; } return(null); }
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); }
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); }