Browse Source

Use the TypeGraph from NRefactory; remove the one from SharpDevelop.

pull/45/merge
Daniel Grunwald 12 years ago
parent
commit
65c37c6e70
  1. 10
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindDerivedClassesOrOverrides.cs
  2. 43
      src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs
  3. 3
      src/Main/Base/Project/Src/Services/RefactoringService/TypeGraphNode.cs
  4. 2
      src/Main/Base/Project/Util/TreeNode.cs

10
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindDerivedClassesOrOverrides.cs

@ -33,9 +33,15 @@ namespace ICSharpCode.AvalonEdit.AddIn.ContextActions
} }
#region Derived Classes #region Derived Classes
static ITreeNode<ITypeDefinition> BuildDerivedTypesGraph(ITypeDefinition baseClass)
{
var rootNode = FindReferenceService.BuildDerivedTypesGraph(baseClass);
return TreeNode<ITypeDefinition>.FromGraph(rootNode, n => n.DerivedTypes, n => n.TypeDefinition);
}
static ContextActionsPopup MakePopupWithDerivedClasses(ITypeDefinition baseClass) static ContextActionsPopup MakePopupWithDerivedClasses(ITypeDefinition baseClass)
{ {
var derivedClassesTree = FindReferenceService.BuildDerivedTypesGraph(baseClass).ConvertToDerivedTypeTree(); var derivedClassesTree = BuildDerivedTypesGraph(baseClass);
var popupViewModel = new ContextActionsViewModel(); var popupViewModel = new ContextActionsViewModel();
popupViewModel.Title = MenuService.ConvertLabel(StringParser.Parse( popupViewModel.Title = MenuService.ConvertLabel(StringParser.Parse(
"${res:SharpDevelop.Refactoring.ClassesDerivingFrom}", new StringTagPair("Name", baseClass.Name))); "${res:SharpDevelop.Refactoring.ClassesDerivingFrom}", new StringTagPair("Name", baseClass.Name)));
@ -54,7 +60,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.ContextActions
#region Overrides #region Overrides
static ContextActionsPopup MakePopupWithOverrides(IMember member) static ContextActionsPopup MakePopupWithOverrides(IMember member)
{ {
var derivedClassesTree = FindReferenceService.BuildDerivedTypesGraph(member.DeclaringTypeDefinition).ConvertToDerivedTypeTree(); var derivedClassesTree = BuildDerivedTypesGraph(member.DeclaringTypeDefinition);
var popupViewModel = new ContextActionsViewModel { var popupViewModel = new ContextActionsViewModel {
Title = MenuService.ConvertLabel(StringParser.Parse( Title = MenuService.ConvertLabel(StringParser.Parse(
"${res:SharpDevelop.Refactoring.OverridesOf}", "${res:SharpDevelop.Refactoring.OverridesOf}",

43
src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs

@ -7,6 +7,7 @@ using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.NRefactory.Analysis;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem.Implementation; using ICSharpCode.NRefactory.TypeSystem.Implementation;
using ICSharpCode.SharpDevelop.Editor.Search; using ICSharpCode.SharpDevelop.Editor.Search;
@ -169,10 +170,10 @@ namespace ICSharpCode.SharpDevelop.Refactoring
if (baseType == null) if (baseType == null)
throw new ArgumentNullException("baseType"); throw new ArgumentNullException("baseType");
var solutionSnapshot = GetSolutionSnapshot(baseType.Compilation); var solutionSnapshot = GetSolutionSnapshot(baseType.Compilation);
var compilations = GetProjectsThatCouldReferenceEntity(baseType).Select(p => solutionSnapshot.GetCompilation(p)); var assemblies = GetProjectsThatCouldReferenceEntity(baseType).Select(p => solutionSnapshot.GetCompilation(p).MainAssembly);
var graph = BuildTypeInheritanceGraph(compilations); var graph = new TypeGraph(assemblies);
TypeGraphNode node; var node = graph.GetNode(baseType);
if (graph.TryGetValue(new AssemblyQualifiedTypeName(baseType), out node)) { if (node != null) {
// only derived types were requested, so don't return the base types // 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) // (this helps the GC to collect the unused parts of the graph more quickly)
node.BaseTypes.Clear(); node.BaseTypes.Clear();
@ -181,40 +182,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return new TypeGraphNode(baseType); return new TypeGraphNode(baseType);
} }
} }
/// <summary>
/// Builds a graph of all type definitions in the specified set of project contents.
/// </summary>
/// <remarks>The resulting graph may be cyclic if there are cyclic type definitions.</remarks>
static Dictionary<AssemblyQualifiedTypeName, TypeGraphNode> BuildTypeInheritanceGraph(IEnumerable<ICompilation> compilations)
{
if (compilations == null)
throw new ArgumentNullException("projectContents");
Dictionary<AssemblyQualifiedTypeName, TypeGraphNode> dict = new Dictionary<AssemblyQualifiedTypeName, TypeGraphNode>();
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 #endregion
} }

3
src/Main/Base/Project/Src/Services/RefactoringService/TypeGraphNode.cs

@ -22,6 +22,7 @@ using ICSharpCode.NRefactory.TypeSystem;
namespace ICSharpCode.SharpDevelop.Refactoring namespace ICSharpCode.SharpDevelop.Refactoring
{ {
/*
public sealed class TypeGraphNode public sealed class TypeGraphNode
{ {
internal readonly ITypeDefinition typeDef; internal readonly ITypeDefinition typeDef;
@ -54,5 +55,5 @@ namespace ICSharpCode.SharpDevelop.Refactoring
{ {
return TreeNode<ITypeDefinition>.FromGraph(this, n => n.derivedTypes, n => n.typeDef); return TreeNode<ITypeDefinition>.FromGraph(this, n => n.derivedTypes, n => n.typeDef);
} }
} }*/
} }

2
src/Main/Base/Project/Util/TreeNode.cs

@ -19,7 +19,7 @@ namespace ICSharpCode.SharpDevelop
IEnumerable<ITreeNode<TContent>> Children { get; } IEnumerable<ITreeNode<TContent>> Children { get; }
} }
sealed class TreeNode<TContent> : ITreeNode<TContent> public sealed class TreeNode<TContent> : ITreeNode<TContent>
{ {
public TreeNode(TContent content) public TreeNode(TContent content)
{ {

Loading…
Cancel
Save