in src/ApiPort/ApiPort/CommandLineOptions.cs [156:219]
private static (ImmutableDictionary<IAssemblyFile, bool>, IReadOnlyCollection<string>) ProcessInputAssemblies(IEnumerable<string> files)
{
var s_ValidExtensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
".dll",
".exe",
".winmd",
".ilexe",
".ildll"
};
var inputAssemblies = new SortedDictionary<IAssemblyFile, bool>(AssemblyFileComparer.Instance);
var invalidInputFiles = new List<string>();
void ProcessInputAssemblies(string path, bool isExplicitlySpecified)
{
bool HasValidPEExtension(string assemblyLocation)
{
return s_ValidExtensions.Contains(Path.GetExtension(assemblyLocation));
}
if (Directory.Exists(path))
{
foreach (var file in Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories))
{
// If the user passes in a whole directory, any assembly we find in there
// was not explicitly passed in.
ProcessInputAssemblies(file, isExplicitlySpecified: false);
}
}
else if (File.Exists(path))
{
// Only add files with valid PE extensions to the list of
// assemblies to analyze since others are not valid assemblies
if (HasValidPEExtension(path))
{
var filePath = new FilePathAssemblyFile(path);
if (inputAssemblies.TryGetValue(filePath, out var isAssemblySpecified))
{
// If the assembly already exists, and it was not
// specified explicitly, in the the case where one
// value does not match the other, we default to
// saying that the assembly is specified.
inputAssemblies[filePath] = isExplicitlySpecified || isAssemblySpecified;
}
else
{
inputAssemblies.Add(filePath, isExplicitlySpecified);
}
}
}
else
{
invalidInputFiles.Add(path);
}
}
foreach (var file in files)
{
ProcessInputAssemblies(file, isExplicitlySpecified: true);
}
return (inputAssemblies.ToImmutableDictionary(), invalidInputFiles);
}