diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj
index 1cd11064d9..b45200bd78 100644
--- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj
+++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj
@@ -516,7 +516,6 @@
-
diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/FindReferences.cs b/ICSharpCode.NRefactory.CSharp/Resolver/FindReferences.cs
index 54f48bb38b..608d992861 100644
--- a/ICSharpCode.NRefactory.CSharp/Resolver/FindReferences.cs
+++ b/ICSharpCode.NRefactory.CSharp/Resolver/FindReferences.cs
@@ -72,6 +72,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
///
public bool WholeVirtualSlot { get; set; }
+ //public bool FindAllOverloads { get; set; }
+
///
/// Specifies whether to look for references in documentation comments.
/// This will find entity references in cref attributes and
diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Analysis/AbiComparerTests.cs b/ICSharpCode.NRefactory.Tests/Analysis/AbiComparerTests.cs
similarity index 95%
rename from ICSharpCode.NRefactory.Tests/CSharp/Analysis/AbiComparerTests.cs
rename to ICSharpCode.NRefactory.Tests/Analysis/AbiComparerTests.cs
index b6ee5388fc..057babe0c3 100644
--- a/ICSharpCode.NRefactory.Tests/CSharp/Analysis/AbiComparerTests.cs
+++ b/ICSharpCode.NRefactory.Tests/Analysis/AbiComparerTests.cs
@@ -25,16 +25,13 @@
// THE SOFTWARE.
using System;
-using System.IO;
using System.Linq;
-using System.Threading;
-using ICSharpCode.NRefactory.CSharp.Resolver;
+using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.TypeSystem;
-using ICSharpCode.NRefactory.TypeSystem.Implementation;
using NUnit.Framework;
using ICSharpCode.NRefactory.CSharp.CodeCompletion;
-namespace ICSharpCode.NRefactory.CSharp.Analysis
+namespace ICSharpCode.NRefactory.Analysis
{
[TestFixture]
public class AbiComparerTests
diff --git a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj
index 5a228d2f89..1b40722578 100644
--- a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj
+++ b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj
@@ -93,6 +93,7 @@
Properties\GlobalAssemblyInfo.cs
+
@@ -396,7 +397,6 @@
-
@@ -439,7 +439,9 @@
False
-
+
+
+
diff --git a/ICSharpCode.NRefactory.CSharp/Analysis/AbiComparer.cs b/ICSharpCode.NRefactory/Analysis/AbiComparer.cs
similarity index 99%
rename from ICSharpCode.NRefactory.CSharp/Analysis/AbiComparer.cs
rename to ICSharpCode.NRefactory/Analysis/AbiComparer.cs
index f00d9a081d..567f12a52f 100644
--- a/ICSharpCode.NRefactory.CSharp/Analysis/AbiComparer.cs
+++ b/ICSharpCode.NRefactory/Analysis/AbiComparer.cs
@@ -28,7 +28,7 @@ using ICSharpCode.NRefactory.TypeSystem;
using System.Collections.Generic;
using System.Linq;
-namespace ICSharpCode.NRefactory.CSharp
+namespace ICSharpCode.NRefactory.Analysis
{
///
/// Used to check the compatibility state of two compilations.
diff --git a/ICSharpCode.NRefactory/Analysis/TypeGraphNode.cs b/ICSharpCode.NRefactory/Analysis/TypeGraphNode.cs
new file mode 100644
index 0000000000..ed2384dbd8
--- /dev/null
+++ b/ICSharpCode.NRefactory/Analysis/TypeGraphNode.cs
@@ -0,0 +1,85 @@
+// Copyright (c) 2013 AlphaSierraPapa for the SharpDevelop Team
+//
+// 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.Collections.Generic;
+using ICSharpCode.NRefactory.TypeSystem;
+
+namespace ICSharpCode.NRefactory.Analysis
+{
+ public sealed class TypeGraphNode
+ {
+ readonly ITypeDefinition typeDef;
+ readonly List baseTypes = new List();
+ readonly List derivedTypes = new List();
+
+ ///
+ /// Creates a new unconnected type graph node.
+ ///
+ public TypeGraphNode(ITypeDefinition typeDef)
+ {
+ this.typeDef = typeDef;
+ }
+
+ public ITypeDefinition TypeDefinition {
+ get { return typeDef; }
+ }
+
+ public IList DerivedTypes {
+ get { return derivedTypes; }
+ }
+
+ public IList BaseTypes {
+ get { return baseTypes; }
+ }
+
+ ///
+ /// 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.
+ public static Dictionary BuildTypeInheritanceGraph(IEnumerable compilations)
+ {
+ if (compilations == null)
+ throw new ArgumentNullException("compilations");
+ 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;
+ }
+ }
+}
diff --git a/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj b/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj
index aab5480a98..d3979ad520 100644
--- a/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj
+++ b/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj
@@ -82,6 +82,8 @@
+
+
@@ -137,6 +139,7 @@
+
@@ -277,6 +280,7 @@
+
diff --git a/ICSharpCode.NRefactory/TypeSystem/AssemblyQualifiedTypeName.cs b/ICSharpCode.NRefactory/TypeSystem/AssemblyQualifiedTypeName.cs
new file mode 100644
index 0000000000..8b07c5197c
--- /dev/null
+++ b/ICSharpCode.NRefactory/TypeSystem/AssemblyQualifiedTypeName.cs
@@ -0,0 +1,79 @@
+// Copyright (c) 2013 AlphaSierraPapa for the SharpDevelop Team
+//
+// 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;
+
+namespace ICSharpCode.NRefactory.TypeSystem
+{
+ public struct AssemblyQualifiedTypeName : IEquatable
+ {
+ public readonly string AssemblyName;
+ public readonly FullTypeName TypeName;
+
+ public AssemblyQualifiedTypeName(FullTypeName typeName, string assemblyName)
+ {
+ this.AssemblyName = assemblyName;
+ this.TypeName = typeName;
+ }
+
+ public AssemblyQualifiedTypeName(ITypeDefinition typeDefinition)
+ {
+ this.AssemblyName = typeDefinition.ParentAssembly.AssemblyName;
+ this.TypeName = typeDefinition.FullTypeName;
+ }
+
+ public override string ToString()
+ {
+ if (string.IsNullOrEmpty(AssemblyName))
+ return TypeName.ToString();
+ else
+ return TypeName.ToString() + ", " + AssemblyName;
+ }
+
+ public override bool Equals(object obj)
+ {
+ return (obj is AssemblyQualifiedTypeName) && Equals((AssemblyQualifiedTypeName)obj);
+ }
+
+ public bool Equals(AssemblyQualifiedTypeName other)
+ {
+ return this.AssemblyName == other.AssemblyName && this.TypeName == other.TypeName;
+ }
+
+ public override int GetHashCode()
+ {
+ int hashCode = 0;
+ unchecked {
+ if (AssemblyName != null)
+ hashCode += 1000000007 * AssemblyName.GetHashCode();
+ hashCode += TypeName.GetHashCode();
+ }
+ return hashCode;
+ }
+
+ public static bool operator ==(AssemblyQualifiedTypeName lhs, AssemblyQualifiedTypeName rhs)
+ {
+ return lhs.Equals(rhs);
+ }
+
+ public static bool operator !=(AssemblyQualifiedTypeName lhs, AssemblyQualifiedTypeName rhs)
+ {
+ return !lhs.Equals(rhs);
+ }
+ }
+}