in src/Tasks/Microsoft.NET.Build.Tasks/PreprocessPackageDependenciesDesignTime.cs [281:346]
private void AddDependenciesToTheWorld(Dictionary<string, ItemMetadata> items,
ITaskItem[] itemDependencies,
Func<ITaskItem, bool> shouldSkipItemCheck = null)
{
foreach (var dependency in itemDependencies)
{
var currentItemId = dependency.ItemSpec;
if (!items.Keys.Contains(currentItemId))
{
// if this package definition does not even exist - skip it
continue;
}
if (shouldSkipItemCheck != null && shouldSkipItemCheck(dependency))
{
continue;
}
var parentTargetId = dependency.GetMetadata(MetadataKeys.ParentTarget) ?? string.Empty;
if (parentTargetId.Contains("/") || !Targets.Keys.Contains(parentTargetId))
{
// skip "target/rid"s and only consume actual targets and ignore non-existent parent targets
continue;
}
var parentPackageId = dependency.GetMetadata(MetadataKeys.ParentPackage) ?? string.Empty;
if (!string.IsNullOrEmpty(parentPackageId) && !Packages.Keys.Contains(parentPackageId))
{
// ignore non-existent parent packages
continue;
}
var currentPackageUniqueId = $"{parentTargetId}/{currentItemId}";
// add current package to dependencies world
var currentItem = GetItem(items, currentItemId);
DependenciesWorld[currentPackageUniqueId] = currentItem;
// update parent
var parentDependencyId = $"{parentTargetId}/{parentPackageId}".Trim('/');
ItemMetadata parentDependency = null;
if (DependenciesWorld.TryGetValue(parentDependencyId, out parentDependency))
{
parentDependency.Dependencies.Add(currentItemId);
if (parentDependency.Type == DependencyType.Target)
{
currentItem.IsTopLevelDependency = true;
}
}
else
{
// Update parent's Dependencies count and make sure parent is in the dependencies world
if (!string.IsNullOrEmpty(parentPackageId))
{
parentDependency = GetItem(Packages, parentPackageId);
}
else
{
parentDependency = GetItem(Targets, parentTargetId);
currentItem.IsTopLevelDependency = true;
}
parentDependency.Dependencies.Add(currentItemId);
DependenciesWorld[parentDependencyId] = parentDependency;
}
}
}