public static void JumpToDeclaration (MonoDevelop.Ide.Gui.Document doc, RefactoringSymbolInfo info) { if (info.Symbol != null) RefactoringService.RoslynJumpToDeclaration (info.Symbol, doc.Project); if (info.CandidateSymbols.Length > 0) RefactoringService.RoslynJumpToDeclaration (info.CandidateSymbols[0], doc.Project); }
void FindImplementingSymbols (Compilation compilation, RefactoringSymbolInfo info) { var interfaceType = info.Symbol as ITypeSymbol; if (interfaceType == null) return; Task.Run (delegate { using (var monitor = IdeApp.Workbench.ProgressMonitors.GetSearchProgressMonitor (true, true)) { var parentTypeNode = info.Node?.Parent?.Parent?.Parent; if (parentTypeNode == null) return; var implementingType = info.Model.GetDeclaredSymbol (parentTypeNode) as INamedTypeSymbol; if (implementingType == null) return; foreach (var interfaceMember in interfaceType.GetMembers ()) { var impl = implementingType.FindImplementationForInterfaceMember (interfaceMember); if (impl == null) continue; var loc = impl.Locations.First (); monitor.ReportResult (new MemberReference (impl, loc.SourceTree.FilePath, loc.SourceSpan.Start, loc.SourceSpan.Length)); } foreach (var iFace in interfaceType.AllInterfaces) { foreach (var interfaceMember in iFace.GetMembers ()) { var impl = implementingType.FindImplementationForInterfaceMember (interfaceMember); if (impl == null) continue; var loc = impl.Locations.First (); monitor.ReportResult (new MemberReference (impl, loc.SourceTree.FilePath, loc.SourceSpan.Start, loc.SourceSpan.Length)); } } } }); }