From 9957c52ff228b000266662289533fd51e802980f Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 31 Aug 2011 09:40:14 +0200 Subject: [PATCH] Implemented "Find references" --- SharpDevelop.sln | 92 ++++++------- .../Project/CSharpBinding.csproj | 1 + .../Project/Src/Parser/CSharpSymbolSearch.cs | 124 +++++++++++++++++ .../Project/Src/Project/CSharpProject.cs | 5 + .../AvalonEdit.AddIn/Src/IconBarManager.cs | 31 +---- .../Project/Gui/SearchResultNode.cs | 53 ++++---- .../CSharp/Resolver/FindReferences.cs | 46 +++---- .../CSharp/Resolver/LocalResolveResult.cs | 5 + .../CSharp/Resolver/MemberResolveResult.cs | 5 + .../CSharp/Resolver/ResolveAtLocation.cs | 2 + .../CSharp/Resolver/ResolveResult.cs | 5 + .../CSharp/Resolver/TypeResolveResult.cs | 9 ++ .../Project/ICSharpCode.SharpDevelop.addin | 32 +---- .../Project/ICSharpCode.SharpDevelop.csproj | 5 +- .../Src/Bookmarks/ClassMemberBookmark.cs | 128 ------------------ .../Project/Src/Bookmarks/EntityBookmark.cs | 70 ++++++++++ .../Src/Editor/Commands/FindReferences.cs | 34 ----- .../Editor/Commands/FindReferencesCommand.cs | 29 ++++ .../Src/Editor/Commands/GoToDefinition.cs | 22 ++- .../Commands/SymbolUnderCaretMenuCommand.cs | 38 ++---- .../Src/Editor/Search/SearchResultMatch.cs | 57 +++++--- .../Project/Src/Project/AbstractProject.cs | 5 + src/Main/Base/Project/Src/Project/IProject.cs | 12 +- .../FindReferenceService.cs | 83 ++++++++++++ .../FindReferencesAndRenameHelper.cs | 98 ++++++-------- .../Services/RefactoringService/Reference.cs | 49 +++---- 26 files changed, 579 insertions(+), 461 deletions(-) create mode 100644 src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs delete mode 100644 src/Main/Base/Project/Src/Bookmarks/ClassMemberBookmark.cs create mode 100644 src/Main/Base/Project/Src/Bookmarks/EntityBookmark.cs delete mode 100644 src/Main/Base/Project/Src/Editor/Commands/FindReferences.cs create mode 100644 src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs create mode 100644 src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs diff --git a/SharpDevelop.sln b/SharpDevelop.sln index 4efb7acedd..a16a1ddb26 100644 --- a/SharpDevelop.sln +++ b/SharpDevelop.sln @@ -1,49 +1,49 @@  Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 -# SharpDevelop 4.1.0.7800-beta +# SharpDevelop 4.1.0.7861-beta Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Main", "Main", "{256F5C28-532C-44C0-8AB8-D8EC5E492E01}" ProjectSection(SolutionItems) = postProject EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartUp", "src\Main\StartUp\Project\StartUp.csproj", "{1152B71B-3C05-4598-B20D-823B5D40559E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.BuildWorker35", "src\Main\ICSharpCode.SharpDevelop.BuildWorker35\ICSharpCode.SharpDevelop.BuildWorker35.csproj", "{B5F54272-49F0-40DB-845A-8D837875D3BA}" ProjectSection(ProjectDependencies) = postProject {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Widgets", "src\Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj", "{8035765F-D51F-4A0C-A746-2FD100E19419}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.BuildWorker", "src\Main\ICSharpCode.SharpDevelop.BuildWorker\ICSharpCode.SharpDevelop.BuildWorker.csproj", "{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}" ProjectSection(ProjectDependencies) = postProject {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop", "src\Main\Base\Project\ICSharpCode.SharpDevelop.csproj", "{2748AD25-9C63-4E12-877B-4DCE96FBED54}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "src\Main\Core\Project\ICSharpCode.Core.csproj", "{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.Presentation", "src\Main\ICSharpCode.Core.Presentation\ICSharpCode.Core.Presentation.csproj", "{7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}" ProjectSection(ProjectDependencies) = postProject {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Sda", "src\Main\ICSharpCode.SharpDevelop.Sda\ICSharpCode.SharpDevelop.Sda.csproj", "{80318B5F-A25D-45AB-8A95-EF31D2370A4C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.WinForms", "src\Main\ICSharpCode.Core.WinForms\ICSharpCode.Core.WinForms.csproj", "{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}" ProjectSection(ProjectDependencies) = postProject {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.WinForms", "src\Main\ICSharpCode.Core.WinForms\ICSharpCode.Core.WinForms.csproj", "{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Sda", "src\Main\ICSharpCode.SharpDevelop.Sda\ICSharpCode.SharpDevelop.Sda.csproj", "{80318B5F-A25D-45AB-8A95-EF31D2370A4C}" ProjectSection(ProjectDependencies) = postProject {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.Presentation", "src\Main\ICSharpCode.Core.Presentation\ICSharpCode.Core.Presentation.csproj", "{7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop", "src\Main\Base\Project\ICSharpCode.SharpDevelop.csproj", "{2748AD25-9C63-4E12-877B-4DCE96FBED54}" ProjectSection(ProjectDependencies) = postProject {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "src\Main\Core\Project\ICSharpCode.Core.csproj", "{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.BuildWorker", "src\Main\ICSharpCode.SharpDevelop.BuildWorker\ICSharpCode.SharpDevelop.BuildWorker.csproj", "{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Widgets", "src\Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj", "{8035765F-D51F-4A0C-A746-2FD100E19419}" ProjectSection(ProjectDependencies) = postProject {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.BuildWorker35", "src\Main\ICSharpCode.SharpDevelop.BuildWorker35\ICSharpCode.SharpDevelop.BuildWorker35.csproj", "{B5F54272-49F0-40DB-845A-8D837875D3BA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartUp", "src\Main\StartUp\Project\StartUp.csproj", "{1152B71B-3C05-4598-B20D-823B5D40559E}" ProjectSection(ProjectDependencies) = postProject {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection @@ -52,7 +52,20 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{ ProjectSection(SolutionItems) = postProject EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TreeView", "src\Libraries\SharpTreeView\ICSharpCode.TreeView\ICSharpCode.TreeView.csproj", "{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil", "src\Libraries\Mono.Cecil\Mono.Cecil.csproj", "{D68133BD-1E63-496E-9EDE-4FBDBF77B486}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NRefactory", "NRefactory", "{E5A0F4D8-37FD-4A30-BEB0-4409DC4E0865}" + ProjectSection(SolutionItems) = postProject + TODOnewNR.txt = TODOnewNR.txt + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.NRefactory", "src\Libraries\NRefactory\ICSharpCode.NRefactory\ICSharpCode.NRefactory.csproj", "{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Editor", "src\Libraries\NRefactory\ICSharpCode.Editor\ICSharpCode.Editor.csproj", "{F054A788-B591-4561-A8BA-AE745BBEB817}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvalonDock", "src\Libraries\AvalonDock\AvalonDock\AvalonDock.csproj", "{2FF700C2-A38A-48BD-A637-8CAFD4FE6237}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.AvalonEdit", "src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj", "{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}" ProjectSection(ProjectDependencies) = postProject {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection @@ -62,49 +75,40 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Build.Tasks", " {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.AvalonEdit", "src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj", "{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TreeView", "src\Libraries\SharpTreeView\ICSharpCode.TreeView\ICSharpCode.TreeView.csproj", "{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}" ProjectSection(ProjectDependencies) = postProject {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvalonDock", "src\Libraries\AvalonDock\AvalonDock\AvalonDock.csproj", "{2FF700C2-A38A-48BD-A637-8CAFD4FE6237}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NRefactory", "NRefactory", "{E5A0F4D8-37FD-4A30-BEB0-4409DC4E0865}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AddIns", "AddIns", "{39327899-ED91-4F7F-988C-4FE4E17C014D}" ProjectSection(SolutionItems) = postProject - TODOnewNR.txt = TODOnewNR.txt EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Editor", "src\Libraries\NRefactory\ICSharpCode.Editor\ICSharpCode.Editor.csproj", "{F054A788-B591-4561-A8BA-AE745BBEB817}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.NRefactory", "src\Libraries\NRefactory\ICSharpCode.NRefactory\ICSharpCode.NRefactory.csproj", "{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil", "src\Libraries\Mono.Cecil\Mono.Cecil.csproj", "{D68133BD-1E63-496E-9EDE-4FBDBF77B486}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AddIns", "AddIns", "{39327899-ED91-4F7F-988C-4FE4E17C014D}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Version Control", "Version Control", "{F208FF4F-E5D8-41D5-A7C7-B463976F156E}" ProjectSection(SolutionItems) = postProject EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Display Bindings", "Display Bindings", "{11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}" - ProjectSection(SolutionItems) = postProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GitAddIn", "src\AddIns\VersionControl\GitAddIn\GitAddIn.csproj", "{83F15BA7-8478-4664-81BB-A82F146D88B3}" + ProjectSection(ProjectDependencies) = postProject + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvalonEdit.AddIn", "src\AddIns\DisplayBindings\AvalonEdit.AddIn\AvalonEdit.AddIn.csproj", "{0162E499-42D0-409B-AA25-EED21F75336B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubversionAddIn", "src\AddIns\VersionControl\SubversionAddIn\SubversionAddIn.csproj", "{17F4D7E0-6933-4C2E-8714-FD7E98D625D5}" ProjectSection(ProjectDependencies) = postProject {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Misc", "Misc", "{F3662720-9EA2-4591-BBC6-97361DCE50A9}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Language Bindings", "Language Bindings", "{E0646C25-36F2-4524-969F-FA621353AB94}" ProjectSection(SolutionItems) = postProject EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddinScout", "src\AddIns\Misc\AddinScout\Project\AddinScout.csproj", "{4B8F0F98-8BE1-402B-AA8B-C8D548577B38}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpBinding", "src\AddIns\BackendBindings\CSharpBinding\Project\CSharpBinding.csproj", "{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A}" ProjectSection(ProjectDependencies) = postProject {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartPage", "src\AddIns\Misc\StartPage\Project\StartPage.csproj", "{7D5C266F-D6FF-4D14-B315-0C0FC6C4EF51}" - ProjectSection(ProjectDependencies) = postProject - {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Misc", "Misc", "{F3662720-9EA2-4591-BBC6-97361DCE50A9}" + ProjectSection(SolutionItems) = postProject EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SearchAndReplace", "src\AddIns\Misc\SearchAndReplace\Project\SearchAndReplace.csproj", "{9196DD8A-B4D4-4780-8742-C5762E547FC2}" @@ -112,25 +116,21 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SearchAndReplace", "src\Add {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Language Bindings", "Language Bindings", "{E0646C25-36F2-4524-969F-FA621353AB94}" - ProjectSection(SolutionItems) = postProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartPage", "src\AddIns\Misc\StartPage\Project\StartPage.csproj", "{7D5C266F-D6FF-4D14-B315-0C0FC6C4EF51}" + ProjectSection(ProjectDependencies) = postProject + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpBinding", "src\AddIns\BackendBindings\CSharpBinding\Project\CSharpBinding.csproj", "{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddinScout", "src\AddIns\Misc\AddinScout\Project\AddinScout.csproj", "{4B8F0F98-8BE1-402B-AA8B-C8D548577B38}" ProjectSection(ProjectDependencies) = postProject {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Version Control", "Version Control", "{F208FF4F-E5D8-41D5-A7C7-B463976F156E}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Display Bindings", "Display Bindings", "{11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}" ProjectSection(SolutionItems) = postProject EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubversionAddIn", "src\AddIns\VersionControl\SubversionAddIn\SubversionAddIn.csproj", "{17F4D7E0-6933-4C2E-8714-FD7E98D625D5}" - ProjectSection(ProjectDependencies) = postProject - {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GitAddIn", "src\AddIns\VersionControl\GitAddIn\GitAddIn.csproj", "{83F15BA7-8478-4664-81BB-A82F146D88B3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvalonEdit.AddIn", "src\AddIns\DisplayBindings\AvalonEdit.AddIn\AvalonEdit.AddIn.csproj", "{0162E499-42D0-409B-AA25-EED21F75336B}" ProjectSection(ProjectDependencies) = postProject {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} EndProjectSection @@ -347,12 +347,12 @@ Global {E0646C25-36F2-4524-969F-FA621353AB94} = {39327899-ED91-4F7F-988C-4FE4E17C014D} {F3662720-9EA2-4591-BBC6-97361DCE50A9} = {39327899-ED91-4F7F-988C-4FE4E17C014D} {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F} = {39327899-ED91-4F7F-988C-4FE4E17C014D} - {0162E499-42D0-409B-AA25-EED21F75336B} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F} + {83F15BA7-8478-4664-81BB-A82F146D88B3} = {F208FF4F-E5D8-41D5-A7C7-B463976F156E} + {17F4D7E0-6933-4C2E-8714-FD7E98D625D5} = {F208FF4F-E5D8-41D5-A7C7-B463976F156E} + {1F1AC7CD-D154-45BB-8EAF-804CA8055F5A} = {E0646C25-36F2-4524-969F-FA621353AB94} {9196DD8A-B4D4-4780-8742-C5762E547FC2} = {F3662720-9EA2-4591-BBC6-97361DCE50A9} {7D5C266F-D6FF-4D14-B315-0C0FC6C4EF51} = {F3662720-9EA2-4591-BBC6-97361DCE50A9} {4B8F0F98-8BE1-402B-AA8B-C8D548577B38} = {F3662720-9EA2-4591-BBC6-97361DCE50A9} - {1F1AC7CD-D154-45BB-8EAF-804CA8055F5A} = {E0646C25-36F2-4524-969F-FA621353AB94} - {83F15BA7-8478-4664-81BB-A82F146D88B3} = {F208FF4F-E5D8-41D5-A7C7-B463976F156E} - {17F4D7E0-6933-4C2E-8714-FD7E98D625D5} = {F208FF4F-E5D8-41D5-A7C7-B463976F156E} + {0162E499-42D0-409B-AA25-EED21F75336B} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F} EndGlobalSection EndGlobal diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj index 828f87922c..80f1d5a552 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj @@ -67,6 +67,7 @@ Form + diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs new file mode 100644 index 0000000000..9fe355219f --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs @@ -0,0 +1,124 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using ICSharpCode.Core; +using ICSharpCode.Editor; +using ICSharpCode.NRefactory.CSharp; +using ICSharpCode.NRefactory.CSharp.Resolver; +using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.NRefactory.Utils; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Parser; +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Refactoring; + +namespace CSharpBinding +{ + /// + /// C# backend implementation for 'find references'. + /// + public class CSharpSymbolSearch : ISymbolSearch + { + IProject project; + FindReferences fr = new FindReferences(); + IList searchScopes; + IList[] interestingFileNames; + int workAmount; + double workAmountInverse; + Action callback; + FileName currentFileName; + + public CSharpSymbolSearch(IProject project, IEntity entity) + { + this.project = project; + searchScopes = fr.GetSearchScopes(entity); + interestingFileNames = new IList[searchScopes.Count]; + using (var ctx = project.TypeResolveContext.Synchronize()) { + IProjectContent pc = project.ProjectContent; + for (int i = 0; i < searchScopes.Count; i++) { + // Check whether this project can reference the entity at all + bool canReferenceEntity; + switch (searchScopes[i].Accessibility) { + case Accessibility.None: + case Accessibility.Private: + canReferenceEntity = (pc == entity.ProjectContent); + break; + case Accessibility.Internal: + case Accessibility.ProtectedAndInternal: + canReferenceEntity = entity.ProjectContent.InternalsVisibleTo(pc, ctx); + break; + default: + ITypeDefinition typeDef = searchScopes[i].TopLevelTypeDefinition; + if (typeDef != null) { + ITypeDefinition typeDefInContext = ctx.GetTypeDefinition(typeDef.Namespace, typeDef.Name, typeDef.TypeParameterCount, StringComparer.Ordinal); + canReferenceEntity = (typeDefInContext == typeDef.GetDefinition()); + } else { + canReferenceEntity = true; + } + break; + } + + if (canReferenceEntity) { + var allTypesInPC = TreeTraversal.PreOrder(ctx.GetTypes().Where(t => t.ProjectContent == pc), t => t.NestedTypes); + interestingFileNames[i] = fr.GetInterestingFileNames(searchScopes[i], allTypesInPC, ctx); + workAmount += interestingFileNames[i].Count; + } else { + interestingFileNames[i] = new string[0]; + } + } + } + workAmountInverse = 1.0 / workAmount; + } + + public double WorkAmount { + get { return workAmount; } + } + + public void FindReferences(SymbolSearchArgs args, Action callback) + { + if (callback == null) + throw new ArgumentNullException("callback"); + if (this.callback != null) + throw new InvalidOperationException("Cannot call FindReferences() twice"); + this.callback = callback; + fr.ReferenceFound += OnReferenceFound; + + for (int i = 0; i < searchScopes.Count; i++) { + FindReferences.SearchScope searchScope = searchScopes[i]; + foreach (string file in interestingFileNames[i]) { + currentFileName = FileName.Create(file); + FindReferencesInCurrentFile(args, searchScope); + args.ProgressMonitor.Progress += workAmountInverse; + } + } + } + + void OnReferenceFound(AstNode node, ResolveResult result) + { + callback(new Reference(new DomRegion(currentFileName, node.StartLocation, node.EndLocation), result)); + } + + void FindReferencesInCurrentFile(SymbolSearchArgs args, FindReferences.SearchScope searchScope) + { + ITextSource textSource = args.ParseableFileContentFinder.Create(currentFileName); + if (textSource == null) + return; + if (searchScope.SearchTerm != null) { + // TODO: do a fast check with IndexOf() + } + + ParseInformation parseInfo = ParserService.Parse(currentFileName, textSource); + if (parseInfo == null) + return; + ParsedFile parsedFile = parseInfo.ParsedFile as ParsedFile; + CompilationUnit cu = parseInfo.Annotation(); + if (parsedFile == null || cu == null) + return; + fr.FindReferencesInFile(searchScope, parsedFile, cu, project.TypeResolveContext); + } + } +} diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs index e57f9459b3..c1a628956e 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs @@ -143,5 +143,10 @@ namespace CSharpBinding } } */ + + public override ICSharpCode.SharpDevelop.Refactoring.ISymbolSearch PrepareSymbolSearch(ICSharpCode.NRefactory.TypeSystem.IEntity entity) + { + return new CSharpSymbolSearch(this, entity); + } } } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs index fbc3fc0898..544745338c 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs @@ -43,46 +43,29 @@ namespace ICSharpCode.AvalonEdit.AddIn public void UpdateClassMemberBookmarks(IParsedFile parseInfo) { for (int i = bookmarks.Count - 1; i >= 0; i--) { - if (IsClassMemberBookmark(bookmarks[i])) + if (bookmarks[i] is EntityBookmark) bookmarks.RemoveAt(i); } if (parseInfo == null) return; foreach (ITypeDefinition c in parseInfo.TopLevelTypeDefinitions) { - AddClassMemberBookmarks(c); + AddEntityBookmarks(c); } } - void AddClassMemberBookmarks(ITypeDefinition c) + void AddEntityBookmarks(ITypeDefinition c) { if (c.IsSynthetic) return; if (!c.Region.IsEmpty) { - bookmarks.Add(new ClassBookmark(c)); + bookmarks.Add(new EntityBookmark(c)); } foreach (ITypeDefinition innerClass in c.NestedTypes) { - AddClassMemberBookmarks(innerClass); + AddEntityBookmarks(innerClass); } - foreach (IMethod m in c.Methods) { + foreach (IMember m in c.Members) { if (m.Region.IsEmpty || m.IsSynthetic) continue; - bookmarks.Add(new ClassMemberBookmark(m)); + bookmarks.Add(new EntityBookmark(m)); } - foreach (IProperty m in c.Properties) { - if (m.Region.IsEmpty || m.IsSynthetic) continue; - bookmarks.Add(new ClassMemberBookmark(m)); - } - foreach (IField f in c.Fields) { - if (f.Region.IsEmpty || f.IsSynthetic) continue; - bookmarks.Add(new ClassMemberBookmark(f)); - } - foreach (IEvent e in c.Events) { - if (e.Region.IsEmpty || e.IsSynthetic) continue; - bookmarks.Add(new ClassMemberBookmark(e)); - } - } - - static bool IsClassMemberBookmark(IBookmark b) - { - return b is ClassMemberBookmark || b is ClassBookmark; } } } diff --git a/src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchResultNode.cs b/src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchResultNode.cs index dacf1eb641..acc61690eb 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchResultNode.cs +++ b/src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchResultNode.cs @@ -31,38 +31,35 @@ namespace SearchAndReplace this.result = result; IDocument document = result.CreateDocument(); - var startPosition = result.GetStartPosition(document); - int lineNumber = startPosition.Line; - int column = startPosition.Column; - this.anchor = new PermanentAnchor(result.FileName, lineNumber, column); + var startPosition = result.StartLocation; + this.anchor = new PermanentAnchor(result.FileName, startPosition.Line, startPosition.Column); anchor.SurviveDeletion = true; - if (lineNumber >= 1 && lineNumber <= document.LineCount) { - IDocumentLine matchedLine = document.GetLineByNumber(lineNumber); - inlineBuilder = new HighlightedInlineBuilder(document.GetText(matchedLine)); - inlineBuilder.SetFontFamily(0, inlineBuilder.Text.Length, new FontFamily(EditorControlService.GlobalOptions.FontFamily)); - - IHighlighter highlighter = document.GetService(typeof(IHighlighter)) as IHighlighter; - if (highlighter != null) { - HighlightedLine highlightedLine = highlighter.HighlightLine(lineNumber); - int startOffset = highlightedLine.DocumentLine.Offset; - // copy only the foreground color - foreach (HighlightedSection section in highlightedLine.Sections) { - if (section.Color.Foreground != null) { - inlineBuilder.SetForeground(section.Offset - startOffset, section.Length, section.Color.Foreground.GetBrush(null)); - } + int lineNumber = anchor.Line; + IDocumentLine matchedLine = document.GetLineByNumber(lineNumber); + inlineBuilder = new HighlightedInlineBuilder(document.GetText(matchedLine)); + inlineBuilder.SetFontFamily(0, inlineBuilder.Text.Length, new FontFamily(EditorControlService.GlobalOptions.FontFamily)); + + IHighlighter highlighter = document.GetService(typeof(IHighlighter)) as IHighlighter; + if (highlighter != null) { + HighlightedLine highlightedLine = highlighter.HighlightLine(lineNumber); + int startOffset = highlightedLine.DocumentLine.Offset; + // copy only the foreground color + foreach (HighlightedSection section in highlightedLine.Sections) { + if (section.Color.Foreground != null) { + inlineBuilder.SetForeground(section.Offset - startOffset, section.Length, section.Color.Foreground.GetBrush(null)); } } - - // now highlight the match in bold - if (column >= 1) { - var endPosition = result.GetEndPosition(document); - if (endPosition.Line == startPosition.Line && endPosition.Column > startPosition.Column) { - // subtract one from the column to get the offset inside the line's text - int startOffset = column - 1; - int endOffset = Math.Min(inlineBuilder.Text.Length, endPosition.Column - 1); - inlineBuilder.SetFontWeight(startOffset, endOffset - startOffset, FontWeights.Bold); - } + } + + // now highlight the match in bold + if (startPosition.Column >= 1) { + var endPosition = result.EndLocation; + if (endPosition.Line == startPosition.Line && endPosition.Column > startPosition.Column) { + // subtract one from the column to get the offset inside the line's text + int startOffset = startPosition.Column - 1; + int endOffset = Math.Min(inlineBuilder.Text.Length, endPosition.Column - 1); + inlineBuilder.SetFontWeight(startOffset, endOffset - startOffset, FontWeights.Bold); } } } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/FindReferences.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/FindReferences.cs index 5b7b3242d7..302bb853fe 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/FindReferences.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/FindReferences.cs @@ -31,21 +31,17 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver /// public class FindReferences { - CancellationToken cancellationToken; - /// /// Callback that is invoked whenever a reference is found. /// public event Action ReferenceFound; - #region Constructor - public FindReferences(CancellationToken cancellationToken = default(CancellationToken)) - { - this.cancellationToken = cancellationToken; - } - #endregion - #region Properties + /// + /// Gets/Sets the cancellation token. + /// + public CancellationToken CancellationToken { get; set; } + /// /// Gets/Sets whether to find type references even if an alias is being used. /// @@ -224,7 +220,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver /// /// Gets the file names that possibly contain references to the element being searched for. /// - public IEnumerable GetInterestingFileNames(SearchScope searchScope, ITypeResolveContext context) + public IList GetInterestingFileNames(SearchScope searchScope, IEnumerable allTypes, ITypeResolveContext context) { IEnumerable interestingTypes; if (searchScope.TopLevelTypeDefinition != null) { @@ -234,41 +230,41 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver interestingTypes = new [] { searchScope.TopLevelTypeDefinition.GetDefinition() }; break; case Accessibility.Protected: - interestingTypes = GetInterestingTypesProtected(context, searchScope.TopLevelTypeDefinition); + interestingTypes = GetInterestingTypesProtected(allTypes, context, searchScope.TopLevelTypeDefinition); break; case Accessibility.Internal: - interestingTypes = GetInterestingTypesInternal(context, searchScope.TopLevelTypeDefinition.ProjectContent); + interestingTypes = GetInterestingTypesInternal(allTypes, context, searchScope.TopLevelTypeDefinition.ProjectContent); break; case Accessibility.ProtectedAndInternal: - interestingTypes = GetInterestingTypesProtected(context, searchScope.TopLevelTypeDefinition) - .Intersect(GetInterestingTypesInternal(context, searchScope.TopLevelTypeDefinition.ProjectContent)); + interestingTypes = GetInterestingTypesProtected(allTypes, context, searchScope.TopLevelTypeDefinition) + .Intersect(GetInterestingTypesInternal(allTypes, context, searchScope.TopLevelTypeDefinition.ProjectContent)); break; case Accessibility.ProtectedOrInternal: - interestingTypes = GetInterestingTypesProtected(context, searchScope.TopLevelTypeDefinition) - .Union(GetInterestingTypesInternal(context, searchScope.TopLevelTypeDefinition.ProjectContent)); + interestingTypes = GetInterestingTypesProtected(allTypes, context, searchScope.TopLevelTypeDefinition) + .Union(GetInterestingTypesInternal(allTypes, context, searchScope.TopLevelTypeDefinition.ProjectContent)); break; default: - interestingTypes = context.GetTypes(); + interestingTypes = allTypes; break; } } else { - interestingTypes = context.GetTypes(); + interestingTypes = allTypes; } return (from typeDef in interestingTypes from part in typeDef.GetParts() where part.ParsedFile != null select part.ParsedFile.FileName - ).Distinct(Platform.FileNameComparer); + ).Distinct(Platform.FileNameComparer).ToList(); } - IEnumerable GetInterestingTypesProtected(ITypeResolveContext context, ITypeDefinition referencedTypeDefinition) + IEnumerable GetInterestingTypesProtected(IEnumerable allTypes, ITypeResolveContext context, ITypeDefinition referencedTypeDefinition) { - return referencedTypeDefinition.GetSubTypeDefinitions(context); + return allTypes.Where(t => t.IsDerivedFrom(referencedTypeDefinition, context)); } - IEnumerable GetInterestingTypesInternal(ITypeResolveContext context, IProjectContent referencedProjectContent) + IEnumerable GetInterestingTypesInternal(IEnumerable allTypes, ITypeResolveContext context, IProjectContent referencedProjectContent) { - return context.GetTypes().Where(t => referencedProjectContent.InternalsVisibleTo(t.ProjectContent, context)); + return allTypes.Where(t => referencedProjectContent.InternalsVisibleTo(t.ProjectContent, context)); } #endregion @@ -304,7 +300,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver throw new ArgumentNullException("compilationUnit"); if (context == null) throw new ArgumentNullException("context"); - cancellationToken.ThrowIfCancellationRequested(); + this.CancellationToken.ThrowIfCancellationRequested(); if (searchScopes.Count == 0) return; foreach (SearchScope scope in searchScopes) { @@ -318,7 +314,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver else navigator = new CompositeResolveVisitorNavigator(searchScopes.ToArray()); navigator = new DetectSkippableNodesNavigator(navigator, compilationUnit); - CSharpResolver resolver = new CSharpResolver(ctx, cancellationToken); + CSharpResolver resolver = new CSharpResolver(ctx, this.CancellationToken); ResolveVisitor v = new ResolveVisitor(resolver, parsedFile, navigator); v.Scan(compilationUnit); } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/LocalResolveResult.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/LocalResolveResult.cs index ef056230f9..57779ab2a6 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/LocalResolveResult.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/LocalResolveResult.cs @@ -68,5 +68,10 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver { return string.Format("[LocalResolveResult {0}]", variable); } + + public override DomRegion GetDefinitionRegion() + { + return variable.Region; + } } } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/MemberResolveResult.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/MemberResolveResult.cs index baaf504d7d..b47b4764c0 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/MemberResolveResult.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/MemberResolveResult.cs @@ -92,5 +92,10 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver { return string.Format("[{0} {1}]", GetType().Name, member); } + + public override DomRegion GetDefinitionRegion() + { + return member.Region; + } } } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/ResolveAtLocation.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/ResolveAtLocation.cs index dcf78a2080..2f16a7ebf0 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/ResolveAtLocation.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/ResolveAtLocation.cs @@ -32,6 +32,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver CancellationToken cancellationToken = default(CancellationToken)) { AstNode node = cu.GetNodeAt(location); + if (node == null) + return null; AstNode resolvableNode; if (node is Identifier) { resolvableNode = node.Parent; diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/ResolveResult.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/ResolveResult.cs index 9f31e05720..40a9931e69 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/ResolveResult.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/ResolveResult.cs @@ -63,5 +63,10 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver { return Enumerable.Empty(); } + + public virtual DomRegion GetDefinitionRegion() + { + return DomRegion.Empty; + } } } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/TypeResolveResult.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/TypeResolveResult.cs index 1336357ba6..79815d6565 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/TypeResolveResult.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Resolver/TypeResolveResult.cs @@ -30,5 +30,14 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver : base(type) { } + + public override DomRegion GetDefinitionRegion() + { + ITypeDefinition def = this.Type.GetDefinition(); + if (def != null) + return def.Region; + else + return DomRegion.Empty; + } } } diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin index 12c6188479..9b08f753c9 100755 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin @@ -1658,7 +1658,7 @@ label = "${res:SharpDevelop.Refactoring.FindReferences}" shortcut = "F12" icon="Icons.16x16.SelectionArrow" - class = "ICSharpCode.SharpDevelop.Editor.Commands.FindReferences"/> + class = "ICSharpCode.SharpDevelop.Editor.Commands.FindReferencesCommand"/> - - - - - - - - - - - - - - + + @@ -1881,20 +1869,6 @@ class = "ICSharpCode.SharpDevelop.Editor.Commands.IndentSelection" /> - - - - - - - - - - - diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 6500a10246..d6ae212c9b 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -113,7 +113,7 @@ - + @@ -366,6 +366,7 @@ + @@ -670,7 +671,7 @@ Component - + diff --git a/src/Main/Base/Project/Src/Bookmarks/ClassMemberBookmark.cs b/src/Main/Base/Project/Src/Bookmarks/ClassMemberBookmark.cs deleted file mode 100644 index fe0c01d0de..0000000000 --- a/src/Main/Base/Project/Src/Bookmarks/ClassMemberBookmark.cs +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) - -using System; -using System.Windows; -using System.Windows.Input; -using ICSharpCode.Core; -using ICSharpCode.Core.Presentation; -using ICSharpCode.NRefactory.TypeSystem; - -namespace ICSharpCode.SharpDevelop.Bookmarks -{ - /// - /// Bookmark used to give additional operations for class members. - /// Does not derive from SDBookmark because it is not stored in the central BookmarkManager, - /// but only in the document's BookmarkManager. - /// - public class ClassMemberBookmark : IBookmark - { - IMember member; - - public IMember Member { - get { - return member; - } - } - - public ClassMemberBookmark(IMember member) - { - this.member = member; - } - - public const string ContextMenuPath = "/SharpDevelop/ViewContent/DefaultTextEditor/ClassMemberContextMenu"; - - public virtual IImage Image { - get { return ClassBrowserIconService.GetIcon(member); } - } - - public int LineNumber { - get { return member.Region.BeginLine; } - } - - public virtual void MouseDown(MouseButtonEventArgs e) - { - if (e.ChangedButton == MouseButton.Left) { - var f = AnalyticsMonitorService.TrackFeature("ICSharpCode.SharpDevelop.Bookmarks.ClassMemberBookmark.ShowContextMenu"); - var ctx = MenuService.ShowContextMenu(e.Source as UIElement, this, ContextMenuPath); - ctx.Closed += delegate { f.EndTracking(); }; - e.Handled = true; - } - } - - public virtual void MouseUp(MouseButtonEventArgs e) - { - } - - int IBookmark.ZOrder { - get { return -10; } - } - - bool IBookmark.CanDragDrop { - get { return false; } - } - - void IBookmark.Drop(int lineNumber) - { - throw new NotSupportedException(); - } - } - - public class ClassBookmark : IBookmark - { - ITypeDefinition @class; - - public ITypeDefinition Class { - get { - return @class; - } - set { - @class = value; - } - } - - public ClassBookmark(ITypeDefinition @class) - { - this.@class = @class; - } - - public const string ContextMenuPath = "/SharpDevelop/ViewContent/DefaultTextEditor/ClassBookmarkContextMenu"; - - public virtual IImage Image { - get { - return ClassBrowserIconService.GetIcon(@class); - } - } - - public int LineNumber { - get { return @class.Region.BeginLine; } - } - - public virtual void MouseDown(MouseButtonEventArgs e) - { - if (e.ChangedButton == MouseButton.Left) { - var f = AnalyticsMonitorService.TrackFeature("ICSharpCode.SharpDevelop.Bookmarks.ClassBookmark.ShowContextMenu"); - var ctx = MenuService.ShowContextMenu(e.Source as UIElement, this, ContextMenuPath); - ctx.Closed += delegate { f.EndTracking(); }; - e.Handled = true; - } - } - - public virtual void MouseUp(MouseButtonEventArgs e) - { - } - - int IBookmark.ZOrder { - get { return -10; } - } - - bool IBookmark.CanDragDrop { - get { return false; } - } - - void IBookmark.Drop(int lineNumber) - { - throw new NotSupportedException(); - } - } -} diff --git a/src/Main/Base/Project/Src/Bookmarks/EntityBookmark.cs b/src/Main/Base/Project/Src/Bookmarks/EntityBookmark.cs new file mode 100644 index 0000000000..4ad80edf8d --- /dev/null +++ b/src/Main/Base/Project/Src/Bookmarks/EntityBookmark.cs @@ -0,0 +1,70 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Windows; +using System.Windows.Input; +using ICSharpCode.Core; +using ICSharpCode.Core.Presentation; +using ICSharpCode.NRefactory.TypeSystem; + +namespace ICSharpCode.SharpDevelop.Bookmarks +{ + /// + /// Bookmark used to give additional operations for entities. + /// Does not derive from SDBookmark because it is not stored in the central BookmarkManager, + /// but only in the document's BookmarkManager. + /// + public class EntityBookmark : IBookmark + { + IEntity entity; + + public IEntity Entity { + get { + return entity; + } + } + + public EntityBookmark(IEntity entity) + { + this.entity = entity; + } + + public const string ContextMenuPath = "/SharpDevelop/ViewContent/TextEditor/EntityContextMenu"; + + public virtual IImage Image { + get { return ClassBrowserIconService.GetIcon(entity); } + } + + public int LineNumber { + get { return entity.Region.BeginLine; } + } + + public virtual void MouseDown(MouseButtonEventArgs e) + { + if (e.ChangedButton == MouseButton.Left) { + var f = AnalyticsMonitorService.TrackFeature("ICSharpCode.SharpDevelop.Bookmarks.EntityBookmark.ShowContextMenu"); + var ctx = MenuService.ShowContextMenu(e.Source as UIElement, this, ContextMenuPath); + ctx.Closed += delegate { f.EndTracking(); }; + e.Handled = true; + } + } + + public virtual void MouseUp(MouseButtonEventArgs e) + { + } + + int IBookmark.ZOrder { + get { return -10; } + } + + bool IBookmark.CanDragDrop { + get { return false; } + } + + void IBookmark.Drop(int lineNumber) + { + throw new NotSupportedException(); + } + } +} diff --git a/src/Main/Base/Project/Src/Editor/Commands/FindReferences.cs b/src/Main/Base/Project/Src/Editor/Commands/FindReferences.cs deleted file mode 100644 index a35b7b0875..0000000000 --- a/src/Main/Base/Project/Src/Editor/Commands/FindReferences.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -/* -using System; -using ICSharpCode.SharpDevelop.Dom; -using ICSharpCode.SharpDevelop.Refactoring; - -namespace ICSharpCode.SharpDevelop.Editor.Commands -{ - /// - /// Description of FindReferences. - /// - public class FindReferences : SymbolUnderCaretMenuCommand - { - protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol) - { - var classUnderCaret = GetClass(symbol); - if (classUnderCaret != null) { - FindReferencesAndRenameHelper.RunFindReferences(classUnderCaret); - return; - } - var memberUnderCaret = GetMember(symbol); - if (memberUnderCaret != null) - { - FindReferencesAndRenameHelper.RunFindReferences(memberUnderCaret); - return; - } - if (symbol is LocalResolveResult) { - FindReferencesAndRenameHelper.RunFindReferences((LocalResolveResult)symbol); - } - } - } -} -*/ \ No newline at end of file diff --git a/src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs b/src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs new file mode 100644 index 0000000000..3ebc875c28 --- /dev/null +++ b/src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs @@ -0,0 +1,29 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.NRefactory.CSharp.Resolver; +using ICSharpCode.SharpDevelop.Refactoring; + +namespace ICSharpCode.SharpDevelop.Editor.Commands +{ + /// + /// Runs the find references command. + /// + public class FindReferencesCommand : SymbolUnderCaretMenuCommand + { + protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol) + { + var entity = GetEntity(symbol); + if (entity != null) { + FindReferencesAndRenameHelper.RunFindReferences(entity); + return; + } + if (symbol is LocalResolveResult) { + #warning Find References not implemented for locals + throw new NotImplementedException(); + //FindReferencesAndRenameHelper.RunFindReferences((LocalResolveResult)symbol); + } + } + } +} diff --git a/src/Main/Base/Project/Src/Editor/Commands/GoToDefinition.cs b/src/Main/Base/Project/Src/Editor/Commands/GoToDefinition.cs index 8d6b84fb7e..8a0136556f 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/GoToDefinition.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/GoToDefinition.cs @@ -4,13 +4,14 @@ using System; using System.IO; using ICSharpCode.Core; +using ICSharpCode.NRefactory.CSharp.Resolver; +using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Project; using Mono.Cecil; namespace ICSharpCode.SharpDevelop.Editor.Commands { - /* public class GoToDefinition : SymbolUnderCaretMenuCommand { protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol) @@ -18,29 +19,22 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands if (symbol == null) return; - FilePosition pos = symbol.GetDefinitionPosition(); - if (pos.IsEmpty) { - IEntity entity; - if (symbol is MemberResolveResult) { - entity = ((MemberResolveResult)symbol).ResolvedMember; - } else if (symbol is TypeResolveResult) { - entity = ((TypeResolveResult)symbol).ResolvedClass; - } else { - entity = null; - } + DomRegion pos = symbol.GetDefinitionRegion(); + if (string.IsNullOrEmpty(pos.FileName)) { + IEntity entity = GetEntity(symbol); if (entity != null) { NavigationService.NavigateTo(entity); } } else { try { - if (pos.Position.IsEmpty) + if (pos.Begin.IsEmpty) FileService.OpenFile(pos.FileName); else - FileService.JumpToFilePosition(pos.FileName, pos.Line, pos.Column); + FileService.JumpToFilePosition(pos.FileName, pos.BeginLine, pos.BeginColumn); } catch (Exception ex) { MessageService.ShowException(ex, "Error jumping to '" + pos.FileName + "'."); } } } - } */ + } } diff --git a/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs b/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs index 74a22d3e19..cffecd377e 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs @@ -1,10 +1,12 @@ // Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -/* + using System; using ICSharpCode.Core; -using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.NRefactory.CSharp.Resolver; +using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Parser; namespace ICSharpCode.SharpDevelop.Editor.Commands { @@ -17,33 +19,23 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands { ITextEditorProvider editorProvider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; if (editorProvider != null) { - Run(editorProvider.TextEditor, editorProvider.TextEditor.Caret.Offset); + ITextEditor editor = editorProvider.TextEditor; + var resolveResult = ParserService.Resolve(editor.FileName, editor.Caret.Location, editor.Document); + RunImpl(editor, editor.Caret.Offset, resolveResult); } } - public void Run(ITextEditor editor, int caretOffset) - { - var resolveResult = ParserService.Resolve(caretOffset, editor.Document, editor.FileName); - RunImpl(editor, caretOffset, resolveResult); - } - protected abstract void RunImpl(ITextEditor editor, int caretOffset, ResolveResult symbol); - public IClass GetClass(ResolveResult symbol) + protected IEntity GetEntity(ResolveResult symbol) { - if (symbol == null || !(symbol is TypeResolveResult)) { - return null; - } - return ((TypeResolveResult)symbol).ResolvedClass; - } - - public IMember GetMember(ResolveResult symbol) - { - if (symbol == null || !(symbol is MemberResolveResult)) { - return null; - } - return ((MemberResolveResult)symbol).ResolvedMember; + TypeResolveResult trr = symbol as TypeResolveResult; + if (trr != null) + return trr.Type.GetDefinition(); + MemberResolveResult mrr = symbol as MemberResolveResult; + if (mrr != null) + return mrr.Member.MemberDefinition; + return null; } } } -*/ \ No newline at end of file diff --git a/src/Main/Base/Project/Src/Editor/Search/SearchResultMatch.cs b/src/Main/Base/Project/Src/Editor/Search/SearchResultMatch.cs index bba9279c17..53f11b25a9 100644 --- a/src/Main/Base/Project/Src/Editor/Search/SearchResultMatch.cs +++ b/src/Main/Base/Project/Src/Editor/Search/SearchResultMatch.cs @@ -11,8 +11,10 @@ namespace ICSharpCode.SharpDevelop.Editor.Search public class SearchResultMatch { ProvidedDocumentInformation providedDocumentInformation; - int offset; - int length; + int offset; + int length; + TextLocation startLocation; + TextLocation endLocation; public ProvidedDocumentInformation ProvidedDocumentInformation { set { providedDocumentInformation = value; } @@ -26,16 +28,36 @@ namespace ICSharpCode.SharpDevelop.Editor.Search public int Offset { get { + if (offset < 0) + offset = providedDocumentInformation.Document.GetOffset(startLocation); return offset; } } public int Length { get { + if (length < 0) + length = providedDocumentInformation.Document.GetOffset(endLocation) - this.Offset; return length; } } + public TextLocation StartLocation { + get { + if (startLocation.IsEmpty) + startLocation = providedDocumentInformation.Document.GetLocation(offset); + return startLocation; + } + } + + public TextLocation EndLocation { + get { + if (endLocation.IsEmpty) + endLocation = providedDocumentInformation.Document.GetLocation(offset + length); + return endLocation; + } + } + public virtual string TransformReplacePattern(string pattern) { return pattern; @@ -69,11 +91,27 @@ namespace ICSharpCode.SharpDevelop.Editor.Search this.length = length; } + + public SearchResultMatch(ProvidedDocumentInformation providedDocumentInformation, TextLocation startLocation, TextLocation endLocation) + { + if (providedDocumentInformation == null) + throw new ArgumentNullException("providedDocumentInformation"); + if (length < 0) + throw new ArgumentOutOfRangeException("length"); + this.offset = -1; + this.length = -1; + this.providedDocumentInformation = providedDocumentInformation; + this.startLocation = startLocation; + this.endLocation = endLocation; + } + + [Obsolete("Use the StartLocation property instead")] public virtual TextLocation GetStartPosition(IDocument document) { return document.GetLocation(Math.Min(Offset, document.TextLength)); } + [Obsolete("Use the EndLocation property instead")] public virtual TextLocation GetEndPosition(IDocument document) { return document.GetLocation(Math.Min(Offset + Length, document.TextLength)); @@ -98,18 +136,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Search public class SimpleSearchResultMatch : SearchResultMatch { - TextLocation position; - - public override TextLocation GetStartPosition(IDocument doc) - { - return position; - } - - public override TextLocation GetEndPosition(IDocument doc) - { - return position; - } - string displayText; public override string DisplayText { @@ -119,9 +145,8 @@ namespace ICSharpCode.SharpDevelop.Editor.Search } public SimpleSearchResultMatch(ProvidedDocumentInformation providedDocumentInformation, string displayText, TextLocation position) - : base(providedDocumentInformation, 0, 0) + : base(providedDocumentInformation, position, position) { - this.position = position; this.displayText = displayText; } } diff --git a/src/Main/Base/Project/Src/Project/AbstractProject.cs b/src/Main/Base/Project/Src/Project/AbstractProject.cs index 264b62a393..06ff49a58c 100644 --- a/src/Main/Base/Project/Src/Project/AbstractProject.cs +++ b/src/Main/Base/Project/Src/Project/AbstractProject.cs @@ -640,5 +640,10 @@ namespace ICSharpCode.SharpDevelop.Project { return new CSharpAmbience(); } + + public virtual Refactoring.ISymbolSearch PrepareSymbolSearch(IEntity entity) + { + return null; + } } } diff --git a/src/Main/Base/Project/Src/Project/IProject.cs b/src/Main/Base/Project/Src/Project/IProject.cs index 7308cffd27..2de1c17c72 100644 --- a/src/Main/Base/Project/Src/Project/IProject.cs +++ b/src/Main/Base/Project/Src/Project/IProject.cs @@ -218,7 +218,7 @@ namespace ICSharpCode.SharpDevelop.Project /// Gets project specific properties. /// Properties ProjectSpecificProperties { get; } - */ + */ /// /// Starts the project. @@ -316,6 +316,16 @@ namespace ICSharpCode.SharpDevelop.Project /// Never returns null. /// IAmbience GetAmbience(); + + /// + /// Prepares searching for references to the specified entity. + /// This method should calculate the amount of work to be done (e.g. using the number of files to search through), + /// it should not perform the actual search. + /// + /// + /// An object that can be used to perform the search; or null if this project does not support symbol searches. + /// + Refactoring.ISymbolSearch PrepareSymbolSearch(IEntity entity); } /// diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs new file mode 100644 index 0000000000..c934b69585 --- /dev/null +++ b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs @@ -0,0 +1,83 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; +using System.Threading; +using ICSharpCode.Core; +using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Parser; +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.SharpDevelop.Refactoring +{ + /// + /// Description of FindReferenceService. + /// + public static class FindReferenceService + { + public static void FindReferences(IEntity entity, IProgressMonitor progressMonitor, Action callback) + { + if (ParserService.LoadSolutionProjectsThreadRunning) { + if (progressMonitor != null) progressMonitor.ShowingDialog = true; + MessageService.ShowMessage("${res:SharpDevelop.Refactoring.LoadSolutionProjectsThreadRunning}"); + if (progressMonitor != null) progressMonitor.ShowingDialog = false; + return; + } + if (ProjectService.OpenSolution == null) + return; + List symbolSearches = new List(); + double totalWorkAmount = 0; + foreach (IProject project in ProjectService.OpenSolution.Projects) { + progressMonitor.CancellationToken.ThrowIfCancellationRequested(); + ISymbolSearch symbolSearch = project.PrepareSymbolSearch(entity); + if (symbolSearch != null) { + symbolSearches.Add(symbolSearch); + totalWorkAmount += symbolSearch.WorkAmount; + } + } + if (totalWorkAmount < 1) + totalWorkAmount = 1; + double workDone = 0; + ParseableFileContentFinder parseableFileContentFinder = new ParseableFileContentFinder(); + foreach (ISymbolSearch s in symbolSearches) { + progressMonitor.CancellationToken.ThrowIfCancellationRequested(); + using (var childProgressMonitor = progressMonitor.CreateSubTask(s.WorkAmount / totalWorkAmount)) { + s.FindReferences(new SymbolSearchArgs(childProgressMonitor, parseableFileContentFinder), callback); + } + + workDone += s.WorkAmount; + progressMonitor.Progress = workDone / totalWorkAmount; + } + } + } + + public class SymbolSearchArgs + { + public IProgressMonitor ProgressMonitor { get; private set; } + + public CancellationToken CancellationToken { + get { return this.ProgressMonitor.CancellationToken; } + } + + public ParseableFileContentFinder ParseableFileContentFinder { get; private set; } + + public SymbolSearchArgs(IProgressMonitor progressMonitor, ParseableFileContentFinder parseableFileContentFinder) + { + if (progressMonitor == null) + throw new ArgumentNullException("progressMonitor"); + if (parseableFileContentFinder == null) + throw new ArgumentNullException("parseableFileContentFinder"); + this.ProgressMonitor = progressMonitor; + this.ParseableFileContentFinder = parseableFileContentFinder; + } + } + + public interface ISymbolSearch + { + double WorkAmount { get; } + + void FindReferences(SymbolSearchArgs searchArguments, Action callback); + } +} diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs index 71ff260657..5cf975d7fe 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs @@ -5,18 +5,21 @@ using System; using System.Collections.Generic; using System.IO; using System.Text; - using ICSharpCode.Core; +using ICSharpCode.Editor; +using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor.Search; using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Project; -/* + namespace ICSharpCode.SharpDevelop.Refactoring { public static class FindReferencesAndRenameHelper { #region Extract Interface + /* Reimplement extract interface and put the code somewhere else - this isn't the place for C#-specific refactorings public static void ExtractInterface(IClass c) { ExtractInterfaceOptions extractInterface = new ExtractInterfaceOptions(c); @@ -106,10 +109,12 @@ namespace ICSharpCode.SharpDevelop.Refactoring editable.TextEditor.Document.Text = modifiedClassCode; } } + */ #endregion + /* #region Rename Class - public static void RenameClass(IClass c) + public static void RenameClass(ITypeDefinition c) { string newName = MessageService.ShowInputBox("${res:SharpDevelop.Refactoring.Rename}", "${res:SharpDevelop.Refactoring.RenameClassText}", c.Name); if (!FindReferencesAndRenameHelper.CheckName(newName, c.Name)) return; @@ -120,19 +125,19 @@ namespace ICSharpCode.SharpDevelop.Refactoring } } - public static void RenameClass(IClass c, string newName) + public static void RenameClass(ITypeDefinition c, string newName) { if (c == null) throw new ArgumentNullException("c"); if (newName == null) throw new ArgumentNullException("newName"); - c = c.GetCompoundClass(); // get compound class if class is partial + c = c.GetDefinition(); // get compound class if class is partial List list = RefactoringService.FindReferences(c, null); if (list == null) return; // Add the class declaration(s) - foreach (IClass part in GetClassParts(c)) { + foreach (ITypeDefinition part in c.GetParts()) { AddDeclarationAsReference(list, part.CompilationUnit.FileName, part.Region, part.Name); } @@ -146,16 +151,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring FindReferencesAndRenameHelper.RenameReferences(list, newName); } - static IList GetClassParts(IClass c) - { - CompoundClass cc = c as CompoundClass; - if (cc != null) { - return cc.Parts; - } else { - return new IClass[] {c}; - } - } - static void AddDeclarationAsReference(List list, string fileName, DomRegion region, string name) { if (fileName == null) @@ -233,6 +228,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring return foundProperty; } #endregion + */ #region Common helper functions public static ProvidedDocumentInformation GetDocumentInformation(string fileName) @@ -247,33 +243,22 @@ namespace ICSharpCode.SharpDevelop.Refactoring } } } - ITextBuffer fileContent = ParserService.GetParseableFileContent(fileName); + ITextSource fileContent = ParserService.GetParseableFileContent(fileName); return new ProvidedDocumentInformation(fileContent, fileName, 0); } - public static bool IsReadOnly(IClass c) + public static bool IsReadOnly(ITypeDefinition c) { - return c.CompilationUnit.FileName == null || c.GetCompoundClass().IsSynthetic; + return c.ParsedFile == null || c.IsSynthetic || c.GetDefinition().IsSynthetic; } - public static ITextEditor JumpToDefinition(IMember member) + [Obsolete("Use NavigationService.NavigateTo() instead")] + public static void JumpToDefinition(IMember member) { - IViewContent viewContent = null; - ICompilationUnit cu = member.DeclaringType.CompilationUnit; - if (cu != null) { - string fileName = cu.FileName; - if (fileName != null) { - if (!member.Region.IsEmpty) { - viewContent = FileService.JumpToFilePosition(fileName, member.Region.BeginLine, member.Region.BeginColumn); - } else { - FileService.OpenFile(fileName); - } - } - } - ITextEditorProvider tecp = viewContent as ITextEditorProvider; - return (tecp == null) ? null : tecp.TextEditor; + NavigationService.NavigateTo(member); } + /* public static ITextEditor OpenDefinitionFile(IMember member, bool switchTo) { IViewContent viewContent = null; @@ -362,19 +347,21 @@ namespace ICSharpCode.SharpDevelop.Refactoring } } } + */ public static void ShowAsSearchResults(string title, List list) { if (list == null) return; List results = new List(list.Count); foreach (Reference r in list) { - SearchResultMatch res = new SearchResultMatch(GetDocumentInformation(r.FileName), r.Offset, r.Length); + SearchResultMatch res = new SearchResultMatch(GetDocumentInformation(r.FileName), r.Region.Begin, r.Region.End); results.Add(res); } SearchResultsPad.Instance.ShowSearchResults(title, results); SearchResultsPad.Instance.BringToFront(); } + /* sealed class FileView { public IViewContent ViewContent; public OpenedFile OpenedFile; @@ -429,7 +416,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring } } } + */ + /* TODO: these are refactorings and don't belong here public static void MoveClassToFile(IClass c, string newFileName) { LanguageProperties language = c.ProjectContent.Language; @@ -513,33 +502,25 @@ namespace ICSharpCode.SharpDevelop.Refactoring if (tecp == null) return null; return tecp.TextEditor.Document; } - + */ #endregion #region Find references - public static void RunFindReferences(IMember member) - { - string memberName = member.DeclaringType.Name + "." + member.Name; - using (AsynchronousWaitDialog monitor = AsynchronousWaitDialog.ShowWaitDialog("${res:SharpDevelop.Refactoring.FindReferences}", true)) { - FindReferencesAndRenameHelper.ShowAsSearchResults( - StringParser.Parse("${res:SharpDevelop.Refactoring.ReferencesTo}", - new StringTagPair("Name", memberName)), - RefactoringService.FindReferences(member, monitor)); - } - } - - public static void RunFindReferences(IClass c) + public static void RunFindReferences(IEntity entity) { + string entityName = (entity.DeclaringTypeDefinition != null ? entity.DeclaringTypeDefinition.Name + "." + entity.Name : entity.Name); using (AsynchronousWaitDialog monitor = AsynchronousWaitDialog.ShowWaitDialog("${res:SharpDevelop.Refactoring.FindReferences}", true)) { + List references = new List(); + FindReferenceService.FindReferences(entity, monitor, references.Add); FindReferencesAndRenameHelper.ShowAsSearchResults( StringParser.Parse("${res:SharpDevelop.Refactoring.ReferencesTo}", - new StringTagPair("Name", c.Name)), - RefactoringService.FindReferences(c, monitor) - ); + new StringTagPair("Name", entityName)), + references); } } + /* public static void RunFindReferences(LocalResolveResult local) { FindReferencesAndRenameHelper.ShowAsSearchResults( @@ -548,14 +529,15 @@ namespace ICSharpCode.SharpDevelop.Refactoring RefactoringService.FindReferences(local, null) ); } + */ - public static ICSharpCode.Core.WinForms.MenuCommand MakeFindReferencesMenuCommand(EventHandler handler) - { - return new ICSharpCode.Core.WinForms.MenuCommand("${res:SharpDevelop.Refactoring.FindReferencesCommand}", handler) { - ShortcutKeys = System.Windows.Forms.Keys.F12 - }; - } +// public static ICSharpCode.Core.WinForms.MenuCommand MakeFindReferencesMenuCommand(EventHandler handler) +// { +// return new ICSharpCode.Core.WinForms.MenuCommand("${res:SharpDevelop.Refactoring.FindReferencesCommand}", handler) { +// ShortcutKeys = System.Windows.Forms.Keys.F12 +// }; +// } #endregion } } -*/ + diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/Reference.cs b/src/Main/Base/Project/Src/Services/RefactoringService/Reference.cs index c1b0ff82b9..9d5b05d34f 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/Reference.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/Reference.cs @@ -2,7 +2,10 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; -/* +using ICSharpCode.Core; +using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.NRefactory.CSharp.Resolver; + namespace ICSharpCode.SharpDevelop.Refactoring { /// @@ -10,49 +13,29 @@ namespace ICSharpCode.SharpDevelop.Refactoring /// public class Reference { - string fileName; - int offset, length; - string expression; + DomRegion region; ResolveResult resolveResult; - public Reference(string fileName, int offset, int length, string expression, ResolveResult resolveResult) + public Reference(DomRegion region, ResolveResult resolveResult) { - this.fileName = fileName; - this.offset = offset; - this.length = length; - this.expression = expression; + if (region.IsEmpty) + throw new ArgumentException("Region must not be empty"); + if (resolveResult == null) + throw new ArgumentNullException("resolveResult"); + this.region = region; this.resolveResult = resolveResult; } - public string FileName { - get { - return fileName; - } - } - - public int Offset { - get { - return offset; - } - } - - public int Length { - get { - return length; - } + public FileName FileName { + get { return FileName.Create(region.FileName); } } - public string Expression { - get { - return expression; - } + public DomRegion Region { + get { return region; } } public ResolveResult ResolveResult { - get { - return resolveResult; - } + get { return resolveResult; } } } } -*/ \ No newline at end of file