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); + } + } +}