private IEnumerable <Reference> Analyze(Package package, Type type)
        {
            Console.Write(".");

            myCancellationToken.ThrowIfCancellationRequested();

            var focusedPackageTypes = myPackageToTypesMap.Count > 1
                ? null
                : myPackageToTypesMap.Single().Value;

            return(new Inspector(myAssemblyLoader, type).GetUsedTypes()
                   // if only one package is given we analyse the deps within the package - otherwise between the packages
                   .Where(edge => (AllEdges && myPackageToTypesMap.Any(e => e.Value.Contains(edge.To))) ||
                          (focusedPackageTypes != null ? focusedPackageTypes.Contains(edge.To) : IsForeignPackage(package, edge.To)))
                   .Where(edge => !IsCompilerGenerated(edge.To))
                   .Select(edge => GraphUtils.Edge(edge))
                   .Where(edge => edge.From != edge.To));
        }
        private AnalysisDocument GenerateDocument(IReadOnlyCollection <Reference> edges)
        {
            var doc = new AnalysisDocument();

            var nodesWithEdgesIndex = new HashSet <Type>();

            if (UsedTypesOnly)
            {
                foreach (var edge in edges)
                {
                    nodesWithEdgesIndex.Add(edge.From);
                    nodesWithEdgesIndex.Add(edge.To);
                }
            }

            var relevantNotesWithCluster = myPackageToTypesMap
                                           .Select(e => new
            {
                Package = myRelevantPackages.Single(p => p.Name == e.Key),
                Types   = e.Value
            })
                                           .SelectMany((e, idx) => e.Types
                                                       .Select(t => new
            {
                Type         = t,
                Package      = e.Package,
                PackageIndex = idx
            }))
                                           .AsParallel()
                                           .Where(e => !UsedTypesOnly || nodesWithEdgesIndex.Contains(e.Type))
                                           .Select(e => new
            {
                Node         = GraphUtils.Node(e.Type),
                Cluster      = GetCluster(e.Package, e.Type),
                PackageIndex = e.PackageIndex
            });

            foreach (var entry in relevantNotesWithCluster)
            {
                doc.Add(entry.Node);

                if (entry.Cluster != null)
                {
                    doc.AddToCluster(entry.Node, entry.Cluster);
                }

                if (myPackageToTypesMap.Count > 1)
                {
                    // color coding of nodes we only need if multiple packages were analyzed
                    doc.AddNodeColor(entry.Node, Colors[entry.PackageIndex % Colors.Length]);
                }
            }

            foreach (var edge in edges)
            {
                doc.Add(edge);

                var color = GetEdgeColor(edge);
                if (color != null)
                {
                    doc.AddEdgeColor(edge, color);
                }
            }

            return(doc);
        }