diff options
author | Mike Krüger <mkrueger@xamarin.com> | 2013-08-08 14:02:04 +0400 |
---|---|---|
committer | Mike Krüger <mkrueger@xamarin.com> | 2013-08-08 14:02:04 +0400 |
commit | d2420b05b46db4f45a4c47d43aa15148bee0cc04 (patch) | |
tree | 288b73db3bceb6a04e66188c3ac16a7b8cbddbc9 /main | |
parent | 3ae2fb918f053aca258fb77c4532beb7738879da (diff) |
[Refactoring] Added find extension methods command.
Diffstat (limited to 'main')
6 files changed, 82 insertions, 8 deletions
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.CodeGeneration/PartialGenerator.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.CodeGeneration/PartialGenerator.cs index bed92f5228..1cd0e0b295 100644 --- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.CodeGeneration/PartialGenerator.cs +++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.CodeGeneration/PartialGenerator.cs @@ -4,7 +4,7 @@ // Author: // Mike Krüger <mkrueger@xamarin.com> // -// Copyright (c) 2013 Xamarin +// Copyright (c) 2013 Xamarin Inc. (http://xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.csproj b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.csproj index fb3cf0a709..9b258a2712 100644 --- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.csproj +++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.csproj @@ -137,6 +137,7 @@ <Compile Include="AddinInfo.cs" /> <Compile Include="MonoDevelop.Refactoring\FindDerivedSymbolsHandler.cs" /> <Compile Include="MonoDevelop.Refactoring\FindMemberOverloadsHandler.cs" /> + <Compile Include="MonoDevelop.Refactoring\FindExtensionMethodHandler.cs" /> </ItemGroup> <ItemGroup> <Folder Include="MonoDevelop.Refactoring\" /> diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/FindDerivedSymbolsHandler.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/FindDerivedSymbolsHandler.cs index 85fabc877d..dd1cf91208 100644 --- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/FindDerivedSymbolsHandler.cs +++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/FindDerivedSymbolsHandler.cs @@ -4,7 +4,7 @@ // Author: // Mike Krüger <mkrueger@xamarin.com> // -// Copyright (c) 2013 Xamarin +// Copyright (c) 2013 Xamarin Inc. (http://xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/FindExtensionMethodHandler.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/FindExtensionMethodHandler.cs new file mode 100644 index 0000000000..d2cc7bbaed --- /dev/null +++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/FindExtensionMethodHandler.cs @@ -0,0 +1,74 @@ +// +// FindExtensionMethodHandler.cs +// +// Author: +// Mike Krüger <mkrueger@xamarin.com> +// +// Copyright (c) 2013 Xamarin Inc. (http://xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System; +using MonoDevelop.Ide; +using ICSharpCode.NRefactory.TypeSystem; +using MonoDevelop.Ide.FindInFiles; +using Mono.TextEditor; +using ICSharpCode.NRefactory.Analysis; +using ICSharpCode.NRefactory.CSharp.Resolver; + +namespace MonoDevelop.Refactoring +{ + public class FindExtensionMethodHandler + { + Ide.Gui.Document doc; + ITypeDefinition entity; + + public FindExtensionMethodHandler (Ide.Gui.Document doc, ITypeDefinition entity) + { + this.doc = doc; + this.entity = entity; + } + + public void Run () + { + using (var monitor = IdeApp.Workbench.ProgressMonitors.GetSearchProgressMonitor (true, true)) { + foreach (var type in doc.Compilation.GetAllTypeDefinitions ()) { + if (!type.IsStatic) + continue; + foreach (var method in type.GetMethods (m => m.IsStatic)) { + if (!method.IsExtensionMethod) + continue; + IType[] ifTypes; + if (!CSharpResolver.IsEligibleExtensionMethod (this.entity, method, true, out ifTypes)) + continue; + + var tf = TextFileProvider.Instance.GetReadOnlyTextEditorData (method.Region.FileName); + var start = tf.LocationToOffset (method.Region.Begin); + tf.SearchRequest.SearchPattern = method.Name; + var sr = tf.SearchForward (start); + if (sr != null) + start = sr.Offset; + monitor.ReportResult (new MemberReference (method, method.Region, start, method.Name.Length)); + } + } + } + } + } +} + diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/FindMemberOverloadsHandler.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/FindMemberOverloadsHandler.cs index d5d504986c..278169dda3 100644 --- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/FindMemberOverloadsHandler.cs +++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/FindMemberOverloadsHandler.cs @@ -4,7 +4,7 @@ // Author: // Mike Krüger <mkrueger@xamarin.com> // -// Copyright (c) 2013 Xamarin +// Copyright (c) 2013 Xamarin Inc. (http://xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -51,10 +51,8 @@ namespace MonoDevelop.Refactoring var start = tf.LocationToOffset (overloadedMember.Region.Begin); tf.SearchRequest.SearchPattern = overloadedMember.Name; var sr = tf.SearchForward (start); - if (sr != null) { + if (sr != null) start = sr.Offset; - } - monitor.ReportResult (new MemberReference (overloadedMember, overloadedMember.Region, start, overloadedMember.Name.Length)); } } diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoryCommands.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoryCommands.cs index 52e17e950b..46f4135e66 100644 --- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoryCommands.cs +++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoryCommands.cs @@ -346,8 +346,6 @@ namespace MonoDevelop.Refactoring } } - - if (item is ITypeDefinition) { ITypeDefinition cls = (ITypeDefinition)item; foreach (var bc in cls.DirectBaseTypes) { @@ -359,6 +357,9 @@ namespace MonoDevelop.Refactoring if ((cls.Kind == TypeKind.Class && !cls.IsSealed) || cls.Kind == TypeKind.Interface) { ainfo.Add (cls.Kind != TypeKind.Interface ? GettextCatalog.GetString ("Find _derived classes") : GettextCatalog.GetString ("Find _implementor classes"), new System.Action (new FindDerivedClasses (cls).Run)); } + ainfo.Add (GettextCatalog.GetString ("Find Extension Methods"), new System.Action (new FindExtensionMethodHandler (doc, cls).Run)); + added = true; + } if (added) |