83
86
MessageService.ShowCustomDialog (new RenameItemDialog (options, this));
88
90
List<TextLink> links = new List<TextLink> ();
89
91
TextLink link = new TextLink ("name");
90
92
int baseOffset = Int32.MaxValue;
91
93
foreach (MemberReference r in col) {
92
baseOffset = Math.Min (baseOffset, data.Document.LocationToOffset (r.Line - 1, r.Column - 1));
94
baseOffset = Math.Min (baseOffset, data.Document.LocationToOffset (r.Line, r.Column));
94
96
foreach (MemberReference r in col) {
95
Segment segment = new Segment (data.Document.LocationToOffset (r.Line - 1, r.Column - 1) - baseOffset, r.Name.Length);
97
Segment segment = new Segment (data.Document.LocationToOffset (r.Line, r.Column) - baseOffset, r.Name.Length);
96
98
if (segment.Offset <= data.Caret.Offset - baseOffset && data.Caret.Offset - baseOffset <= segment.EndOffset) {
97
99
link.Links.Insert (0, segment);
103
105
links.Add (link);
106
if (editor.CurrentMode is TextLinkEditMode)
107
((TextLinkEditMode)editor.CurrentMode).ExitTextLinkMode ();
104
108
TextLinkEditMode tle = new TextLinkEditMode (editor, baseOffset, links);
105
109
tle.SetCaretPosition = false;
106
110
tle.SelectPrimaryLink = true;
107
111
if (tle.ShouldStartTextLinkMode) {
112
ModeHelpWindow helpWindow = new ModeHelpWindow ();
113
helpWindow.TransientFor = IdeApp.Workbench.RootWindow;
114
helpWindow.TitleText = options.SelectedItem is LocalVariable ? GettextCatalog.GetString ("<b>Local Variable -- Renaming</b>") : GettextCatalog.GetString ("<b>Parameter -- Renaming</b>");
115
helpWindow.Items.Add (new KeyValuePair<string, string> (GettextCatalog.GetString ("<b>Key</b>"), GettextCatalog.GetString ("<b>Behavior</b>")));
116
helpWindow.Items.Add (new KeyValuePair<string, string> (GettextCatalog.GetString ("<b>Return</b>"), GettextCatalog.GetString ("<b>Accept</b> this refactoring.")));
117
helpWindow.Items.Add (new KeyValuePair<string, string> (GettextCatalog.GetString ("<b>Esc</b>"), GettextCatalog.GetString ("<b>Cancel</b> this refactoring.")));
118
tle.HelpWindow = helpWindow;
119
tle.Cancel += delegate {
120
if (tle.HasChangedText)
121
editor.Document.Undo ();
108
123
tle.OldMode = data.CurrentMode;
109
124
tle.StartMode ();
110
125
data.CurrentMode = tle;
132
147
RenameProperties properties = (RenameProperties)prop;
133
148
List<Change> result = new List<Change> ();
135
MemberReferenceCollection col = GetReferences (options);
139
if (properties.RenameFile && options.SelectedItem is IType) {
140
IType cls = (IType)options.SelectedItem;
142
HashSet<string> alreadyRenamed = new HashSet<string> ();
143
foreach (IType part in cls.Parts) {
144
if (part.CompilationUnit.FileName != options.Document.FileName && System.IO.Path.GetFileNameWithoutExtension (part.CompilationUnit.FileName) != System.IO.Path.GetFileNameWithoutExtension (options.Document.FileName))
146
if (alreadyRenamed.Contains (part.CompilationUnit.FileName))
148
alreadyRenamed.Add (part.CompilationUnit.FileName);
150
string oldFileName = System.IO.Path.GetFileNameWithoutExtension (part.CompilationUnit.FileName);
153
int idx = oldFileName.IndexOf (cls.Name);
155
newFileName = oldFileName.Substring (0, idx) + properties.NewName + oldFileName.Substring (idx + cls.Name.Length);
157
newFileName = currentPart != 1 ? properties.NewName + currentPart : properties.NewName;
162
while (System.IO.File.Exists (GetFullFileName (newFileName, part.CompilationUnit.FileName, t))) {
165
result.Add (new RenameFileChange (part.CompilationUnit.FileName, GetFullFileName (newFileName, part.CompilationUnit.FileName, t)));
169
foreach (MemberReference memberRef in col) {
170
TextReplaceChange change = new TextReplaceChange ();
171
change.FileName = memberRef.FileName;
172
change.Offset = memberRef.Position;
173
change.RemovedChars = memberRef.Name.Length;
174
change.InsertedText = properties.NewName;
175
change.Description = string.Format (GettextCatalog.GetString ("Replace '{0}' with '{1}'"), memberRef.Name, properties.NewName);
149
IEnumerable<MemberReference> col = null;
150
using (var monitor = new MessageDialogProgressMonitor (true, false, false, true)) {
151
col = ReferenceFinder.FindReferences (options.SelectedItem, monitor);
155
if (properties.RenameFile && options.SelectedItem is IType) {
156
IType cls = (IType)options.SelectedItem;
158
HashSet<string> alreadyRenamed = new HashSet<string> ();
159
foreach (IType part in cls.Parts) {
160
if (part.CompilationUnit.FileName != options.Document.FileName && System.IO.Path.GetFileNameWithoutExtension (part.CompilationUnit.FileName) != System.IO.Path.GetFileNameWithoutExtension (options.Document.FileName))
162
if (alreadyRenamed.Contains (part.CompilationUnit.FileName))
164
alreadyRenamed.Add (part.CompilationUnit.FileName);
166
string oldFileName = System.IO.Path.GetFileNameWithoutExtension (part.CompilationUnit.FileName);
168
if (oldFileName.ToUpper () == properties.NewName.ToUpper () || oldFileName.ToUpper ().EndsWith ("." + properties.NewName.ToUpper ()))
170
int idx = oldFileName.IndexOf (cls.Name);
172
newFileName = oldFileName.Substring (0, idx) + properties.NewName + oldFileName.Substring (idx + cls.Name.Length);
174
newFileName = currentPart != 1 ? properties.NewName + currentPart : properties.NewName;
179
while (System.IO.File.Exists (GetFullFileName (newFileName, part.CompilationUnit.FileName, t))) {
182
result.Add (new RenameFileChange (part.CompilationUnit.FileName, GetFullFileName (newFileName, part.CompilationUnit.FileName, t)));
186
foreach (MemberReference memberRef in col) {
187
TextReplaceChange change = new TextReplaceChange ();
188
change.FileName = memberRef.FileName;
189
change.Offset = memberRef.Position;
190
change.RemovedChars = memberRef.Name.Length;
191
change.InsertedText = properties.NewName;
192
change.Description = string.Format (GettextCatalog.GetString ("Replace '{0}' with '{1}'"), memberRef.Name, properties.NewName);
191
209
return System.IO.Path.Combine (System.IO.Path.GetDirectoryName (oldFullFileName), name.ToString ());
194
MemberReferenceCollection GetReferences (RefactoringOptions options)
196
CodeRefactorer refactorer = IdeApp.Workspace.GetCodeRefactorer (IdeApp.ProjectOperations.CurrentSelectedSolution);
197
IProgressMonitor monitor = IdeApp.Workbench.ProgressMonitors.GetBackgroundProgressMonitor (this.Name, null);
198
if (options.SelectedItem is IType) {
199
IType cls = (IType)options.SelectedItem;
200
return refactorer.FindClassReferences (monitor, cls, RefactoryScope.Solution, true);
201
} else if (options.SelectedItem is LocalVariable) {
202
return refactorer.FindVariableReferences (monitor, (LocalVariable)options.SelectedItem);
203
} else if (options.SelectedItem is IParameter) {
204
return refactorer.FindParameterReferences (monitor, (IParameter)options.SelectedItem, true);
205
} else if (options.SelectedItem is IMember) {
206
IMember member = (IMember)options.SelectedItem;
207
Dictionary<string, HashSet<DomLocation>> foundLocations = new Dictionary <string, HashSet<DomLocation>> ();
208
MemberReferenceCollection result = new MemberReferenceCollection ();
209
foreach (IMember m in CollectMembers (member.DeclaringType.SourceProjectDom, member)) {
210
foreach (MemberReference r in refactorer.FindMemberReferences (monitor, m.DeclaringType, m, true)) {
211
DomLocation location = new DomLocation (r.Line, r.Column);
212
if (!foundLocations.ContainsKey (r.FileName))
213
foundLocations[r.FileName] = new HashSet<DomLocation> ();
214
if (foundLocations[r.FileName].Contains (location))
216
foundLocations[r.FileName].Add (location);
225
internal static IEnumerable<IMember> CollectMembers (ProjectDom dom, IMember member)
227
if (member is IMethod && ((IMethod)member).IsConstructor) {
230
bool isOverrideable = member.DeclaringType.ClassType == ClassType.Interface || member.IsOverride || member.IsVirtual || member.IsAbstract;
231
bool isLastMember = false;
232
// for members we need to collect the whole 'class' of members (overloads & implementing types)
233
HashSet<string> alreadyVisitedTypes = new HashSet<string> ();
234
foreach (IType type in dom.GetInheritanceTree (member.DeclaringType)) {
235
if (type.ClassType == ClassType.Interface || isOverrideable || type.DecoratedFullName == member.DeclaringType.DecoratedFullName) {
236
// search in the class for the member
237
foreach (IMember interfaceMember in type.SearchMember (member.Name, true)) {
238
if (interfaceMember.MemberType == member.MemberType)
239
yield return interfaceMember;
242
// now search in all subclasses of this class for the member
243
isLastMember = !member.IsOverride;
244
foreach (IType implementingType in dom.GetSubclasses (type)) {
245
string name = implementingType.DecoratedFullName;
246
if (alreadyVisitedTypes.Contains (name))
248
alreadyVisitedTypes.Add (name);
249
foreach (IMember typeMember in implementingType.SearchMember (member.Name, true)) {
250
if (typeMember.MemberType == member.MemberType) {
251
isLastMember = type.ClassType != ClassType.Interface && (typeMember.IsVirtual || typeMember.IsAbstract || !typeMember.IsOverride);
252
yield return typeMember;