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. 34
      src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs
  11. 58
      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 @@ @@ -1462,6 +1462,31 @@
<MenuItem id = "MenuBuilder" type="Builder" class = "ICSharpCode.SharpDevelop.DefaultEditor.Commands.ClassBookmarkMenuBuilder" />
</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">
<MenuItem id = "Refactoring" type = "Builder" class = "ICSharpCode.SharpDevelop.Refactoring.RefactoringMenuBuilder"/>
<Include id = "Cut" item = "/SharpDevelop/Workbench/MainMenu/Edit/Cut"/>

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

@ -672,7 +672,6 @@ @@ -672,7 +672,6 @@
<Compile Include="Src\Services\Debugger\CurrentLineBookmark.cs" />
<Compile Include="Src\Dom\ClassFinder.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\Gui\BrowserDisplayBinding\BrowserCommands.cs" />
<Compile Include="Src\Gui\BrowserDisplayBinding\BrowserLocationConditionEvaluator.cs" />
@ -700,6 +699,8 @@ @@ -700,6 +699,8 @@
<Compile Include="Src\Gui\Components\AutoHide\AutoHideMenuStripContainer.cs" />
<Compile Include="Src\Gui\Components\AutoHide\AutoHideStatusStripContainer.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>
<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 @@ -14,7 +14,7 @@ namespace ICSharpCode.SharpDevelop.Dom
/// <summary>
/// Combines multiple return types.
/// </summary>
public class CombinedReturnType : IReturnType
public sealed class CombinedReturnType : IReturnType
{
IList<IReturnType> baseTypes;
@ -23,6 +23,31 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -23,6 +23,31 @@ namespace ICSharpCode.SharpDevelop.Dom
string @namespace;
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)
{
this.baseTypes = baseTypes;

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

@ -103,6 +103,27 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -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()
{
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 @@ -56,7 +56,9 @@ namespace ICSharpCode.SharpDevelop.Dom
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

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

@ -515,7 +515,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -515,7 +515,7 @@ namespace ICSharpCode.SharpDevelop.Dom
// Identity conversion:
if (from == to) return true;
if (from == null) return false;
if (from == null || to == null) return false;
if (from.Equals(to)) {
return true;
}
@ -554,7 +554,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -554,7 +554,7 @@ namespace ICSharpCode.SharpDevelop.Dom
if (toIsDefault && (fromIsDefault || from.ArrayDimensions > 0)) {
IClass c1 = from.GetUnderlyingClass();
IClass c2 = to.GetUnderlyingClass();
if (c1.IsTypeInInheritanceTree(c2)) {
if (c1 != null && c1.IsTypeInInheritanceTree(c2)) {
return true;
}
}
@ -578,6 +578,10 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -578,6 +578,10 @@ namespace ICSharpCode.SharpDevelop.Dom
/// </returns>
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
// 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 @@ -26,6 +26,9 @@ namespace ICSharpCode.Core
public const int LiteralIndex = 15;
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 StructIndex = ClassIndex + 1 * 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; @@ -19,13 +19,12 @@ using ICSharpCode.SharpDevelop.Bookmarks;
using ICSharpCode.SharpDevelop.Gui;
using SearchAndReplace;
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) {
if (content is ITextEditorControlProvider &&
@ -39,12 +38,12 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -39,12 +38,12 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
return new ProvidedDocumentInformation(strategy, fileName, 0);
}
protected bool IsReadOnly(IClass c)
public static bool IsReadOnly(IClass c)
{
return c.CompilationUnit.FileName == null;
}
protected TextEditorControl JumpToDefinition(IMember member)
public static TextEditorControl JumpToDefinition(IMember member)
{
IViewContent viewContent = null;
ICompilationUnit cu = member.DeclaringType.CompilationUnit;
@ -62,7 +61,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -62,7 +61,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
return (tecp == null) ? null : tecp.TextEditorControl;
}
protected TextEditorControl JumpBehindDefinition(IMember member)
public static TextEditorControl JumpBehindDefinition(IMember member)
{
IViewContent viewContent = null;
ICompilationUnit cu = member.DeclaringType.CompilationUnit;
@ -80,7 +79,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -80,7 +79,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
return (tecp == null) ? null : tecp.TextEditorControl;
}
protected bool CheckName(string name)
public static bool CheckName(string name)
{
if (name == null || name.Length == 0)
return false;
@ -97,7 +96,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -97,7 +96,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
return true;
}
protected struct Modification
public struct Modification
{
public IDocument Document;
public int Offset;
@ -111,7 +110,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -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) {
if (m.Document == doc) {
@ -135,7 +134,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -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;
List<SearchResult> results = new List<SearchResult>(list.Count);
@ -147,7 +146,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -147,7 +146,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
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<Modification> modifications = new List<Modification>();

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

@ -0,0 +1,39 @@ @@ -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);
}
}
}

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

@ -73,9 +73,14 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -73,9 +73,14 @@ namespace ICSharpCode.SharpDevelop.Refactoring
item = MakeItem(definitions, ((MemberResolveResult)rr).ResolvedMember);
} else if (rr is TypeResolveResult) {
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) {
resultItems.Add(item);
if (rr is LocalResolveResult)
resultItems.Insert(0, item);
else
resultItems.Add(item);
}
// Include menu for current class and method
@ -100,8 +105,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -100,8 +105,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring
}
}
// TODO XML.TextAreaContextMenu.Refactoring
if (resultItems.Count == 0) {
return new ToolStripItem[0];
} else {
@ -128,6 +131,19 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -128,6 +131,19 @@ namespace ICSharpCode.SharpDevelop.Refactoring
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)
{
if (member == null) return null;
@ -143,7 +159,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -143,7 +159,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return item;
}
ToolStripMenuItem MakeItem(List<string> definitions, IClass c)
{
if (c == null) return null;
@ -154,9 +169,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -154,9 +169,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring
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);
//titleItem.Enabled = false;
@ -173,7 +188,12 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -173,7 +188,12 @@ namespace ICSharpCode.SharpDevelop.Refactoring
item.DropDown.Items.Add(gotoDefinitionItem);
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);
return item;
}

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

@ -71,7 +71,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -71,7 +71,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
/// </summary>
public static List<Reference> FindReferences(IMember member, IProgressMonitor progressMonitor)
{
return RunFindReferences(member.DeclaringType, member, progressMonitor);
return RunFindReferences(member.DeclaringType, member, false, progressMonitor);
}
/// <summary>
@ -79,16 +79,35 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -79,16 +79,35 @@ namespace ICSharpCode.SharpDevelop.Refactoring
/// </summary>
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) {
MessageService.ShowMessage("${res:SharpDevelop.Refactoring.LoadSolutionProjectsThreadRunning}");
return null;
}
ownerClass = FixClass(ownerClass);
if (!isLocal) {
// for local va
ownerClass = FixClass(ownerClass);
}
List<ProjectItem> files = GetPossibleFiles(ownerClass, member);
ParseableFileContentEnumerator enumerator = new ParseableFileContentEnumerator(files.ToArray());
List<Reference> references = new List<Reference>();
@ -106,7 +125,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -106,7 +125,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
progressMonitor.WorkDone = enumerator.Index;
}
AddReferences(references, ownerClass, member, enumerator.CurrentFileName, enumerator.CurrentFileContent);
AddReferences(references, ownerClass, member, isLocal, enumerator.CurrentFileName, enumerator.CurrentFileContent);
}
} finally {
if (progressMonitor != null) {
@ -117,7 +136,13 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -117,7 +136,13 @@ namespace ICSharpCode.SharpDevelop.Refactoring
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 searchedText; // the text that is searched for
@ -157,7 +182,12 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -157,7 +182,12 @@ namespace ICSharpCode.SharpDevelop.Refactoring
// found in this file (the resolver should parse all methods at once)
ResolveResult rr = ParserService.Resolve(expr, position.Y, position.X, fileName, fileContent);
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
if (IsReferenceToMember(member, rr)) {
list.Add(new Reference(fileName, pos, searchedText.Length, expr.Expression, rr));
@ -304,6 +334,20 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -304,6 +334,20 @@ namespace ICSharpCode.SharpDevelop.Refactoring
}
#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)
{
MemberResolveResult mrr = rr as MemberResolveResult;

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

@ -26,7 +26,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -26,7 +26,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
/// <summary>
/// Build context menu for class members in the text editor.
/// </summary>
public class ClassBookmarkMenuBuilder : ParserBookmarkMenuBuilderBase, ISubmenuBuilder
public class ClassBookmarkMenuBuilder : ISubmenuBuilder
{
public ToolStripItem[] BuildSubmenu(Codon codon, object owner)
{
@ -41,7 +41,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -41,7 +41,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
}
List<ToolStripItem> list = new List<ToolStripItem>();
if (!IsReadOnly(c)) {
if (!FindReferencesAndRenameHelper.IsReadOnly(c)) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.RenameCommand}", Rename);
cmd.Tag = c;
list.Add(cmd);
@ -85,7 +85,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -85,7 +85,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
IClass c = (IClass)item.Tag;
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);
if (!CheckName(newName)) return;
if (!FindReferencesAndRenameHelper.CheckName(newName)) return;
List<Reference> list = RefactoringService.FindReferences(c, null);
if (list == null) return;
@ -102,14 +102,14 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -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)
{
if (fileName == null)
return;
ProvidedDocumentInformation documentInformation = GetDocumentInformation(fileName);
ProvidedDocumentInformation documentInformation = FindReferencesAndRenameHelper.GetDocumentInformation(fileName);
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));
int offsetChange = text.IndexOf(name);
@ -148,7 +148,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -148,7 +148,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
if (derivedClass.CompilationUnit.FileName == null) continue;
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);
}
SearchReplaceInFilesManager.ShowSearchResults("Classes deriving from " + c.Name, results);
@ -158,7 +158,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -158,7 +158,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
{
MenuCommand item = (MenuCommand)sender;
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 @@ -25,7 +25,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
/// <summary>
/// Build context menu for class members in the text editor.
/// </summary>
public class ClassMemberMenuBuilder : ParserBookmarkMenuBuilderBase, ISubmenuBuilder
public class ClassMemberMenuBuilder : ISubmenuBuilder
{
public ToolStripItem[] BuildSubmenu(Codon codon, object owner)
{
@ -42,7 +42,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -42,7 +42,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
List<ToolStripItem> list = new List<ToolStripItem>();
if (method == null || !method.IsConstructor) {
if (!IsReadOnly(member.DeclaringType)) {
if (!FindReferencesAndRenameHelper.IsReadOnly(member.DeclaringType)) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.RenameCommand}", Rename);
cmd.Tag = member;
list.Add(cmd);
@ -70,7 +70,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -70,7 +70,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
cmd.Tag = foundProperty;
list.Add(cmd);
} else {
if (!IsReadOnly(member.DeclaringType)) {
if (!FindReferencesAndRenameHelper.IsReadOnly(member.DeclaringType)) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.CreateGetter}", CreateGetter);
cmd.Tag = member;
list.Add(cmd);
@ -112,7 +112,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -112,7 +112,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
{
MenuCommand item = (MenuCommand)sender;
IMember member = (IMember)item.Tag;
TextEditorControl textEditor = JumpBehindDefinition(member);
TextEditorControl textEditor = FindReferencesAndRenameHelper.JumpBehindDefinition(member);
AbstractPropertyCodeGenerator generator;
if (includeSetter)
@ -132,7 +132,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -132,7 +132,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
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)
@ -141,7 +141,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -141,7 +141,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
IMember member = (IMember)item.Tag;
IMember baseMember = RefactoringService.FindBaseMember(member);
if (baseMember != null) {
JumpToDefinition(baseMember);
FindReferencesAndRenameHelper.JumpToDefinition(baseMember);
}
}
@ -150,11 +150,11 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -150,11 +150,11 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
MenuCommand item = (MenuCommand)sender;
IMember member = (IMember)item.Tag;
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);
if (list == null) return;
RenameReferences(list, newName);
FindReferencesAndRenameHelper.RenameReferences(list, newName);
if (member is IField) {
IProperty property = FindProperty((IField)member);
@ -164,7 +164,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -164,7 +164,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
if (MessageService.AskQuestionFormatted("${res:SharpDevelop.Refactoring.Rename}", "${res:SharpDevelop.Refactoring.RenameFieldAndProperty}", property.FullyQualifiedName, newPropertyName)) {
list = RefactoringService.FindReferences(property, null);
if (list != null) {
RenameReferences(list, newPropertyName);
FindReferencesAndRenameHelper.RenameReferences(list, newPropertyName);
}
}
}
@ -184,7 +184,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -184,7 +184,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
IMember m = RefactoringService.FindSimilarMember(derivedClass, member);
if (m != null && !m.Region.IsEmpty) {
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);
}
}
@ -195,7 +195,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -195,7 +195,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
{
MenuCommand item = (MenuCommand)sender;
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