public MemberReferenceCollection FindVariableReferences(IProgressMonitor monitor, LocalVariable var)
        {
            MemberReferenceCollection refs = new MemberReferenceCollection();

            Refactor(monitor, var, new RefactorDelegate(new RefactorFindVariableReferences(var, refs).Refactor));
            return(refs);
        }
 public RefactorFindMemberReferences(IType cls, IMember member, MemberReferenceCollection references, bool includeXmlComment)
 {
     this.cls               = cls;
     this.references        = references;
     this.member            = member;
     this.includeXmlComment = includeXmlComment;
 }
        public MemberReferenceCollection FindParameterReferences(IProgressMonitor monitor, IParameter param, bool includeXmlComment)
        {
            MemberReferenceCollection refs = new MemberReferenceCollection();

            Refactor(monitor, param, new RefactorDelegate(new RefactorFindParameterReferences(param, refs, includeXmlComment).Refactor));
            return(refs);
        }
        public IType RenameClass(IProgressMonitor monitor, IType cls, string newName, RefactoryScope scope)
        {
            try {
                MemberReferenceCollection refs = new MemberReferenceCollection();
                Refactor(monitor, cls, scope, new RefactorDelegate(new RefactorFindClassReferences(cls, refs, false).Refactor));
                refs.RenameAll(newName);

                RefactorerContext gctx = GetGeneratorContext(cls);
                IRefactorer       r    = GetGeneratorForClass(cls);

                foreach (IMethod method in cls.Methods)
                {
                    if (method.IsConstructor)
                    {
                        r.RenameMember(gctx, cls, (IMember)method, newName);
                    }
                }

                cls = r.RenameClass(gctx, cls, newName);

                gctx.Save();

                return(cls);
            } catch (Exception e) {
                LoggingService.LogError(GettextCatalog.GetString("Error while renaming {0} to {1}: {2}", cls, newName, e.ToString()));
                return(null);
            }
        }
        public MemberReferenceCollection FindMemberReferences(IProgressMonitor monitor, IType cls, IMember member, RefactoryScope scope, bool includeXmlComment)
        {
            MemberReferenceCollection refs = new MemberReferenceCollection();

            Refactor(monitor, cls, scope, new RefactorDelegate(new RefactorFindMemberReferences(cls, member, refs, includeXmlComment).Refactor));
            return(refs);
        }
        public IMember EncapsulateField(IProgressMonitor monitor, IType cls, IField field, string propName, MemberAttributes attr, bool generateSetter, bool updateInternalRefs)
        {
            RefactoryScope scope = GetScope(field);

            MemberReferenceCollection refs = new MemberReferenceCollection();

            Refactor(monitor, cls, scope, new RefactorDelegate(new RefactorFindMemberReferences(cls, field, refs, false).Refactor));

            if (!updateInternalRefs)
            {
                ArrayList list = new ArrayList();
                list.AddRange(refs);
                list.Sort(new MemberReferenceCollection.MemberComparer());

                foreach (MemberReference mref in list)
                {
                    bool rename = true;
                    foreach (IType part in field.DeclaringType.Parts)
                    {
                        if (mref.FileName == part.CompilationUnit.FileName)
                        {
                            DomRegion region = part.BodyRegion;

                            // check if the reference is internal to the class
                            if ((mref.Line > region.Start.Line ||
                                 (mref.Line == region.Start.Line && mref.Column >= region.Start.Column)) &&
                                (mref.Line < region.End.Line ||
                                 (mref.Line == region.End.Line && mref.Column <= region.End.Column)))
                            {
                                // Internal to the class, don't rename
                                rename = false;
                                break;
                            }
                        }
                    }

                    if (rename)
                    {
                        mref.Rename(propName);
                    }
                }
            }
            else
            {
                refs.RenameAll(propName);
            }

            RefactorerContext gctx = GetGeneratorContext(cls);
            IRefactorer       r    = GetGeneratorForClass(cls);
            IMember           m    = r.EncapsulateField(gctx, cls, field, propName, attr, generateSetter);

            gctx.Save();

            return(m);
        }
        public bool RenameVariable(IProgressMonitor monitor, LocalVariable var, string newName)
        {
            try {
                MemberReferenceCollection refs = new MemberReferenceCollection();
                Refactor(monitor, var, new RefactorDelegate(new RefactorFindVariableReferences(var, refs).Refactor));
                refs.RenameAll(newName);

                RefactorerContext gctx = GetGeneratorContext(var);
                IRefactorer       r    = GetGeneratorForVariable(var);
                bool rv = r.RenameVariable(gctx, var, newName);
                gctx.Save();

                return(rv);
            } catch (Exception e) {
                LoggingService.LogError(GettextCatalog.GetString("Error while renaming {0} to {1}: {2}", var, newName, e.ToString()));
                return(false);
            }
        }
        IMember InnerRenameMember(IProgressMonitor monitor, IType cls, IMember member, string newName, RefactoryScope scope)
        {
            try {
                MemberReferenceCollection refs = new MemberReferenceCollection();
                Refactor(monitor, cls, scope, new RefactorDelegate(new RefactorFindMemberReferences(cls, member, refs, false).Refactor));
                refs.RenameAll(newName);

                RefactorerContext gctx = GetGeneratorContext(cls);

                IRefactorer gen = GetGeneratorForClass(cls);
                IMember     m   = gen.RenameMember(gctx, cls, member, newName);
                gctx.Save();
                return(m);
            } catch (Exception e) {
                LoggingService.LogError(GettextCatalog.GetString("Error while renaming {0} to {1}: {2}", member, newName, e.ToString()));
                return(null);
            }
        }
        public bool RenameParameter(IProgressMonitor monitor, IParameter param, string newName)
        {
            try {
                MemberReferenceCollection refs = new MemberReferenceCollection();
                Refactor(monitor, param, new RefactorDelegate(new RefactorFindParameterReferences(param, refs, false).Refactor));
                refs.RenameAll(newName);

                IMember           member = param.DeclaringMember;
                RefactorerContext gctx   = GetGeneratorContext(member.DeclaringType);
                IRefactorer       r      = GetGeneratorForClass(member.DeclaringType);
                bool rv = r.RenameParameter(gctx, param, newName);
                gctx.Save();

                return(rv);
            } catch (Exception e) {
                LoggingService.LogError(GettextCatalog.GetString("Error while renaming {0} to {1}: {2}", param, newName, e.ToString()));
                return(false);
            }
        }
		public RefactorFindVariableReferences (LocalVariable var, MemberReferenceCollection references)
		{
			this.references = references;
			this.var = var;
		}
		public RefactorFindMemberReferences (IType cls, IMember member, MemberReferenceCollection references, bool includeXmlComment)
		{
			this.cls = cls;
			this.references = references;
			this.member = member;
			this.includeXmlComment = includeXmlComment;
		}
		public MemberReferenceCollection FindMemberReferences (IProgressMonitor monitor, IType cls, IMember member, RefactoryScope scope, bool includeXmlComment)
		{
			MemberReferenceCollection refs = new MemberReferenceCollection ();
			Refactor (monitor, cls, scope, new RefactorDelegate (new RefactorFindMemberReferences (cls, member, refs, includeXmlComment).Refactor));
			return refs;
		}
		IMember InnerRenameMember (IProgressMonitor monitor, IType cls, IMember member, string newName, RefactoryScope scope)
		{
			try {
				MemberReferenceCollection refs = new MemberReferenceCollection ();
				Refactor (monitor, cls, scope, new RefactorDelegate (new RefactorFindMemberReferences (cls, member, refs, false).Refactor));
				refs.RenameAll (newName);
				
				RefactorerContext gctx = GetGeneratorContext (cls);
				
				IRefactorer gen = GetGeneratorForClass (cls);
				IMember m = gen.RenameMember (gctx, cls, member, newName);
				gctx.Save ();
				return m;
			} catch (Exception e) {
				LoggingService.LogError (GettextCatalog.GetString ("Error while renaming {0} to {1}: {2}",  member, newName, e.ToString ()));
				return null;
			}
		}
		public MemberReferenceCollection FindParameterReferences (IProgressMonitor monitor, IParameter param, bool includeXmlComment)
		{
			MemberReferenceCollection refs = new MemberReferenceCollection ();
			Refactor (monitor, param, new RefactorDelegate (new RefactorFindParameterReferences (param, refs, includeXmlComment).Refactor));
			return refs;
		}
		public MemberReferenceCollection FindVariableReferences (IProgressMonitor monitor, LocalVariable var)
		{
			MemberReferenceCollection refs = new MemberReferenceCollection ();
			Refactor (monitor, var, new RefactorDelegate (new RefactorFindVariableReferences (var, refs).Refactor));
			return refs;
		}
		public IType RenameClass (IProgressMonitor monitor, IType cls, string newName, RefactoryScope scope)
		{
			try {
				MemberReferenceCollection refs = new MemberReferenceCollection ();
				Refactor (monitor, cls, scope, new RefactorDelegate (new RefactorFindClassReferences (cls, refs, false).Refactor));
				refs.RenameAll (newName);
				
				RefactorerContext gctx = GetGeneratorContext (cls);
				IRefactorer r = GetGeneratorForClass (cls);
				
				foreach (IMethod method in cls.Methods) {
					if (method.IsConstructor)
						r.RenameMember (gctx, cls, (IMember) method, newName);
				}
				
				cls = r.RenameClass (gctx, cls, newName);
				
				gctx.Save ();
				
				return cls;
			} catch (Exception e) {
				LoggingService.LogError (GettextCatalog.GetString ("Error while renaming {0} to {1}: {2}",  cls, newName, e.ToString ()));
				return null;
			}
		}
		public IMember EncapsulateField (IProgressMonitor monitor, IType cls, IField field, string propName, MemberAttributes attr, bool generateSetter, bool updateInternalRefs)
		{
			RefactoryScope scope = GetScope (field);
			
			MemberReferenceCollection refs = new MemberReferenceCollection ();
			Refactor (monitor, cls, scope, new RefactorDelegate (new RefactorFindMemberReferences (cls, field, refs, false).Refactor));
			
			if (!updateInternalRefs) {
				ArrayList list = new ArrayList ();
				list.AddRange (refs);
				list.Sort (new MemberReferenceCollection.MemberComparer ());
				
				foreach (MemberReference mref in list) {
					bool rename = true;
					foreach (IType part in field.DeclaringType.Parts) {
						if (mref.FileName == part.CompilationUnit.FileName) {
							DomRegion region = part.BodyRegion;
							
							// check if the reference is internal to the class
							if ((mref.Line > region.Start.Line ||
							     (mref.Line == region.Start.Line && mref.Column >= region.Start.Column)) &&
							    (mref.Line < region.End.Line ||
							     (mref.Line == region.End.Line && mref.Column <= region.End.Column))) {
								// Internal to the class, don't rename
								rename = false;
								break;
							}
						}
					}
					
					if (rename)
						mref.Rename (propName);
				}
			} else {
				refs.RenameAll (propName);
			}
			
			RefactorerContext gctx = GetGeneratorContext (cls);
			IRefactorer r = GetGeneratorForClass (cls);
			IMember m = r.EncapsulateField (gctx, cls, field, propName, attr, generateSetter);
			gctx.Save ();
			
			return m;
		}
		public bool RenameParameter (IProgressMonitor monitor, IParameter param, string newName)
		{
			try {
				MemberReferenceCollection refs = new MemberReferenceCollection ();
				Refactor (monitor, param, new RefactorDelegate (new RefactorFindParameterReferences (param, refs, false).Refactor));
				refs.RenameAll (newName);
				
				IMember member = param.DeclaringMember;
				RefactorerContext gctx = GetGeneratorContext (member.DeclaringType);
				IRefactorer r = GetGeneratorForClass (member.DeclaringType);
				bool rv = r.RenameParameter (gctx, param, newName);
				gctx.Save ();
				
				return rv;
			} catch (Exception e) {
				LoggingService.LogError (GettextCatalog.GetString ("Error while renaming {0} to {1}: {2}",  param, newName, e.ToString ()));
				return false;
			}
		}
		public RefactorFindParameterReferences (IParameter param, MemberReferenceCollection references, bool includeXmlComment)
		{
			this.references = references;
			this.param = param;
			this.includeXmlComment = includeXmlComment;
		}
		MemberReferenceCollection GetReferences (RefactoringOptions options)
		{
			CodeRefactorer refactorer = IdeApp.Workspace.GetCodeRefactorer (IdeApp.ProjectOperations.CurrentSelectedSolution);
			IProgressMonitor monitor = IdeApp.Workbench.ProgressMonitors.GetBackgroundProgressMonitor (this.Name, null);
			if (options.SelectedItem is IType) {
				IType cls = (IType)options.SelectedItem;
				return refactorer.FindClassReferences (monitor, cls, RefactoryScope.Solution, true);
			} else if (options.SelectedItem is LocalVariable) {
				return refactorer.FindVariableReferences (monitor, (LocalVariable)options.SelectedItem);
			} else if (options.SelectedItem is IParameter) {
				return refactorer.FindParameterReferences (monitor, (IParameter)options.SelectedItem, true);
			} else if (options.SelectedItem is IMember) {
				IMember member = (IMember)options.SelectedItem;
				Dictionary<string, HashSet<DomLocation>> foundLocations = new Dictionary <string, HashSet<DomLocation>> ();
				MemberReferenceCollection result = new MemberReferenceCollection ();
				foreach (IMember m in CollectMembers (member.DeclaringType.SourceProjectDom, member)) {
					foreach (MemberReference r in refactorer.FindMemberReferences (monitor, m.DeclaringType, m, true)) {
						DomLocation location = new DomLocation (r.Line, r.Column);
						if (!foundLocations.ContainsKey (r.FileName))
							foundLocations[r.FileName] = new HashSet<DomLocation> ();
						if (foundLocations[r.FileName].Contains (location))
							continue;
						foundLocations[r.FileName].Add (location);
						result.Add (r);
					}
				}
				return result;
			}
			return null;
		}
 public RefactorFindVariableReferences(LocalVariable var, MemberReferenceCollection references)
 {
     this.references = references;
     this.var        = var;
 }
 public RefactorFindParameterReferences(IParameter param, MemberReferenceCollection references, bool includeXmlComment)
 {
     this.references        = references;
     this.param             = param;
     this.includeXmlComment = includeXmlComment;
 }
		void FindReferencesThread ()
		{
			try {
				CodeRefactorer refactorer = IdeApp.Workspace.GetCodeRefactorer (IdeApp.ProjectOperations.CurrentSelectedSolution);
				if (item is IType) {
					references = refactorer.FindClassReferences (monitor, (IType)item, RefactoryScope.Solution, true);
				} else if (item is LocalVariable) {
					references = refactorer.FindVariableReferences (monitor, (LocalVariable)item);
				} else if (item is IParameter) {
					references = refactorer.FindParameterReferences (monitor, (IParameter)item, true);
				} else if (item is IMember) {
					IMember member = (IMember)item;
/*					references = new MemberReferenceCollection ();
					foreach (IMember m in MonoDevelop.Refactoring.Rename.RenameRefactoring.CollectMembers (member.DeclaringType.SourceProjectDom, member)) {
						foreach (MemberReference r in refactorer.FindMemberReferences (monitor, m.DeclaringType, m, true)) {
							references.Add (r);
						}
					}*/
					
					references = refactorer.FindMemberReferences (monitor, member.DeclaringType, member, true);
				}
				if (references != null) {
					foreach (MemberReference mref in references) {
						monitor.ReportResult (new MonoDevelop.Ide.FindInFiles.SearchResult (new FileProvider (mref.FileName), mref.Position, mref.Name.Length));
					}
				}
			} catch (Exception ex) {
				if (monitor != null)
					monitor.ReportError ("Error finding references", ex);
				else
					LoggingService.LogError ("Error finding references", ex);
			} finally {
				if (monitor != null)
					monitor.Dispose ();
			}
		}
		public bool RenameVariable (IProgressMonitor monitor, LocalVariable var, string newName)
		{
			try {
				MemberReferenceCollection refs = new MemberReferenceCollection ();
				Refactor (monitor, var, new RefactorDelegate (new RefactorFindVariableReferences (var, refs).Refactor));
				refs.RenameAll (newName);
				
				RefactorerContext gctx = GetGeneratorContext (var);
				IRefactorer r = GetGeneratorForVariable (var);
				bool rv = r.RenameVariable (gctx, var, newName);
				gctx.Save ();
				
				return rv;
			} catch (Exception e) {
				LoggingService.LogError (GettextCatalog.GetString ("Error while renaming {0} to {1}: {2}",  var, newName, e.ToString ()));
				return false;
			}
		}