Browse Source

Allow find references and rename for local variables and parameters.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@476 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
374101ad6c
  1. 25
      AddIns/ICSharpCode.SharpDevelop.addin
  2. 3
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  3. 27
      src/Main/Base/Project/Src/Dom/Implementations/CombinedReturnType.cs
  4. 21
      src/Main/Base/Project/Src/Dom/Implementations/DefaultTypeParameter.cs
  5. 4
      src/Main/Base/Project/Src/Dom/Implementations/SearchClassReturnType.cs
  6. 8
      src/Main/Base/Project/Src/Dom/MemberLookupHelper.cs
  7. 3
      src/Main/Base/Project/Src/Services/ClassBrowserIcons/ClassBrowserIconService.cs
  8. 23
      src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs
  9. 39
      src/Main/Base/Project/Src/Services/RefactoringService/LocalVariableRefactoring.cs
  10. 30
      src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs
  11. 56
      src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs
  12. 14
      src/Main/Base/Project/Src/TextEditor/Commands/ClassBookmarkMenuBuilder.cs
  13. 22
      src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs

25
AddIns/ICSharpCode.SharpDevelop.addin

@ -1462,6 +1462,31 @@
<MenuItem id = "MenuBuilder" type="Builder" class = "ICSharpCode.SharpDevelop.DefaultEditor.Commands.ClassBookmarkMenuBuilder" /> <MenuItem id = "MenuBuilder" type="Builder" class = "ICSharpCode.SharpDevelop.DefaultEditor.Commands.ClassBookmarkMenuBuilder" />
</Path> </Path>
<Path name = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/Common">
<MenuItem id = "Rename"
label = "${res:SharpDevelop.Refactoring.RenameCommand}"
class = "ICSharpCode.SharpDevelop.Refactoring.RenameLocalVariableCommand"/>
<MenuItem id = "FindReferences"
label = "${res:SharpDevelop.Refactoring.FindReferencesCommand}"
class = "ICSharpCode.SharpDevelop.Refactoring.FindLocalVariableReferencesCommand"/>
</Path>
<Path name = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/LocalVariableDefinition">
<Include id = "Common" path = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/Common"/>
</Path>
<Path name = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/LocalVariable">
<Include id = "Common" path = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/Common"/>
</Path>
<Path name = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/ParameterDefinition">
<Include id = "Common" path = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/Common"/>
</Path>
<Path name = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/Parameter">
<Include id = "Common" path = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/Common"/>
</Path>
<Path name = "/SharpDevelop/ViewContent/DefaultTextEditor/ContextMenu"> <Path name = "/SharpDevelop/ViewContent/DefaultTextEditor/ContextMenu">
<MenuItem id = "Refactoring" type = "Builder" class = "ICSharpCode.SharpDevelop.Refactoring.RefactoringMenuBuilder"/> <MenuItem id = "Refactoring" type = "Builder" class = "ICSharpCode.SharpDevelop.Refactoring.RefactoringMenuBuilder"/>
<Include id = "Cut" item = "/SharpDevelop/Workbench/MainMenu/Edit/Cut"/> <Include id = "Cut" item = "/SharpDevelop/Workbench/MainMenu/Edit/Cut"/>

3
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -672,7 +672,6 @@
<Compile Include="Src\Services\Debugger\CurrentLineBookmark.cs" /> <Compile Include="Src\Services\Debugger\CurrentLineBookmark.cs" />
<Compile Include="Src\Dom\ClassFinder.cs" /> <Compile Include="Src\Dom\ClassFinder.cs" />
<Compile Include="Src\TextEditor\Commands\ClassBookmarkMenuBuilder.cs" /> <Compile Include="Src\TextEditor\Commands\ClassBookmarkMenuBuilder.cs" />
<Compile Include="Src\TextEditor\Commands\ParserBookmarkMenuBuilderBase.cs" />
<Compile Include="Src\TextEditor\SearchAndReplace\Engine\SearchStrategy\BoyerMooreSearchStrategy.cs" /> <Compile Include="Src\TextEditor\SearchAndReplace\Engine\SearchStrategy\BoyerMooreSearchStrategy.cs" />
<Compile Include="Src\Gui\BrowserDisplayBinding\BrowserCommands.cs" /> <Compile Include="Src\Gui\BrowserDisplayBinding\BrowserCommands.cs" />
<Compile Include="Src\Gui\BrowserDisplayBinding\BrowserLocationConditionEvaluator.cs" /> <Compile Include="Src\Gui\BrowserDisplayBinding\BrowserLocationConditionEvaluator.cs" />
@ -700,6 +699,8 @@
<Compile Include="Src\Gui\Components\AutoHide\AutoHideMenuStripContainer.cs" /> <Compile Include="Src\Gui\Components\AutoHide\AutoHideMenuStripContainer.cs" />
<Compile Include="Src\Gui\Components\AutoHide\AutoHideStatusStripContainer.cs" /> <Compile Include="Src\Gui\Components\AutoHide\AutoHideStatusStripContainer.cs" />
<Compile Include="Src\Gui\Components\AutoHide\AutoHideContainer.cs" /> <Compile Include="Src\Gui\Components\AutoHide\AutoHideContainer.cs" />
<Compile Include="Src\Services\RefactoringService\LocalVariableRefactoring.cs" />
<Compile Include="Src\Services\RefactoringService\FindReferencesAndRenameHelper.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\..\Libraries\DockPanel_Src\WinFormsUI\WinFormsUI.csproj"> <ProjectReference Include="..\..\..\Libraries\DockPanel_Src\WinFormsUI\WinFormsUI.csproj">

27
src/Main/Base/Project/Src/Dom/Implementations/CombinedReturnType.cs

@ -14,7 +14,7 @@ namespace ICSharpCode.SharpDevelop.Dom
/// <summary> /// <summary>
/// Combines multiple return types. /// Combines multiple return types.
/// </summary> /// </summary>
public class CombinedReturnType : IReturnType public sealed class CombinedReturnType : IReturnType
{ {
IList<IReturnType> baseTypes; IList<IReturnType> baseTypes;
@ -23,6 +23,31 @@ namespace ICSharpCode.SharpDevelop.Dom
string @namespace; string @namespace;
string dotnetName; string dotnetName;
public override bool Equals(object obj)
{
CombinedReturnType combined = obj as CombinedReturnType;
if (combined == null) return false;
if (baseTypes.Count != combined.baseTypes.Count) return false;
for (int i = 0; i < baseTypes.Count; i++) {
if (!baseTypes[i].Equals(combined.baseTypes[i])) {
return false;
}
}
return true;
}
public override int GetHashCode()
{
unchecked {
int res = 0;
foreach (IReturnType rt in baseTypes) {
res *= 27;
res += rt.GetHashCode();
}
return res;
}
}
public CombinedReturnType(IList<IReturnType> baseTypes, string fullName, string name, string @namespace, string dotnetName) public CombinedReturnType(IList<IReturnType> baseTypes, string fullName, string name, string @namespace, string dotnetName)
{ {
this.baseTypes = baseTypes; this.baseTypes = baseTypes;

21
src/Main/Base/Project/Src/Dom/Implementations/DefaultTypeParameter.cs

@ -103,6 +103,27 @@ namespace ICSharpCode.SharpDevelop.Dom
} }
} }
public override bool Equals(object obj)
{
DefaultTypeParameter tp = obj as DefaultTypeParameter;
if (tp == null) return false;
if (tp.index != index) return false;
if (tp.name != name) return false;
if (tp.hasConstructableContraint != hasConstructableContraint) return false;
if (tp.method != method) {
if (tp.method == null || method == null) return false;
if (tp.method.FullyQualifiedName == method.FullyQualifiedName) return false;
} else {
if (tp.targetClass.FullyQualifiedName == targetClass.FullyQualifiedName) return false;
}
return true;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public override string ToString() public override string ToString()
{ {
return String.Format("[{0}: {1}]", GetType().Name, name); return String.Format("[{0}: {1}]", GetType().Name, name);

4
src/Main/Base/Project/Src/Dom/Implementations/SearchClassReturnType.cs

@ -56,7 +56,9 @@ namespace ICSharpCode.SharpDevelop.Dom
public override int GetHashCode() public override int GetHashCode()
{ {
return declaringClass.GetHashCode() ^ name.GetHashCode(); unchecked {
return declaringClass.GetHashCode() ^ name.GetHashCode() ^ caretLine << 8 + caretColumn;
}
} }
// we need to use a static Dictionary as cache to provide a easy was to clear all cached // we need to use a static Dictionary as cache to provide a easy was to clear all cached

8
src/Main/Base/Project/Src/Dom/MemberLookupHelper.cs

@ -515,7 +515,7 @@ namespace ICSharpCode.SharpDevelop.Dom
// Identity conversion: // Identity conversion:
if (from == to) return true; if (from == to) return true;
if (from == null) return false; if (from == null || to == null) return false;
if (from.Equals(to)) { if (from.Equals(to)) {
return true; return true;
} }
@ -554,7 +554,7 @@ namespace ICSharpCode.SharpDevelop.Dom
if (toIsDefault && (fromIsDefault || from.ArrayDimensions > 0)) { if (toIsDefault && (fromIsDefault || from.ArrayDimensions > 0)) {
IClass c1 = from.GetUnderlyingClass(); IClass c1 = from.GetUnderlyingClass();
IClass c2 = to.GetUnderlyingClass(); IClass c2 = to.GetUnderlyingClass();
if (c1.IsTypeInInheritanceTree(c2)) { if (c1 != null && c1.IsTypeInInheritanceTree(c2)) {
return true; return true;
} }
} }
@ -578,6 +578,10 @@ namespace ICSharpCode.SharpDevelop.Dom
/// </returns> /// </returns>
public static int GetBetterConversion(IReturnType from, IReturnType to1, IReturnType to2) public static int GetBetterConversion(IReturnType from, IReturnType to1, IReturnType to2)
{ {
if (from == null) return 0;
if (to1 == null) return 2;
if (to2 == null) return 1;
// See ECMA-334, § 14.4.2.3 // See ECMA-334, § 14.4.2.3
// If T1 and T2 are the same type, neither conversion is better. // If T1 and T2 are the same type, neither conversion is better.

3
src/Main/Base/Project/Src/Services/ClassBrowserIcons/ClassBrowserIconService.cs

@ -26,6 +26,9 @@ namespace ICSharpCode.Core
public const int LiteralIndex = 15; public const int LiteralIndex = 15;
public const int GotoArrowIndex = 13; public const int GotoArrowIndex = 13;
public const int LocalVariableIndex = FieldIndex + privateModifierOffset;
public const int ParameterIndex = FieldIndex + privateModifierOffset;
public const int ClassIndex = 16; public const int ClassIndex = 16;
public const int StructIndex = ClassIndex + 1 * 4; public const int StructIndex = ClassIndex + 1 * 4;
public const int InterfaceIndex = ClassIndex + 2 * 4; public const int InterfaceIndex = ClassIndex + 2 * 4;

23
src/Main/Base/Project/Src/TextEditor/Commands/ParserBookmarkMenuBuilderBase.cs → src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs

@ -19,13 +19,12 @@ using ICSharpCode.SharpDevelop.Bookmarks;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using SearchAndReplace; using SearchAndReplace;
using ICSharpCode.SharpDevelop.DefaultEditor.Commands; using ICSharpCode.SharpDevelop.DefaultEditor.Commands;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands namespace ICSharpCode.SharpDevelop.Refactoring
{ {
public class ParserBookmarkMenuBuilderBase public static class FindReferencesAndRenameHelper
{ {
protected ProvidedDocumentInformation GetDocumentInformation(string fileName) public static ProvidedDocumentInformation GetDocumentInformation(string fileName)
{ {
foreach (IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection) { foreach (IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection) {
if (content is ITextEditorControlProvider && if (content is ITextEditorControlProvider &&
@ -39,12 +38,12 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
return new ProvidedDocumentInformation(strategy, fileName, 0); return new ProvidedDocumentInformation(strategy, fileName, 0);
} }
protected bool IsReadOnly(IClass c) public static bool IsReadOnly(IClass c)
{ {
return c.CompilationUnit.FileName == null; return c.CompilationUnit.FileName == null;
} }
protected TextEditorControl JumpToDefinition(IMember member) public static TextEditorControl JumpToDefinition(IMember member)
{ {
IViewContent viewContent = null; IViewContent viewContent = null;
ICompilationUnit cu = member.DeclaringType.CompilationUnit; ICompilationUnit cu = member.DeclaringType.CompilationUnit;
@ -62,7 +61,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
return (tecp == null) ? null : tecp.TextEditorControl; return (tecp == null) ? null : tecp.TextEditorControl;
} }
protected TextEditorControl JumpBehindDefinition(IMember member) public static TextEditorControl JumpBehindDefinition(IMember member)
{ {
IViewContent viewContent = null; IViewContent viewContent = null;
ICompilationUnit cu = member.DeclaringType.CompilationUnit; ICompilationUnit cu = member.DeclaringType.CompilationUnit;
@ -80,7 +79,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
return (tecp == null) ? null : tecp.TextEditorControl; return (tecp == null) ? null : tecp.TextEditorControl;
} }
protected bool CheckName(string name) public static bool CheckName(string name)
{ {
if (name == null || name.Length == 0) if (name == null || name.Length == 0)
return false; return false;
@ -97,7 +96,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
return true; return true;
} }
protected struct Modification public struct Modification
{ {
public IDocument Document; public IDocument Document;
public int Offset; public int Offset;
@ -111,7 +110,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
} }
} }
protected void ModifyDocument(List<Modification> modifications, IDocument doc, int offset, int length, string newName) public static void ModifyDocument(List<Modification> modifications, IDocument doc, int offset, int length, string newName)
{ {
foreach (Modification m in modifications) { foreach (Modification m in modifications) {
if (m.Document == doc) { if (m.Document == doc) {
@ -135,7 +134,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
} }
} }
protected void ShowAsSearchResults(string pattern, List<Reference> list) public static void ShowAsSearchResults(string pattern, List<Reference> list)
{ {
if (list == null) return; if (list == null) return;
List<SearchResult> results = new List<SearchResult>(list.Count); List<SearchResult> results = new List<SearchResult>(list.Count);
@ -147,7 +146,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
SearchReplaceInFilesManager.ShowSearchResults(pattern, results); SearchReplaceInFilesManager.ShowSearchResults(pattern, results);
} }
protected void RenameReferences(List<Reference> list, string newName) public static void RenameReferences(List<Reference> list, string newName)
{ {
List<IViewContent> modifiedContents = new List<IViewContent>(); List<IViewContent> modifiedContents = new List<IViewContent>();
List<Modification> modifications = new List<Modification>(); List<Modification> modifications = new List<Modification>();

39
src/Main/Base/Project/Src/Services/RefactoringService/LocalVariableRefactoring.cs

@ -0,0 +1,39 @@
// <file>
// <copyright see="prj:///doc/copyright.txt">2002-2005 AlphaSierraPapa</copyright>
// <license see="prj:///doc/license.txt">GNU General Public License</license>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
namespace ICSharpCode.SharpDevelop.Refactoring
{
public class FindLocalVariableReferencesCommand : AbstractMenuCommand
{
public override void Run()
{
LocalResolveResult local = (LocalResolveResult)Owner;
List<Reference> list = RefactoringService.FindReferences(local, null);
FindReferencesAndRenameHelper.ShowAsSearchResults("References to " + local.Field.Name, list);
}
}
public class RenameLocalVariableCommand : AbstractMenuCommand
{
public override void Run()
{
LocalResolveResult local = (LocalResolveResult)Owner;
string newName = MessageService.ShowInputBox("${res:SharpDevelop.Refactoring.Rename}", "${res:SharpDevelop.Refactoring.RenameMemberText}", local.Field.Name);
if (!FindReferencesAndRenameHelper.CheckName(newName)) return;
List<Reference> list = RefactoringService.FindReferences(local, null);
if (list == null) return;
FindReferencesAndRenameHelper.RenameReferences(list, newName);
}
}
}

30
src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs

@ -73,8 +73,13 @@ namespace ICSharpCode.SharpDevelop.Refactoring
item = MakeItem(definitions, ((MemberResolveResult)rr).ResolvedMember); item = MakeItem(definitions, ((MemberResolveResult)rr).ResolvedMember);
} else if (rr is TypeResolveResult) { } else if (rr is TypeResolveResult) {
item = MakeItem(definitions, ((TypeResolveResult)rr).ResolvedClass); item = MakeItem(definitions, ((TypeResolveResult)rr).ResolvedClass);
} else if (rr is LocalResolveResult) {
item = MakeItem((LocalResolveResult)rr, caretLine + 1 == ((LocalResolveResult)rr).Field.Region.BeginLine);
} }
if (item != null) { if (item != null) {
if (rr is LocalResolveResult)
resultItems.Insert(0, item);
else
resultItems.Add(item); resultItems.Add(item);
} }
@ -100,8 +105,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring
} }
} }
// TODO XML.TextAreaContextMenu.Refactoring
if (resultItems.Count == 0) { if (resultItems.Count == 0) {
return new ToolStripItem[0]; return new ToolStripItem[0];
} else { } else {
@ -128,6 +131,19 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return null; return null;
} }
ToolStripMenuItem MakeItem(LocalResolveResult local, bool isDefinition)
{
ToolStripMenuItem item = MakeItemInternal(MemberNode.GetText(local.Field),
local.IsParameter ? ClassBrowserIconService.ParameterIndex : ClassBrowserIconService.LocalVariableIndex,
local.CallingClass.CompilationUnit,
isDefinition ? DomRegion.Empty : local.Field.Region);
string treePath = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/";
treePath += local.IsParameter ? "Parameter" : "LocalVariable";
if (isDefinition) treePath += "Definition";
MenuService.AddItemsToMenu(item.DropDown.Items, local, treePath);
return item;
}
ToolStripMenuItem MakeItem(List<string> definitions, IMember member) ToolStripMenuItem MakeItem(List<string> definitions, IMember member)
{ {
if (member == null) return null; if (member == null) return null;
@ -143,7 +159,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return item; return item;
} }
ToolStripMenuItem MakeItem(List<string> definitions, IClass c) ToolStripMenuItem MakeItem(List<string> definitions, IClass c)
{ {
if (c == null) return null; if (c == null) return null;
@ -154,9 +169,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return MakeItem(c.FullyQualifiedName, new ClassNode(c.ProjectContent.Project, c), c.CompilationUnit, c.Region); return MakeItem(c.FullyQualifiedName, new ClassNode(c.ProjectContent.Project, c), c.CompilationUnit, c.Region);
} }
ToolStripMenuItem MakeItem(string title, ExtTreeNode classBrowserTreeNode, ICompilationUnit cu, DomRegion region) ToolStripMenuItem MakeItemInternal(string title, int imageIndex, ICompilationUnit cu, DomRegion region)
{ {
ToolStripMenuItem item = new ToolStripMenuItem(classBrowserTreeNode.Text, ClassBrowserIconService.ImageList.Images[classBrowserTreeNode.ImageIndex]); ToolStripMenuItem item = new ToolStripMenuItem(title, ClassBrowserIconService.ImageList.Images[imageIndex]);
//ToolStripMenuItem titleItem = new ToolStripMenuItem(title); //ToolStripMenuItem titleItem = new ToolStripMenuItem(title);
//titleItem.Enabled = false; //titleItem.Enabled = false;
@ -173,7 +188,12 @@ namespace ICSharpCode.SharpDevelop.Refactoring
item.DropDown.Items.Add(gotoDefinitionItem); item.DropDown.Items.Add(gotoDefinitionItem);
item.DropDown.Items.Add(new ToolStripSeparator()); item.DropDown.Items.Add(new ToolStripSeparator());
} }
return item;
}
ToolStripMenuItem MakeItem(string title, ExtTreeNode classBrowserTreeNode, ICompilationUnit cu, DomRegion region)
{
ToolStripMenuItem item = MakeItemInternal(classBrowserTreeNode.Text, classBrowserTreeNode.ImageIndex, cu, region);
MenuService.AddItemsToMenu(item.DropDown.Items, classBrowserTreeNode, classBrowserTreeNode.ContextmenuAddinTreePath); MenuService.AddItemsToMenu(item.DropDown.Items, classBrowserTreeNode, classBrowserTreeNode.ContextmenuAddinTreePath);
return item; return item;
} }

56
src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs

@ -71,7 +71,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
/// </summary> /// </summary>
public static List<Reference> FindReferences(IMember member, IProgressMonitor progressMonitor) public static List<Reference> FindReferences(IMember member, IProgressMonitor progressMonitor)
{ {
return RunFindReferences(member.DeclaringType, member, progressMonitor); return RunFindReferences(member.DeclaringType, member, false, progressMonitor);
} }
/// <summary> /// <summary>
@ -79,16 +79,35 @@ namespace ICSharpCode.SharpDevelop.Refactoring
/// </summary> /// </summary>
public static List<Reference> FindReferences(IClass @class, IProgressMonitor progressMonitor) public static List<Reference> FindReferences(IClass @class, IProgressMonitor progressMonitor)
{ {
return RunFindReferences(@class, null, progressMonitor); return RunFindReferences(@class, null, false, progressMonitor);
} }
static List<Reference> RunFindReferences(IClass ownerClass, IMember member, IProgressMonitor progressMonitor) /// <summary>
/// Find all references to the specified local variable.
/// </summary>
public static List<Reference> FindReferences(LocalResolveResult local, IProgressMonitor progressMonitor)
{
return RunFindReferences(local.CallingClass, local.Field, true, progressMonitor);
}
/// <summary>
/// This method can be used in three modes:
/// 1. Find references to classes (parentClass = targetClass, member = null, isLocal = false)
/// 2. Find references to members (parentClass = parent, member = member, isLocal = false)
/// 3. Find references to local variables (parentClass = parent, member = local var as field, isLocal = true)
/// </summary>
static List<Reference> RunFindReferences(IClass ownerClass, IMember member,
bool isLocal,
IProgressMonitor progressMonitor)
{ {
if (ParserService.LoadSolutionProjectsThreadRunning) { if (ParserService.LoadSolutionProjectsThreadRunning) {
MessageService.ShowMessage("${res:SharpDevelop.Refactoring.LoadSolutionProjectsThreadRunning}"); MessageService.ShowMessage("${res:SharpDevelop.Refactoring.LoadSolutionProjectsThreadRunning}");
return null; return null;
} }
if (!isLocal) {
// for local va
ownerClass = FixClass(ownerClass); ownerClass = FixClass(ownerClass);
}
List<ProjectItem> files = GetPossibleFiles(ownerClass, member); List<ProjectItem> files = GetPossibleFiles(ownerClass, member);
ParseableFileContentEnumerator enumerator = new ParseableFileContentEnumerator(files.ToArray()); ParseableFileContentEnumerator enumerator = new ParseableFileContentEnumerator(files.ToArray());
List<Reference> references = new List<Reference>(); List<Reference> references = new List<Reference>();
@ -106,7 +125,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
progressMonitor.WorkDone = enumerator.Index; progressMonitor.WorkDone = enumerator.Index;
} }
AddReferences(references, ownerClass, member, enumerator.CurrentFileName, enumerator.CurrentFileContent); AddReferences(references, ownerClass, member, isLocal, enumerator.CurrentFileName, enumerator.CurrentFileContent);
} }
} finally { } finally {
if (progressMonitor != null) { if (progressMonitor != null) {
@ -117,7 +136,13 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return references; return references;
} }
static void AddReferences(List<Reference> list, IClass parentClass, IMember member, string fileName, string fileContent) /// <summary>
/// This method can be used in three modes (like RunFindReferences)
/// </summary>
static void AddReferences(List<Reference> list,
IClass parentClass, IMember member,
bool isLocal,
string fileName, string fileContent)
{ {
string lowerFileContent = fileContent.ToLower(); string lowerFileContent = fileContent.ToLower();
string searchedText; // the text that is searched for string searchedText; // the text that is searched for
@ -157,7 +182,12 @@ namespace ICSharpCode.SharpDevelop.Refactoring
// found in this file (the resolver should parse all methods at once) // found in this file (the resolver should parse all methods at once)
ResolveResult rr = ParserService.Resolve(expr, position.Y, position.X, fileName, fileContent); ResolveResult rr = ParserService.Resolve(expr, position.Y, position.X, fileName, fileContent);
MemberResolveResult mrr = rr as MemberResolveResult; MemberResolveResult mrr = rr as MemberResolveResult;
if (member != null) { if (isLocal) {
// find reference to local variable
if (IsReferenceToLocalVariable(rr, member)) {
list.Add(new Reference(fileName, pos, searchedText.Length, expr.Expression, rr));
}
} else if (member != null) {
// find reference to member // find reference to member
if (IsReferenceToMember(member, rr)) { if (IsReferenceToMember(member, rr)) {
list.Add(new Reference(fileName, pos, searchedText.Length, expr.Expression, rr)); list.Add(new Reference(fileName, pos, searchedText.Length, expr.Expression, rr));
@ -304,6 +334,20 @@ namespace ICSharpCode.SharpDevelop.Refactoring
} }
#endregion #endregion
public static bool IsReferenceToLocalVariable(ResolveResult rr, IMember variable)
{
LocalResolveResult local = rr as LocalResolveResult;
if (local == null) {
return false;
} else {
return local.Field.Region.BeginLine == variable.Region.BeginLine
&& local.Field.Region.BeginColumn == variable.Region.BeginColumn;
}
}
/// <summary>
/// Gets if <paramref name="rr"/> is a reference to <paramref name="member"/>.
/// </summary>
public static bool IsReferenceToMember(IMember member, ResolveResult rr) public static bool IsReferenceToMember(IMember member, ResolveResult rr)
{ {
MemberResolveResult mrr = rr as MemberResolveResult; MemberResolveResult mrr = rr as MemberResolveResult;

14
src/Main/Base/Project/Src/TextEditor/Commands/ClassBookmarkMenuBuilder.cs

@ -26,7 +26,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
/// <summary> /// <summary>
/// Build context menu for class members in the text editor. /// Build context menu for class members in the text editor.
/// </summary> /// </summary>
public class ClassBookmarkMenuBuilder : ParserBookmarkMenuBuilderBase, ISubmenuBuilder public class ClassBookmarkMenuBuilder : ISubmenuBuilder
{ {
public ToolStripItem[] BuildSubmenu(Codon codon, object owner) public ToolStripItem[] BuildSubmenu(Codon codon, object owner)
{ {
@ -41,7 +41,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
} }
List<ToolStripItem> list = new List<ToolStripItem>(); List<ToolStripItem> list = new List<ToolStripItem>();
if (!IsReadOnly(c)) { if (!FindReferencesAndRenameHelper.IsReadOnly(c)) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.RenameCommand}", Rename); cmd = new MenuCommand("${res:SharpDevelop.Refactoring.RenameCommand}", Rename);
cmd.Tag = c; cmd.Tag = c;
list.Add(cmd); list.Add(cmd);
@ -85,7 +85,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
IClass c = (IClass)item.Tag; IClass c = (IClass)item.Tag;
c = c.DefaultReturnType.GetUnderlyingClass(); // get compound class if class is partial c = c.DefaultReturnType.GetUnderlyingClass(); // get compound class if class is partial
string newName = MessageService.ShowInputBox("${res:SharpDevelop.Refactoring.Rename}", "${res:SharpDevelop.Refactoring.RenameClassText}", c.Name); string newName = MessageService.ShowInputBox("${res:SharpDevelop.Refactoring.Rename}", "${res:SharpDevelop.Refactoring.RenameClassText}", c.Name);
if (!CheckName(newName)) return; if (!FindReferencesAndRenameHelper.CheckName(newName)) return;
List<Reference> list = RefactoringService.FindReferences(c, null); List<Reference> list = RefactoringService.FindReferences(c, null);
if (list == null) return; if (list == null) return;
@ -102,14 +102,14 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
} }
} }
RenameReferences(list, newName); FindReferencesAndRenameHelper.RenameReferences(list, newName);
} }
void AddDeclarationAsReference(List<Reference> list, string fileName, DomRegion region, string name) void AddDeclarationAsReference(List<Reference> list, string fileName, DomRegion region, string name)
{ {
if (fileName == null) if (fileName == null)
return; return;
ProvidedDocumentInformation documentInformation = GetDocumentInformation(fileName); ProvidedDocumentInformation documentInformation = FindReferencesAndRenameHelper.GetDocumentInformation(fileName);
int offset = documentInformation.Document.PositionToOffset(new Point(region.BeginColumn - 1, region.BeginLine - 1)); int offset = documentInformation.Document.PositionToOffset(new Point(region.BeginColumn - 1, region.BeginLine - 1));
string text = documentInformation.TextBuffer.GetText(offset, Math.Min(name.Length + 30, documentInformation.TextBuffer.Length - offset - 1)); string text = documentInformation.TextBuffer.GetText(offset, Math.Min(name.Length + 30, documentInformation.TextBuffer.Length - offset - 1));
int offsetChange = text.IndexOf(name); int offsetChange = text.IndexOf(name);
@ -148,7 +148,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
if (derivedClass.CompilationUnit.FileName == null) continue; if (derivedClass.CompilationUnit.FileName == null) continue;
SearchResult res = new SimpleSearchResult(derivedClass.FullyQualifiedName, new Point(derivedClass.Region.BeginColumn - 1, derivedClass.Region.BeginLine - 1)); SearchResult res = new SimpleSearchResult(derivedClass.FullyQualifiedName, new Point(derivedClass.Region.BeginColumn - 1, derivedClass.Region.BeginLine - 1));
res.ProvidedDocumentInformation = GetDocumentInformation(derivedClass.CompilationUnit.FileName); res.ProvidedDocumentInformation = FindReferencesAndRenameHelper.GetDocumentInformation(derivedClass.CompilationUnit.FileName);
results.Add(res); results.Add(res);
} }
SearchReplaceInFilesManager.ShowSearchResults("Classes deriving from " + c.Name, results); SearchReplaceInFilesManager.ShowSearchResults("Classes deriving from " + c.Name, results);
@ -158,7 +158,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
{ {
MenuCommand item = (MenuCommand)sender; MenuCommand item = (MenuCommand)sender;
IClass c = (IClass)item.Tag; IClass c = (IClass)item.Tag;
ShowAsSearchResults("References to " + c.Name, RefactoringService.FindReferences(c, null)); FindReferencesAndRenameHelper.ShowAsSearchResults("References to " + c.Name, RefactoringService.FindReferences(c, null));
} }
} }
} }

22
src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs

@ -25,7 +25,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
/// <summary> /// <summary>
/// Build context menu for class members in the text editor. /// Build context menu for class members in the text editor.
/// </summary> /// </summary>
public class ClassMemberMenuBuilder : ParserBookmarkMenuBuilderBase, ISubmenuBuilder public class ClassMemberMenuBuilder : ISubmenuBuilder
{ {
public ToolStripItem[] BuildSubmenu(Codon codon, object owner) public ToolStripItem[] BuildSubmenu(Codon codon, object owner)
{ {
@ -42,7 +42,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
List<ToolStripItem> list = new List<ToolStripItem>(); List<ToolStripItem> list = new List<ToolStripItem>();
if (method == null || !method.IsConstructor) { if (method == null || !method.IsConstructor) {
if (!IsReadOnly(member.DeclaringType)) { if (!FindReferencesAndRenameHelper.IsReadOnly(member.DeclaringType)) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.RenameCommand}", Rename); cmd = new MenuCommand("${res:SharpDevelop.Refactoring.RenameCommand}", Rename);
cmd.Tag = member; cmd.Tag = member;
list.Add(cmd); list.Add(cmd);
@ -70,7 +70,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
cmd.Tag = foundProperty; cmd.Tag = foundProperty;
list.Add(cmd); list.Add(cmd);
} else { } else {
if (!IsReadOnly(member.DeclaringType)) { if (!FindReferencesAndRenameHelper.IsReadOnly(member.DeclaringType)) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.CreateGetter}", CreateGetter); cmd = new MenuCommand("${res:SharpDevelop.Refactoring.CreateGetter}", CreateGetter);
cmd.Tag = member; cmd.Tag = member;
list.Add(cmd); list.Add(cmd);
@ -112,7 +112,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
{ {
MenuCommand item = (MenuCommand)sender; MenuCommand item = (MenuCommand)sender;
IMember member = (IMember)item.Tag; IMember member = (IMember)item.Tag;
TextEditorControl textEditor = JumpBehindDefinition(member); TextEditorControl textEditor = FindReferencesAndRenameHelper.JumpBehindDefinition(member);
AbstractPropertyCodeGenerator generator; AbstractPropertyCodeGenerator generator;
if (includeSetter) if (includeSetter)
@ -132,7 +132,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
void GotoTagMember(object sender, EventArgs e) void GotoTagMember(object sender, EventArgs e)
{ {
JumpToDefinition((IMember)(sender as MenuCommand).Tag); FindReferencesAndRenameHelper.JumpToDefinition((IMember)(sender as MenuCommand).Tag);
} }
void GoToBase(object sender, EventArgs e) void GoToBase(object sender, EventArgs e)
@ -141,7 +141,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
IMember member = (IMember)item.Tag; IMember member = (IMember)item.Tag;
IMember baseMember = RefactoringService.FindBaseMember(member); IMember baseMember = RefactoringService.FindBaseMember(member);
if (baseMember != null) { if (baseMember != null) {
JumpToDefinition(baseMember); FindReferencesAndRenameHelper.JumpToDefinition(baseMember);
} }
} }
@ -150,11 +150,11 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
MenuCommand item = (MenuCommand)sender; MenuCommand item = (MenuCommand)sender;
IMember member = (IMember)item.Tag; IMember member = (IMember)item.Tag;
string newName = MessageService.ShowInputBox("${res:SharpDevelop.Refactoring.Rename}", "${res:SharpDevelop.Refactoring.RenameMemberText}", member.Name); string newName = MessageService.ShowInputBox("${res:SharpDevelop.Refactoring.Rename}", "${res:SharpDevelop.Refactoring.RenameMemberText}", member.Name);
if (!CheckName(newName)) return; if (!FindReferencesAndRenameHelper.CheckName(newName)) return;
List<Reference> list = RefactoringService.FindReferences(member, null); List<Reference> list = RefactoringService.FindReferences(member, null);
if (list == null) return; if (list == null) return;
RenameReferences(list, newName); FindReferencesAndRenameHelper.RenameReferences(list, newName);
if (member is IField) { if (member is IField) {
IProperty property = FindProperty((IField)member); IProperty property = FindProperty((IField)member);
@ -164,7 +164,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
if (MessageService.AskQuestionFormatted("${res:SharpDevelop.Refactoring.Rename}", "${res:SharpDevelop.Refactoring.RenameFieldAndProperty}", property.FullyQualifiedName, newPropertyName)) { if (MessageService.AskQuestionFormatted("${res:SharpDevelop.Refactoring.Rename}", "${res:SharpDevelop.Refactoring.RenameFieldAndProperty}", property.FullyQualifiedName, newPropertyName)) {
list = RefactoringService.FindReferences(property, null); list = RefactoringService.FindReferences(property, null);
if (list != null) { if (list != null) {
RenameReferences(list, newPropertyName); FindReferencesAndRenameHelper.RenameReferences(list, newPropertyName);
} }
} }
} }
@ -184,7 +184,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
IMember m = RefactoringService.FindSimilarMember(derivedClass, member); IMember m = RefactoringService.FindSimilarMember(derivedClass, member);
if (m != null && !m.Region.IsEmpty) { if (m != null && !m.Region.IsEmpty) {
SearchResult res = new SimpleSearchResult(m.FullyQualifiedName, new Point(m.Region.BeginColumn - 1, m.Region.BeginLine - 1)); SearchResult res = new SimpleSearchResult(m.FullyQualifiedName, new Point(m.Region.BeginColumn - 1, m.Region.BeginLine - 1));
res.ProvidedDocumentInformation = GetDocumentInformation(derivedClass.CompilationUnit.FileName); res.ProvidedDocumentInformation = FindReferencesAndRenameHelper.GetDocumentInformation(derivedClass.CompilationUnit.FileName);
results.Add(res); results.Add(res);
} }
} }
@ -195,7 +195,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
{ {
MenuCommand item = (MenuCommand)sender; MenuCommand item = (MenuCommand)sender;
IMember member = (IMember)item.Tag; IMember member = (IMember)item.Tag;
ShowAsSearchResults("References to " + member.Name, RefactoringService.FindReferences(member, null)); FindReferencesAndRenameHelper.ShowAsSearchResults("References to " + member.Name, RefactoringService.FindReferences(member, null));
} }
} }
} }

Loading…
Cancel
Save