From 65c37c6e700c76a5e429dd6bc924eb6565683f9b Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 14 Jun 2013 13:42:46 +0200 Subject: [PATCH] Use the TypeGraph from NRefactory; remove the one from SharpDevelop. --- .../FindDerivedClassesOrOverrides.cs | 10 ++++- .../FindReferenceService.cs | 43 +++---------------- .../RefactoringService/TypeGraphNode.cs | 3 +- src/Main/Base/Project/Util/TreeNode.cs | 2 +- 4 files changed, 16 insertions(+), 42 deletions(-) diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindDerivedClassesOrOverrides.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindDerivedClassesOrOverrides.cs index 2a572fa5d2..365b9a887e 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindDerivedClassesOrOverrides.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindDerivedClassesOrOverrides.cs @@ -33,9 +33,15 @@ namespace ICSharpCode.AvalonEdit.AddIn.ContextActions } #region Derived Classes + static ITreeNode BuildDerivedTypesGraph(ITypeDefinition baseClass) + { + var rootNode = FindReferenceService.BuildDerivedTypesGraph(baseClass); + return TreeNode.FromGraph(rootNode, n => n.DerivedTypes, n => n.TypeDefinition); + } + static ContextActionsPopup MakePopupWithDerivedClasses(ITypeDefinition baseClass) { - var derivedClassesTree = FindReferenceService.BuildDerivedTypesGraph(baseClass).ConvertToDerivedTypeTree(); + var derivedClassesTree = BuildDerivedTypesGraph(baseClass); var popupViewModel = new ContextActionsViewModel(); popupViewModel.Title = MenuService.ConvertLabel(StringParser.Parse( "${res:SharpDevelop.Refactoring.ClassesDerivingFrom}", new StringTagPair("Name", baseClass.Name))); @@ -54,7 +60,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.ContextActions #region Overrides static ContextActionsPopup MakePopupWithOverrides(IMember member) { - var derivedClassesTree = FindReferenceService.BuildDerivedTypesGraph(member.DeclaringTypeDefinition).ConvertToDerivedTypeTree(); + var derivedClassesTree = BuildDerivedTypesGraph(member.DeclaringTypeDefinition); var popupViewModel = new ContextActionsViewModel { Title = MenuService.ConvertLabel(StringParser.Parse( "${res:SharpDevelop.Refactoring.OverridesOf}", diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs index 0073cad9f8..ff423d1d01 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using ICSharpCode.Core; +using ICSharpCode.NRefactory.Analysis; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem.Implementation; using ICSharpCode.SharpDevelop.Editor.Search; @@ -169,10 +170,10 @@ namespace ICSharpCode.SharpDevelop.Refactoring if (baseType == null) throw new ArgumentNullException("baseType"); var solutionSnapshot = GetSolutionSnapshot(baseType.Compilation); - var compilations = GetProjectsThatCouldReferenceEntity(baseType).Select(p => solutionSnapshot.GetCompilation(p)); - var graph = BuildTypeInheritanceGraph(compilations); - TypeGraphNode node; - if (graph.TryGetValue(new AssemblyQualifiedTypeName(baseType), out node)) { + var assemblies = GetProjectsThatCouldReferenceEntity(baseType).Select(p => solutionSnapshot.GetCompilation(p).MainAssembly); + var graph = new TypeGraph(assemblies); + var node = graph.GetNode(baseType); + if (node != null) { // only derived types were requested, so don't return the base types // (this helps the GC to collect the unused parts of the graph more quickly) node.BaseTypes.Clear(); @@ -181,40 +182,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring return new TypeGraphNode(baseType); } } - - /// - /// Builds a graph of all type definitions in the specified set of project contents. - /// - /// The resulting graph may be cyclic if there are cyclic type definitions. - static Dictionary BuildTypeInheritanceGraph(IEnumerable compilations) - { - if (compilations == null) - throw new ArgumentNullException("projectContents"); - Dictionary dict = new Dictionary(); - foreach (ICompilation compilation in compilations) { - foreach (ITypeDefinition typeDef in compilation.MainAssembly.GetAllTypeDefinitions()) { - // Overwrite previous entry - duplicates can occur if there are multiple versions of the - // same project loaded in the solution (e.g. separate .csprojs for separate target frameworks) - dict[new AssemblyQualifiedTypeName(typeDef)] = new TypeGraphNode(typeDef); - } - } - foreach (ICompilation compilation in compilations) { - foreach (ITypeDefinition typeDef in compilation.MainAssembly.GetAllTypeDefinitions()) { - TypeGraphNode typeNode = dict[new AssemblyQualifiedTypeName(typeDef)]; - foreach (IType baseType in typeDef.DirectBaseTypes) { - ITypeDefinition baseTypeDef = baseType.GetDefinition(); - if (baseTypeDef != null) { - TypeGraphNode baseTypeNode; - if (dict.TryGetValue(new AssemblyQualifiedTypeName(baseTypeDef), out baseTypeNode)) { - typeNode.BaseTypes.Add(baseTypeNode); - baseTypeNode.DerivedTypes.Add(typeNode); - } - } - } - } - } - return dict; - } #endregion } diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/TypeGraphNode.cs b/src/Main/Base/Project/Src/Services/RefactoringService/TypeGraphNode.cs index 5f1be8d6a6..f987f9316f 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/TypeGraphNode.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/TypeGraphNode.cs @@ -22,6 +22,7 @@ using ICSharpCode.NRefactory.TypeSystem; namespace ICSharpCode.SharpDevelop.Refactoring { + /* public sealed class TypeGraphNode { internal readonly ITypeDefinition typeDef; @@ -54,5 +55,5 @@ namespace ICSharpCode.SharpDevelop.Refactoring { return TreeNode.FromGraph(this, n => n.derivedTypes, n => n.typeDef); } - } + }*/ } diff --git a/src/Main/Base/Project/Util/TreeNode.cs b/src/Main/Base/Project/Util/TreeNode.cs index aa722d0cd4..1c52492e94 100644 --- a/src/Main/Base/Project/Util/TreeNode.cs +++ b/src/Main/Base/Project/Util/TreeNode.cs @@ -19,7 +19,7 @@ namespace ICSharpCode.SharpDevelop IEnumerable> Children { get; } } - sealed class TreeNode : ITreeNode + public sealed class TreeNode : ITreeNode { public TreeNode(TContent content) {