using System; using System.Collections.Generic; using System.Linq; namespace Semmle.Extraction.CSharp.DependencyFetching { internal static class AssemblyCacheExtensions { private static readonly Version emptyVersion = new Version(0, 0, 0, 0); /// /// This method orders AssemblyInfos. The method is used to define the assembly preference order in case of conflicts. /// public static IOrderedEnumerable OrderAssemblyInfosByPreference(this IEnumerable assemblies, IEnumerable frameworkPaths) { // prefer framework assemblies over others int initialOrdering(AssemblyInfo info) => frameworkPaths.Any(framework => info.Filename.StartsWith(framework, StringComparison.OrdinalIgnoreCase)) ? 1 : 0; var ordered = assemblies is IOrderedEnumerable o ? o.ThenBy(initialOrdering) : assemblies.OrderBy(initialOrdering); return ordered .ThenBy(info => info.Version ?? emptyVersion) .ThenBy(info => info.NetCoreVersion ?? emptyVersion) .ThenBy(info => info.Filename); } } }