in plugin-dotnet-agent/src/main/csharp/TeamCity.Dotnet.TestSuppressor/TeamCity.Dotnet.TestSuppressor/Domain/Targeting/TargetResolver.cs [31:97]
private IEnumerable<IFileInfo> Resolve(string target, ICollection<string> resolvedTargets)
{
_logger.LogInformation("Resolving target: {Target}", target);
var originalTargetPathResult = _fileSystem.TryGetFileSystemInfo(target);
if (originalTargetPathResult.IsError)
{
_logger.LogError(originalTargetPathResult.ErrorValue, "Target not available: {Target}", target);
throw new FileNotFoundException($"Target '{target}' not available");
}
var originalTargetPath = originalTargetPathResult.Value;
var supposedTargetType = SpeculateTargetType(originalTargetPath);
// if target is an assembly, we can process once and return it right away
if (supposedTargetType == TargetType.Assembly)
{
foreach (var (resolvedAssembly, _) in AssemblyStrategy.Resolve(originalTargetPath.FullName))
{
MarkTargetAsResolved(resolvedTargets, resolvedAssembly);
yield return (IFileInfo) resolvedAssembly;
}
yield break;
}
// if target is not an assembly, resolve all targets in the hierarchy using BFS
var queue = new Queue<(IFileSystemInfo, TargetType)>();
queue.Enqueue((originalTargetPath, supposedTargetType));
while (queue.Count != 0)
{
var (currentTarget, targetType) = queue.Dequeue();
if (IsAlreadyResolved(resolvedTargets, currentTarget))
{
continue;
}
if (!_strategies.TryGetValue(targetType, out var strategy))
{
_logger.LogError("No target resolution strategy for target type: {TargetType}", targetType);
continue;
}
foreach (var (resolvedTargetFile, resolvedTargetType) in strategy.Resolve(currentTarget.FullName))
{
if (resolvedTargetType == TargetType.Assembly)
{
if (IsAlreadyResolved(resolvedTargets, resolvedTargetFile))
{
continue;
}
foreach (var (resolvedAssembly, _) in AssemblyStrategy.Resolve(resolvedTargetFile.FullName))
{
MarkTargetAsResolved(resolvedTargets, resolvedAssembly);
yield return (IFileInfo) resolvedAssembly;
}
continue;
}
queue.Enqueue((resolvedTargetFile, resolvedTargetType));
}
MarkTargetAsResolved(resolvedTargets, currentTarget);
}
}