diff options
17 files changed, 159 insertions, 76 deletions
diff --git a/main/src/addins/AspNet/Commands/GoToControllerCommandHandler.cs b/main/src/addins/AspNet/Commands/GoToControllerCommandHandler.cs index 252a97bb27..e0315df398 100644 --- a/main/src/addins/AspNet/Commands/GoToControllerCommandHandler.cs +++ b/main/src/addins/AspNet/Commands/GoToControllerCommandHandler.cs @@ -1,29 +1,29 @@ -//
-// GoToControllerCommandHandler.cs
-//
-// Author:
-// Piotr Dowgiallo <sparekd@gmail.com>
-//
-// Copyright (c) 2012 Piotr Dowgiallo
-//
-// 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.
-
+// +// GoToControllerCommandHandler.cs +// +// Author: +// Piotr Dowgiallo <sparekd@gmail.com> +// +// Copyright (c) 2012 Piotr Dowgiallo +// +// 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 System.Linq;
using Microsoft.CodeAnalysis;
@@ -32,7 +32,8 @@ using MonoDevelop.Components.Commands; using MonoDevelop.Core;
using MonoDevelop.Ide;
using MonoDevelop.Ide.TypeSystem;
-
+using MonoDevelop.Refactoring; + namespace MonoDevelop.AspNet.Commands
{
class GoToControllerCommandHandler : CommandHandler
@@ -61,7 +62,7 @@ namespace MonoDevelop.AspNet.Commands var controller = FindController (doc.Project, name);
if (controller != null)
- IdeApp.ProjectOperations.JumpToDeclaration (controller, doc.Project);
+ RefactoringService.RoslynJumpToDeclaration (controller, doc.Project);
else
MessageService.ShowError ("Matching controller cannot be found.");
}
diff --git a/main/src/addins/CSharpBinding/CSharpBinding.addin.xml b/main/src/addins/CSharpBinding/CSharpBinding.addin.xml index 4099dd5adb..e99e35536b 100644 --- a/main/src/addins/CSharpBinding/CSharpBinding.addin.xml +++ b/main/src/addins/CSharpBinding/CSharpBinding.addin.xml @@ -300,5 +300,9 @@ <Extension path = "/MonoDevelop/Refactoring/FindReferencesProvider"> <Class class="MonoDevelop.CSharp.Refactoring.CSharpFindReferencesProvider" /> </Extension> + + <Extension path = "/MonoDevelop/Refactoring/JumpToDeclarationHandler"> + <Class class="MonoDevelop.CSharp.Refactoring.CSharpJumpToDeclarationHandler" /> + </Extension> </ExtensionModel>
\ No newline at end of file diff --git a/main/src/addins/CSharpBinding/CSharpBinding.csproj b/main/src/addins/CSharpBinding/CSharpBinding.csproj index 0630cfbe8c..1e5020eede 100644 --- a/main/src/addins/CSharpBinding/CSharpBinding.csproj +++ b/main/src/addins/CSharpBinding/CSharpBinding.csproj @@ -795,6 +795,7 @@ <Compile Include="Util\Glyph.cs" /> <Compile Include="MonoDevelop.CSharp.Features\Completion\ContextHandler\RegexContextHandler.cs" /> <Compile Include="MonoDevelop.CSharp.Refactoring\CSharpFindReferencesProvider.cs" /> + <Compile Include="MonoDevelop.CSharp.Refactoring\CSharpJumpToDeclarationHandler.cs" /> </ItemGroup> <ItemGroup> <None Include="Makefile.am" /> diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpFeaturesTextEditorExtension.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpFeaturesTextEditorExtension.cs index 4ec807c365..8419616f70 100644 --- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpFeaturesTextEditorExtension.cs +++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpFeaturesTextEditorExtension.cs @@ -46,7 +46,7 @@ namespace MonoDevelop.CSharp.Refactoring static CSharpFeaturesTextEditorExtension () { GoToDefinitionService.TryNavigateToSymbol = delegate (ISymbol symbol, Microsoft.CodeAnalysis.Project project, bool usePreviewTab) { - IdeApp.ProjectOperations.JumpToDeclaration (symbol, TypeSystemService.GetMonoProject (project)); + RefactoringService.RoslynJumpToDeclaration (symbol, TypeSystemService.GetMonoProject (project)); return true; }; diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpFindReferencesProvider.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpFindReferencesProvider.cs index 820e5f357c..2a1ca4fed5 100644 --- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpFindReferencesProvider.cs +++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpFindReferencesProvider.cs @@ -43,13 +43,14 @@ namespace MonoDevelop.CSharp.Refactoring { class CSharpFindReferencesProvider : FindReferencesProvider { - class LookupResult + internal class LookupResult { public static LookupResult Failure = new LookupResult (); public bool Success { get; private set; } public ISymbol Symbol { get; private set; } public Solution Solution { get; private set; } + public MonoDevelop.Projects.Project MonoDevelopProject { get; internal set; } public Compilation Compilation { get; private set; } public LookupResult () @@ -65,7 +66,7 @@ namespace MonoDevelop.CSharp.Refactoring } } - async Task<LookupResult> TryLookupSymbolInProject (Microsoft.CodeAnalysis.Project prj, string documentationCommentId, CancellationToken token) + static async Task<LookupResult> TryLookupSymbolInProject (Microsoft.CodeAnalysis.Project prj, string documentationCommentId, CancellationToken token) { if (string.IsNullOrEmpty (documentationCommentId)) return LookupResult.Failure; @@ -102,30 +103,36 @@ namespace MonoDevelop.CSharp.Refactoring return LookupResult.Failure; } - async Task<LookupResult> TryLookupSymbol (string documentationCommentId, CancellationToken token) + internal static async Task<LookupResult> TryLookupSymbol (string documentationCommentId, MonoDevelop.Projects.Project hintProject, CancellationToken token) { - var project = IdeApp.ProjectOperations.CurrentSelectedProject; - if (project != null) { - var prj = TypeSystemService.GetCodeAnalysisProject (project); - if (prj != null) { - var result = await TryLookupSymbolInProject (prj, documentationCommentId, token); - if (result.Success) + Microsoft.CodeAnalysis.Project codeAnalysisHintProject = null; + if (hintProject != null) { + codeAnalysisHintProject = TypeSystemService.GetCodeAnalysisProject (hintProject); + if (codeAnalysisHintProject != null) { + var result = await TryLookupSymbolInProject (codeAnalysisHintProject, documentationCommentId, token); + if (result.Success) { + result.MonoDevelopProject = hintProject; return result; + } } } foreach (var ws in TypeSystemService.AllWorkspaces) { foreach (var prj in ws.CurrentSolution.Projects) { + if (prj == codeAnalysisHintProject) + continue; var result = await TryLookupSymbolInProject (prj, documentationCommentId, token); - if (result.Success) + if (result.Success) { + result.MonoDevelopProject = TypeSystemService.GetMonoProject (prj); return result; + } } } return LookupResult.Failure; } - INamedTypeSymbol LookupType (string documentationCommentId, int reminder, INamedTypeSymbol current) + static INamedTypeSymbol LookupType (string documentationCommentId, int reminder, INamedTypeSymbol current) { var idx = documentationCommentId.IndexOf ('.', reminder); var exact = idx < 0; @@ -175,7 +182,7 @@ namespace MonoDevelop.CSharp.Refactoring return current; } - public override Task<IEnumerable<SearchResult>> FindReferences (string documentationCommentId, CancellationToken token) + public override Task<IEnumerable<SearchResult>> FindReferences (string documentationCommentId, MonoDevelop.Projects.Project hintProject, CancellationToken token) { var workspace = TypeSystemService.Workspace as MonoDevelopWorkspace; if (workspace == null) @@ -183,7 +190,7 @@ namespace MonoDevelop.CSharp.Refactoring return Task.Run (async delegate { var result = new List<SearchResult> (); - var lookup = await TryLookupSymbol (documentationCommentId, token); + var lookup = await TryLookupSymbol (documentationCommentId, hintProject, token); if (!lookup.Success) { return result; } @@ -225,7 +232,7 @@ namespace MonoDevelop.CSharp.Refactoring }); } - public override Task<IEnumerable<SearchResult>> FindAllReferences (string documentationCommentId, CancellationToken token) + public override Task<IEnumerable<SearchResult>> FindAllReferences (string documentationCommentId, MonoDevelop.Projects.Project hintProject, CancellationToken token) { var workspace = TypeSystemService.Workspace as MonoDevelopWorkspace; if (workspace == null) @@ -233,7 +240,7 @@ namespace MonoDevelop.CSharp.Refactoring return Task.Run (async delegate { var antiDuplicatesSet = new HashSet<SearchResult> (new SearchResultComparer ()); var result = new List<SearchResult> (); - var lookup = await TryLookupSymbol (documentationCommentId, token); + var lookup = await TryLookupSymbol (documentationCommentId, hintProject, token); if (!lookup.Success) return result; diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpJumpToDeclarationHandler.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpJumpToDeclarationHandler.cs index 79e798fa05..8ce24f29b8 100644 --- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpJumpToDeclarationHandler.cs +++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpJumpToDeclarationHandler.cs @@ -23,13 +23,22 @@ // 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 System.Threading.Tasks; +using MonoDevelop.Refactoring; +using MonoDevelop.Ide; +using System.Linq; + namespace MonoDevelop.CSharp.Refactoring { - public class CSharpJumpToDeclarationHandler + class CSharpJumpToDeclarationHandler : JumpToDeclarationHandler { - public CSharpJumpToDeclarationHandler () + public override async Task<bool> TryJumpToDeclarationAsync (string documentIdString, MonoDevelop.Projects.Project hintProject, System.Threading.CancellationToken token) { + var lookup = await CSharpFindReferencesProvider.TryLookupSymbol (documentIdString, hintProject, token); + if (!lookup.Success || lookup.Symbol.Locations.First().IsInMetadata) + return false; + IdeApp.ProjectOperations.JumpToDeclaration (lookup.Symbol, lookup.MonoDevelopProject); + return true; } } } diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/GotoBaseDeclarationHandler.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/GotoBaseDeclarationHandler.cs index ea42862a3e..fef916d350 100644 --- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/GotoBaseDeclarationHandler.cs +++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/GotoBaseDeclarationHandler.cs @@ -28,6 +28,7 @@ using Microsoft.CodeAnalysis; using MonoDevelop.Ide; using System.Linq; using MonoDevelop.Core; +using MonoDevelop.Refactoring; namespace MonoDevelop.CSharp.Refactoring { @@ -81,28 +82,28 @@ namespace MonoDevelop.CSharp.Refactoring throw new ArgumentNullException ("symbol"); switch (symbol.Kind) { case SymbolKind.NamedType: - IdeApp.ProjectOperations.JumpToDeclaration (((ITypeSymbol)symbol).BaseType, doc.Project); + RefactoringService.RoslynJumpToDeclaration (((ITypeSymbol)symbol).BaseType, doc.Project); break; case SymbolKind.Property: var property = (IPropertySymbol)symbol; if (property.OverriddenProperty != null) - IdeApp.ProjectOperations.JumpToDeclaration (property.OverriddenProperty, doc.Project); + RefactoringService.RoslynJumpToDeclaration (property.OverriddenProperty, doc.Project); else - IdeApp.ProjectOperations.JumpToDeclaration (property.ExplicitInterfaceImplementations.First (), doc.Project); + RefactoringService.RoslynJumpToDeclaration (property.ExplicitInterfaceImplementations.First (), doc.Project); break; case SymbolKind.Event: var evt = (IEventSymbol)symbol; if (evt.OverriddenEvent != null) - IdeApp.ProjectOperations.JumpToDeclaration (evt.OverriddenEvent, doc.Project); + RefactoringService.RoslynJumpToDeclaration (evt.OverriddenEvent, doc.Project); else - IdeApp.ProjectOperations.JumpToDeclaration (evt.ExplicitInterfaceImplementations.First (), doc.Project); + RefactoringService.RoslynJumpToDeclaration (evt.ExplicitInterfaceImplementations.First (), doc.Project); break; case SymbolKind.Method: var method = (IMethodSymbol)symbol; if (method.OverriddenMethod != null) - IdeApp.ProjectOperations.JumpToDeclaration (method.OverriddenMethod, doc.Project); + RefactoringService.RoslynJumpToDeclaration (method.OverriddenMethod, doc.Project); else - IdeApp.ProjectOperations.JumpToDeclaration (method.ExplicitInterfaceImplementations.First (), doc.Project); + RefactoringService.RoslynJumpToDeclaration (method.ExplicitInterfaceImplementations.First (), doc.Project); break; } } diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/GotoDeclarationHandler.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/GotoDeclarationHandler.cs index f33182b7fe..7ca54c08f6 100644 --- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/GotoDeclarationHandler.cs +++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/GotoDeclarationHandler.cs @@ -75,9 +75,9 @@ namespace MonoDevelop.CSharp.Refactoring public static void JumpToDeclaration (MonoDevelop.Ide.Gui.Document doc, RefactoringSymbolInfo info) { if (info.Symbol != null) - IdeApp.ProjectOperations.JumpToDeclaration (info.Symbol, doc.Project); + RefactoringService.RoslynJumpToDeclaration (info.Symbol, doc.Project); if (info.CandidateSymbols.Length > 0) - IdeApp.ProjectOperations.JumpToDeclaration (info.CandidateSymbols[0], doc.Project); + RefactoringService.RoslynJumpToDeclaration (info.CandidateSymbols[0], doc.Project); } } } diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp/CSharpNavigationTextEditorExtension.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp/CSharpNavigationTextEditorExtension.cs index c555fbd408..57bf692a05 100644 --- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp/CSharpNavigationTextEditorExtension.cs +++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp/CSharpNavigationTextEditorExtension.cs @@ -35,6 +35,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using MonoDevelop.Ide; using MonoDevelop.Ide.Editor; using System.Linq; +using MonoDevelop.Refactoring; namespace MonoDevelop.CSharp { @@ -101,7 +102,7 @@ namespace MonoDevelop.CSharp if (IsNavigatable (info)) { result.Add (new NavigationSegment (node.Span.Start, node.Span.Length, delegate { GLib.Timeout.Add (50, delegate { - IdeApp.ProjectOperations.JumpToDeclaration (info.Symbol, documentContext.Project); + RefactoringService.RoslynJumpToDeclaration (info.Symbol, documentContext.Project); return false; }); })); @@ -119,7 +120,7 @@ namespace MonoDevelop.CSharp if (IsNavigatable(info)) { result.Add (new NavigationSegment (node.Name.Span.Start, node.Name.Span.Length, delegate { GLib.Timeout.Add (50, delegate { - IdeApp.ProjectOperations.JumpToDeclaration (info.Symbol, documentContext.Project); + RefactoringService.RoslynJumpToDeclaration (info.Symbol, documentContext.Project); return false; }); })); diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp/DeclaredSymbolInfo.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp/DeclaredSymbolInfo.cs index 1bb5e99436..b9ead2b396 100644 --- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp/DeclaredSymbolInfo.cs +++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp/DeclaredSymbolInfo.cs @@ -44,6 +44,7 @@ using Gtk; using MonoDevelop.Ide; using MonoDevelop.CSharp; using MonoDevelop.Components.MainToolbar; +using MonoDevelop.Refactoring; namespace MonoDevelop.CSharp { @@ -552,7 +553,7 @@ namespace MonoDevelop.CSharp if (doc != null) { var symbol = await type.GetSymbolAsync (doc, token); var project = TypeSystemService.GetMonoProject (doc.Id); - IdeApp.ProjectOperations.JumpToDeclaration (symbol, project); + RefactoringService.RoslynJumpToDeclaration (symbol, project); } } } diff --git a/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/ActionGroupView.cs b/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/ActionGroupView.cs index bef385e027..9bd11bc1f6 100644 --- a/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/ActionGroupView.cs +++ b/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/ActionGroupView.cs @@ -38,6 +38,7 @@ using MonoDevelop.DesignerSupport; using Microsoft.CodeAnalysis; using MonoDevelop.Ide; using System.Threading.Tasks; +using MonoDevelop.Refactoring; namespace MonoDevelop.GtkCore.GuiBuilder { @@ -183,7 +184,7 @@ namespace MonoDevelop.GtkCore.GuiBuilder var met = cls.GetMembers (signal.Handler).OfType<IMethodSymbol> ().FirstOrDefault (); if (met != null) { ShowPage (1); - IdeApp.ProjectOperations.JumpToDeclaration (met); + RefactoringService.RoslynJumpToDeclaration(met); } } diff --git a/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/GuiBuilderView.cs b/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/GuiBuilderView.cs index 00845bd1f2..f1b4ded7ea 100644 --- a/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/GuiBuilderView.cs +++ b/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/GuiBuilderView.cs @@ -46,6 +46,7 @@ using Gdk; using MonoDevelop.Ide; using Microsoft.CodeAnalysis; using System.Threading.Tasks; +using MonoDevelop.Refactoring; namespace MonoDevelop.GtkCore.GuiBuilder { @@ -378,7 +379,7 @@ namespace MonoDevelop.GtkCore.GuiBuilder .FirstOrDefault (); if (met != null) { ShowPage (0); - IdeApp.ProjectOperations.JumpToDeclaration (met); + RefactoringService.RoslynJumpToDeclaration (met); } } diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.addin.xml b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.addin.xml index 65e782eb5f..27e1aeae9c 100644 --- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.addin.xml +++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.addin.xml @@ -21,6 +21,10 @@ <ExtensionNode name="Class"/> </ExtensionPoint> + <ExtensionPoint path = "/MonoDevelop/Refactoring/JumpToDeclarationHandler"> + <ExtensionNode name="Class"/> + </ExtensionPoint> + <ExtensionNodeSet id="MonoDevelop.AnalysisCore.Rules"> <ExtensionNode name="Category" type="MonoDevelop.Ide.Codons.CategoryNode"> <ExtensionNodeSet id="MonoDevelop.AnalysisCore.Rules" /> diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.csproj b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.csproj index 2dab3b09a5..993059df04 100644 --- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.csproj +++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.csproj @@ -171,6 +171,7 @@ <Compile Include="MonoDevelop.CodeIssues\CodeFix.cs" /> <Compile Include="MonoDevelop.CodeIssues\CSharpSuppressionFixProvider.cs" /> <Compile Include="MonoDevelop.Refactoring\FindReferencesProvider.cs" /> + <Compile Include="MonoDevelop.Refactoring\JumpToDeclarationHandler.cs" /> </ItemGroup> <ItemGroup> <Folder Include="MonoDevelop.Refactoring\" /> diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/FindReferencesProvider.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/FindReferencesProvider.cs index 40f4ca900b..9e8d17fb4d 100644 --- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/FindReferencesProvider.cs +++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/FindReferencesProvider.cs @@ -29,13 +29,14 @@ using System.Threading.Tasks; using System.Collections; using System.Collections.Generic; using MonoDevelop.Ide.FindInFiles; +using MonoDevelop.Projects; namespace MonoDevelop.Refactoring { abstract class FindReferencesProvider { - public abstract Task<IEnumerable<SearchResult>> FindReferences (string documentationCommentId, CancellationToken token = default(CancellationToken)); - public abstract Task<IEnumerable<SearchResult>> FindAllReferences (string documentationCommentId, CancellationToken token = default(CancellationToken)); + public abstract Task<IEnumerable<SearchResult>> FindReferences (string documentationCommentId, Project hintProject, CancellationToken token = default(CancellationToken)); + public abstract Task<IEnumerable<SearchResult>> FindAllReferences (string documentationCommentId, Project hintProject, CancellationToken token = default(CancellationToken)); } } diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/JumpToDeclarationHandler.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/JumpToDeclarationHandler.cs index f9de28930f..54f2b36559 100644 --- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/JumpToDeclarationHandler.cs +++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/JumpToDeclarationHandler.cs @@ -24,13 +24,14 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; +using System.Threading; +using System.Threading.Tasks; + namespace MonoDevelop.Refactoring { - public class JumpToDeclarationHandler + abstract class JumpToDeclarationHandler { - public JumpToDeclarationHandler () - { - } + public abstract Task<bool> TryJumpToDeclarationAsync (string documentIdString, Projects.Project hintProject, CancellationToken token = default(CancellationToken)); } } diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoringService.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoringService.cs index 7eaeb7a4e2..bfee0967c7 100644 --- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoringService.cs +++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoringService.cs @@ -43,27 +43,42 @@ using MonoDevelop.Core.Instrumentation; using MonoDevelop.Ide.Editor; using Microsoft.CodeAnalysis.Options;
using MonoDevelop.Ide; -
+using MonoDevelop.Projects; +using Microsoft.CodeAnalysis; + namespace MonoDevelop.Refactoring { public static class RefactoringService { internal static Func<TextEditor, DocumentContext, OptionSet> OptionSetCreation; static List<FindReferencesProvider> findReferencesProvider = new List<FindReferencesProvider> (); + static List<JumpToDeclarationHandler> jumpToDeclarationHandler = new List<JumpToDeclarationHandler> (); + static RefactoringService () { AddinManager.AddExtensionNodeHandler ("/MonoDevelop/Refactoring/FindReferencesProvider", delegate(object sender, ExtensionNodeEventArgs args) { var provider = (FindReferencesProvider) args.ExtensionObject; switch (args.Change) { - case ExtensionChange.Add: + case ExtensionChange.Add: findReferencesProvider.Add (provider); break; - case ExtensionChange.Remove: + case ExtensionChange.Remove: findReferencesProvider.Remove (provider); break; } }); + AddinManager.AddExtensionNodeHandler ("/MonoDevelop/Refactoring/JumpToDeclarationHandler", delegate(object sender, ExtensionNodeEventArgs args) { + var provider = (JumpToDeclarationHandler) args.ExtensionObject; + switch (args.Change) { + case ExtensionChange.Add: + jumpToDeclarationHandler.Add (provider); + break; + case ExtensionChange.Remove: + jumpToDeclarationHandler.Remove (provider); + break; + } + }); } class RenameHandler @@ -91,7 +106,19 @@ namespace MonoDevelop.Refactoring { AcceptChanges (monitor, changes, MonoDevelop.Ide.TextFileProvider.Instance); } - + + public static async Task RoslynJumpToDeclaration (ISymbol symbol, Projects.Project hintProject = null, CancellationToken token = default(CancellationToken)) + { + if (symbol.Locations.Any (loc => loc.IsInSource)) { // all locals are in source. + IdeApp.ProjectOperations.JumpToDeclaration (symbol); + return; + } + var result = await TryJumpToDeclarationAsync (symbol.GetDocumentationCommentId (), hintProject, token).ConfigureAwait (false); + if (!result) { + IdeApp.ProjectOperations.JumpToDeclaration (symbol, hintProject); + } + } + public static void AcceptChanges (ProgressMonitor monitor, IList<Change> changes, MonoDevelop.Ide.ITextFileProvider fileProvider) { var rctx = new RefactoringOptions (null, null); @@ -212,12 +239,14 @@ namespace MonoDevelop.Refactoring return location; } - public static async Task FindReferencesAsync (string documentIdString, CancellationToken token = default(CancellationToken)) + public static async Task FindReferencesAsync (string documentIdString, Projects.Project hintProject = null, CancellationToken token = default(CancellationToken)) { + if (hintProject == null) + hintProject = IdeApp.Workbench.ActiveDocument?.Project; var monitor = IdeApp.Workbench.ProgressMonitors.GetSearchProgressMonitor (true, true); try { foreach (var provider in findReferencesProvider) { - foreach (var result in await provider.FindReferences (documentIdString, token)) { + foreach (var result in await provider.FindReferences (documentIdString, hintProject, token)) { monitor.ReportResult (result); } } @@ -232,15 +261,19 @@ namespace MonoDevelop.Refactoring } } - public static async Task FindAllReferencesAsync (string documentIdString, CancellationToken token = default(CancellationToken)) + public static async Task FindAllReferencesAsync (string documentIdString, Projects.Project hintProject = null, CancellationToken token = default(CancellationToken)) { + if (hintProject == null) + hintProject = IdeApp.Workbench.ActiveDocument?.Project; var monitor = IdeApp.Workbench.ProgressMonitors.GetSearchProgressMonitor (true, true); try { foreach (var provider in findReferencesProvider) { - foreach (var result in await provider.FindAllReferences (documentIdString, token)) { + foreach (var result in await provider.FindAllReferences (documentIdString, hintProject, token)) { monitor.ReportResult (result); } } + } catch (OperationCanceledException) { + } catch (Exception ex) { if (monitor != null) monitor.ReportError ("Error finding references", ex); @@ -251,5 +284,21 @@ namespace MonoDevelop.Refactoring monitor.Dispose (); } } + + public static async Task<bool> TryJumpToDeclarationAsync (string documentIdString, Projects.Project hintProject = null, CancellationToken token = default(CancellationToken)) + { + try { + if (hintProject == null) + hintProject = IdeApp.Workbench.ActiveDocument?.Project; + foreach (var handler in jumpToDeclarationHandler) { + if (await handler.TryJumpToDeclarationAsync (documentIdString, hintProject, token)) + return true; + } + } catch (OperationCanceledException) { + } catch (Exception ex) { + LoggingService.LogError ("Error finding references", ex); + } + return false; + } } -} +}
\ No newline at end of file |