public GraphData Build(DotNetProjectGraphDiscoveryService service, ICollection<CsprojFileData> projects, ICollection<SolutionFileData> solutions)
        {
            var graphData = new GraphData();

            // crete nodes from csproj data
            var projectsWithNode = projects.Select(fd => new
            {
                FileData = fd,
                Node = CreateNodeFromCsprojFileData(fd, NodeState.Normal)
            }).ToList();

            var solutionsWithNode = solutions.Select(fd => new
            {
                FileData = fd,
                Node = CreateNodeFromSolutionFileData(fd, NodeState.Normal)
            }).ToList();

            // references
            graphData.References = new List<ReferenceDefinition>();
            foreach (var item in solutionsWithNode)
            {
                var directory = Path.GetDirectoryName(item.FileData.FileName);

                foreach (var reference in item.FileData.Projects)
                {
                    // resolve path and find csproj file
                    var referencedNode = projectsWithNode.FirstOrDefault(i => i.FileData != null && string.Equals(i.FileData.FileName, reference.FullPath, StringComparison.OrdinalIgnoreCase));

                    if (referencedNode == null)
                    {
                        // not found - create "not found" node
                        bool outOfBound = PathHelper.IsDescendant(service.FolderPathFullPath, reference.FullPath);
                        var missingReferenceData = new CsprojFileData() { FileName = reference.FullPath };
                        referencedNode = new
                        {
                            FileData = missingReferenceData,
                            Node = CreateNodeFromCsprojFileData(missingReferenceData, outOfBound ? NodeState.OutOfBound : NodeState.NotFound)
                        };
                        projectsWithNode.Add(referencedNode);
                    }

                    // create reference
                    graphData.References.Add(new ReferenceDefinition()
                        {
                            NodeFromId = item.Node.Id,
                            NodeToId = referencedNode.Node.Id
                        });
                }
            }

            // nodes
            graphData.Nodes =
                projectsWithNode.Select(d => d.Node)
                .Union(solutionsWithNode.Select(d => d.Node))
                .ToDictionary(d => d.Id);

            return graphData;
        }
 private NodeDefinition CreateNodeFromCsprojFileData(CsprojFileData data, NodeState state)
 {
     return new NodeDefinition()
         {
             Id = "project.csproj." + data.FileName,
             Name = Path.GetFileNameWithoutExtension(data.FileName),
             Path = data.FileName,
             State = state,
             Type = "project.csproj"
         };
 }
        public CsprojFileData ReadFromFile(string filename)
        {
            var result = new CsprojFileData()
            {
                FileName = filename,
                References = new List<string>()
            };

            // read file and its references
            var document = new XmlDocument();
            document.Load(filename);

            var nsmgr = new XmlNamespaceManager(document.NameTable);
            nsmgr.AddNamespace("c", "http://schemas.microsoft.com/developer/msbuild/2003");

            foreach (var node in document.SelectNodes("/c:Project/c:ItemGroup/c:ProjectReference/@Include", nsmgr).Cast<XmlNode>())
            {
                result.References.Add(node.Value);
            }

            return result;
        }