Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Krüger <mkrueger@xamarin.com>2016-02-03 12:16:34 +0300
committerMike Krüger <mkrueger@xamarin.com>2016-02-03 12:16:44 +0300
commit8d19f4a3b547dfb8bbcda2f9f80091f71937989a (patch)
tree41c7a72df7ac0505ce4aeba51eeb0ea6b2d15dff
parent4a40d2673da583d007f409b8197293676e1b3e3d (diff)
[Refactoring] GotoDeclaration now works accross language boundaries.
-rw-r--r--main/src/addins/AspNet/Commands/GoToControllerCommandHandler.cs57
-rw-r--r--main/src/addins/CSharpBinding/CSharpBinding.addin.xml4
-rw-r--r--main/src/addins/CSharpBinding/CSharpBinding.csproj1
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpFeaturesTextEditorExtension.cs2
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpFindReferencesProvider.cs37
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/CSharpJumpToDeclarationHandler.cs15
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/GotoBaseDeclarationHandler.cs15
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Refactoring/GotoDeclarationHandler.cs4
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp/CSharpNavigationTextEditorExtension.cs5
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp/DeclaredSymbolInfo.cs3
-rw-r--r--main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/ActionGroupView.cs3
-rw-r--r--main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/GuiBuilderView.cs3
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.addin.xml4
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring.csproj1
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/FindReferencesProvider.cs5
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/JumpToDeclarationHandler.cs9
-rw-r--r--main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/RefactoringService.cs67
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