private static void SanityCheck(LogAnalyzer analyzer, Options options = null) { var dupes = analyzer.Invocations .Where(i => i.AssemblyName != null) .GroupBy(i => i.AssemblyName, StringComparer.OrdinalIgnoreCase) .Where(g => g.Count() > 1).ToArray(); if (dupes.Any()) { foreach (var dupe in dupes) { Log.Exception("=== Dupes: " + dupe.Key); foreach (var value in dupe) { Log.Exception(value.ToString()); } } } var ambiguousProjects = analyzer.assemblyNameToProjectFilePathsMap.Where(kvp => kvp.Value.Count > 1).ToArray(); if (ambiguousProjects.Any()) { foreach (var ambiguousProject in ambiguousProjects) { Log.Exception("Multiple projects for the same assembly name: " + ambiguousProject.Key); foreach (var value in ambiguousProject.Value) { Log.Exception(value); } } } var ambiguousIntermediatePaths = analyzer.intermediateAssemblyPathToOutputAssemblyPathMap .GroupBy(kvp => Path.GetFileNameWithoutExtension(kvp.Key), StringComparer.OrdinalIgnoreCase) .Where(g => g.Count() > 1) .OrderByDescending(g => g.Count()); if (ambiguousIntermediatePaths.Any()) { } if (analyzer.ambiguousFinalDestinations.Any()) { } foreach (var assemblyName in ambiguousInvocations.Keys.ToArray()) { var values = ambiguousInvocations[assemblyName].ToArray(); bool shouldRemove = true; for (int i = 1; i < values.Length; i++) { if (!values[i].OutputAssemblyPath.Equals(values[0].OutputAssemblyPath)) { // if entries in a bucket are different, we keep the bucket to report it at the end shouldRemove = false; break; } } // remove buckets where all entries are exactly the same if (shouldRemove) { ambiguousInvocations.Remove(assemblyName); } } if (ambiguousInvocations.Any()) { foreach (var ambiguousInvocation in ambiguousInvocations) { Log.Exception("Ambiguous invocations for the same assembly name: " + ambiguousInvocation.Key); foreach (var value in ambiguousInvocation.Value) { Log.Exception(value.ToString()); } } } if (options.CheckForNonExistingReferences) { DumpNonExistingReferences(); } }