From ea68c5681c7e49bffdc21629a5dac0991c958dd4 Mon Sep 17 00:00:00 2001 From: petegoo Date: Mon, 26 May 2014 23:40:09 +1200 Subject: [PATCH] Support for vcxproj and vbproj.....I think --- ProjectDependencyVisualiser/Program.cs | 27 ++++++++++---- .../ProjectDependencyVisualiser.csproj | 1 + .../ProjectIdentity.cs | 35 +++++++++++++++++++ 3 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 ProjectDependencyVisualiser/ProjectIdentity.cs diff --git a/ProjectDependencyVisualiser/Program.cs b/ProjectDependencyVisualiser/Program.cs index 305cb84..fb5c2c0 100644 --- a/ProjectDependencyVisualiser/Program.cs +++ b/ProjectDependencyVisualiser/Program.cs @@ -39,7 +39,9 @@ static void Main(string[] args) throw new DirectoryNotFoundException(startingFolder); } - var projectFiles = Directory.GetFiles(startingFolder, "*.csproj", SearchOption.AllDirectories); + var projectFiles = Directory.GetFiles(startingFolder, "*.csproj", SearchOption.AllDirectories) + .Concat(Directory.GetFiles(startingFolder, "*.vbproj", SearchOption.AllDirectories)) + .Concat(Directory.GetFiles(startingFolder, "*.vcxproj", SearchOption.AllDirectories)); var excludeFilters = (arguments.ExcludeFilters ?? string.Empty).Split(',').Select(x => x.Trim()).Where(x => !string.IsNullOrEmpty(x)).ToArray(); var includeFilters = (arguments.IncludeFilters ?? string.Empty).Split(',').Select(x => x.Trim()).Where(x => !string.IsNullOrEmpty(x)).ToArray(); @@ -58,16 +60,21 @@ static void Main(string[] args) let xdoc = XDocument.Load(projectFilePath) let idElement = xdoc.Descendants(XName.Get("ProjectGuid", MsBuildNamespace)).FirstOrDefault() let nameElement = xdoc.Descendants(XName.Get("AssemblyName", MsBuildNamespace)).FirstOrDefault() - where idElement != null && nameElement != null + where idElement != null select new { ProjectId = idElement.Value, - Name = nameElement.Value, + Name = nameElement == null ? Path.GetFileNameWithoutExtension(projectFilePath) : nameElement.Value, References = GetProjectReferences(xdoc).ToArray() }).ToArray(); + foreach (var blankRef in references.SelectMany(r => r.References).Where(r => string.IsNullOrEmpty(r.Name))) + { + blankRef.Name = references.Where(r => r.ProjectId == blankRef.Identifier).Select(r => r.Name).FirstOrDefault(); + } + var allProjects = references.Select(r => r.Name) - .Concat(references.SelectMany(r => r.References)).Distinct().OrderBy(r => r).ToArray(); + .Concat(references.SelectMany(r => r.References).Where(r => r.Name != null).Select(r => r.Name)).Distinct().OrderBy(r => r).ToArray(); var dgmlNs = "http://schemas.microsoft.com/vs/2009/dgml"; @@ -91,19 +98,25 @@ static void Main(string[] args) from reference in project.References select new XElement(XName.Get("Link", dgmlNs), new XAttribute("Source", Array.IndexOf(allProjects, project.Name)), - new XAttribute("Target", Array.IndexOf(allProjects, reference)))); + new XAttribute("Target", Array.IndexOf(allProjects, reference.Name)))); outputXml.Save(arguments.OutputFile); } - private static IEnumerable GetProjectReferences(XDocument projectFileDocument) + private static IEnumerable GetProjectReferences(XDocument projectFileDocument) { return from projectReference in projectFileDocument.Descendants(XName.Get("ProjectReference", MsBuildNamespace)) + let idElement = projectReference.Element(XName.Get("Project", MsBuildNamespace)) let nameElement = projectReference.Element(XName.Get("Name", MsBuildNamespace)) - select nameElement.Value; + where idElement != null + select new ProjectIdentity( + idElement.Value, + nameElement == null + ? Path.GetFileNameWithoutExtension(projectReference.Attribute("Include") .Value) + : nameElement.Value); } diff --git a/ProjectDependencyVisualiser/ProjectDependencyVisualiser.csproj b/ProjectDependencyVisualiser/ProjectDependencyVisualiser.csproj index a3c9fdb..829bccd 100644 --- a/ProjectDependencyVisualiser/ProjectDependencyVisualiser.csproj +++ b/ProjectDependencyVisualiser/ProjectDependencyVisualiser.csproj @@ -45,6 +45,7 @@ + diff --git a/ProjectDependencyVisualiser/ProjectIdentity.cs b/ProjectDependencyVisualiser/ProjectIdentity.cs new file mode 100644 index 0000000..2159038 --- /dev/null +++ b/ProjectDependencyVisualiser/ProjectIdentity.cs @@ -0,0 +1,35 @@ +namespace ProjectDependencyVisualiser +{ + public class ProjectIdentity + { + protected bool Equals(ProjectIdentity other) + { + return string.Equals(Identifier, other.Identifier) && string.Equals(Name, other.Name); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((ProjectIdentity) obj); + } + + public override int GetHashCode() + { + unchecked + { + return ((Identifier != null ? Identifier.GetHashCode() : 0)*397) ^ (Name != null ? Name.GetHashCode() : 0); + } + } + + public string Identifier { get; private set; } + public string Name { get; set; } + + public ProjectIdentity(string identifier, string name) + { + Identifier = identifier; + Name = name; + } + } +} \ No newline at end of file