Skip to content

Commit

Permalink
Added inter-assembly-references
Browse files Browse the repository at this point in the history
  • Loading branch information
typesafe committed Feb 18, 2011
1 parent e5ed1de commit e12a297
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 26 deletions.
8 changes: 0 additions & 8 deletions src/Typesafe.Nuget.Tests/PackageExtensionsTests.cs
Expand Up @@ -69,13 +69,5 @@ public void GetLinkTo_dependency_should_return_link_with_dependency_name_as_targ
Assert.AreEqual("dep (1.2.3)", p.GetLinkTo(dependency).Target);
}

[Test]
public void GetLinkTo_AssemblyReference_should_return_link_with_package_id_as_source()
{
var p = new TestPackage { Id = "test-package", Version = new Version("1.2.3") };
var r = new TestPackageAssemblyReference {Name = "ref"};

Assert.AreEqual("test-package", p.GetLinkTo(r).Source);
}
}
}
33 changes: 33 additions & 0 deletions src/Typesafe.Nuget/AssemblyExtensions.cs
@@ -0,0 +1,33 @@
using System.Reflection;
using Typesafe.Nuget.Dgml;

namespace Typesafe.Nuget
{
internal static class AssemblyExtensions
{
public static string GetNodeName(this Assembly assembly)
{
var assemblyName = assembly.GetName();
return string.Format("{0}.dll ({1})", assemblyName.Name, assemblyName.Version);
}

public static string GetNodeName(this AssemblyName assembly)
{
return string.Format("{0}.dll ({1})", assembly.Name, assembly.Version);
}

public static DirectedGraphNode ToGraphNode(this Assembly assembly)
{
return new DirectedGraphNode
{
Id = assembly.GetNodeName(),
Label = assembly.GetNodeName(),
Category1 = "Assembly"
};
}
public static DirectedGraphLink GetLinkTo(this Assembly reference, AssemblyName assemblyReference)
{
return new DirectedGraphLink { Source = reference.GetNodeName(), Target = assemblyReference.GetNodeName() };
}
}
}
48 changes: 40 additions & 8 deletions src/Typesafe.Nuget/GraphGenerator.cs
Expand Up @@ -13,6 +13,8 @@ public class GraphGenerator
{
private readonly IPackageRepository repository;
private readonly IDictionary<string, Assembly> referencedAssemblies = new Dictionary<string, Assembly>();
private IList<DirectedGraphNode> nodes;
private ICollection<DirectedGraphLink> links;

public GraphGenerator(PackageSource packageSource)
{
Expand All @@ -38,22 +40,22 @@ public void WriteGraph(Stream stream)

public DirectedGraph GenerateGraph()
{
var nodes = new List<DirectedGraphNode>();
var links = new List<DirectedGraphLink>();
nodes = new List<DirectedGraphNode>();
links = new List<DirectedGraphLink>();

GenerateGraph(nodes, links);
GenerateNodes();

return new DirectedGraph { Nodes = nodes.ToArray(), Links = links.ToArray() };
}

private void GenerateGraph(ICollection<DirectedGraphNode> nodes, ICollection<DirectedGraphLink> links)
private void GenerateNodes()
{
foreach (var package in repository.GetPackages())
{
var node = package.ToGraphNode(IncludeAssemblyReferences);
nodes.Add(node);

if (IncludeAssemblyReferences) WriteAssemblyReferences(package, links);
if (IncludeAssemblyReferences) WriteAssemblyReferences(package);

foreach (var dependency in package.Dependencies)
{
Expand All @@ -63,16 +65,46 @@ private void GenerateGraph(ICollection<DirectedGraphNode> nodes, ICollection<Dir
}
}

private static void WriteAssemblyReferences(IPackage package, ICollection<DirectedGraphLink> links)
private void WriteAssemblyReferences(IPackage package)
{
foreach (var assemblyReference in package.AssemblyReferences.Where(IsNonBclAssembly))
{
links.Add(package.GetLinkTo(assemblyReference));
var assembly = LoadAssembly(assemblyReference);
links.Add(package.GetLinkTo(assembly));
foreach (var referencedAssembly in assembly.GetReferencedAssemblies().Where(IsNonBclAssembly))
{
links.Add(assembly.GetLinkTo(referencedAssembly));
}
}
}

private static bool IsNonBclAssembly(IPackageAssemblyReference assemblyReference)
{
return !assemblyReference.Name.StartsWith("System") && !assemblyReference.Name.StartsWith("Microsoft");
var name = assemblyReference.Name;
return IsBclClassName(name);
}

private static bool IsNonBclAssembly(AssemblyName assemblyReference)
{
var name = assemblyReference.Name;
return IsBclClassName(name);
}

private static bool IsBclClassName(string name)
{
return !name.StartsWith("System") && !name.StartsWith("Microsoft") && !name.StartsWith("mscorlib");
}

private Assembly LoadAssembly(IPackageAssemblyReference reference)
{
if(!referencedAssemblies.ContainsKey(reference.Name))
{
var assembly = Assembly.ReflectionOnlyLoad(reference.GetStream().ReadAllBytes());
nodes.Add(assembly.ToGraphNode());
referencedAssemblies.Add(reference.Name, assembly);
}

return referencedAssemblies[reference.Name];
}
}
}
13 changes: 3 additions & 10 deletions src/Typesafe.Nuget/PackageExtensions.cs
@@ -1,16 +1,9 @@
using NuGet;
using System.Reflection;
using NuGet;
using Typesafe.Nuget.Dgml;

namespace Typesafe.Nuget
{
internal static class PackageAssemblyReferenceExtensions
{
public static string GetNodeName(this IPackageAssemblyReference reference)
{
return string.Format("{0}", reference.Name);
}
}

internal static class PackageExtensions
{
public static string GetNodeName(this IPackage package)
Expand Down Expand Up @@ -54,7 +47,7 @@ public static DirectedGraphLink GetLinkTo(this IPackage package, PackageDependen
return new DirectedGraphLink { Source = package.GetNodeName(), Target = dependency.GetNodeName(), Category1 ="Package" };
}

public static DirectedGraphLink GetLinkTo(this IPackage package, IPackageAssemblyReference assemblyReference)
public static DirectedGraphLink GetLinkTo(this IPackage package, Assembly assemblyReference)
{
return new DirectedGraphLink { Source = package.GetNodeName(), Target = assemblyReference.GetNodeName(), Category1 = "Contains" };
}
Expand Down
1 change: 1 addition & 0 deletions src/Typesafe.Nuget/Typesafe.Nuget.csproj
Expand Up @@ -42,6 +42,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="AssemblyExtensions.cs" />
<Compile Include="GraphGenerator.cs" />
<Compile Include="Dgml\dgml.cs">
<DependentUpon>dgml.xsd</DependentUpon>
Expand Down

0 comments on commit e12a297

Please sign in to comment.