public override void VisitObject(object obj, ObjectDescriptor descriptor, bool visitMembers) { // references and base var reference = obj as IReference; if (reference == null) { var attachedReference = AttachedReferenceManager.GetAttachedReference(obj); if (attachedReference != null && attachedReference.IsProxy) { reference = attachedReference; } } if (reference != null) { dependencies.AddBrokenLinkOut(reference, ContentLinkType.Reference); } else { base.VisitObject(obj, descriptor, visitMembers); } }
private void CollectOutputReferences(AssetDependencies dependencyRoot, AssetId assetId, HashSet <AssetId> visited, bool recursive, ContentLinkType linkTypes, ref int count) { if (visited != null) { if (visited.Contains(assetId)) { return; } visited.Add(assetId); } count++; var dependencies = CalculateDependencies(assetId); if (dependencies == null) { return; } // Add missing references foreach (var missingRef in dependencies.BrokenLinksOut) { dependencyRoot.AddBrokenLinkOut(missingRef); } // Add output references foreach (var child in dependencies.LinksOut) { if ((linkTypes & child.Type) != 0) { dependencyRoot.AddLinkOut(child); if (visited != null && recursive) { CollectOutputReferences(dependencyRoot, child.Item.Id, visited, true, linkTypes, ref count); } } } }
/// <summary> /// Collects all references of an asset dynamically. /// </summary> /// <param name="result">The result.</param> /// <param name="assetResolver">The asset resolver.</param> /// <param name="isRecursive">if set to <c>true</c> collects references recursively.</param> /// <param name="keepParents">Indicate if the parent of the provided <paramref name="result"/> should be kept or not</param> /// <exception cref="System.ArgumentNullException"> /// result /// or /// assetResolver /// </exception> private static void CollectDynamicOutReferences(AssetDependencies result, Func <AssetId, AssetItem> assetResolver, bool isRecursive, bool keepParents) { if (result == null) { throw new ArgumentNullException(nameof(result)); } if (assetResolver == null) { throw new ArgumentNullException(nameof(assetResolver)); } var addedReferences = new HashSet <AssetId>(); var itemsToAnalyze = new Queue <AssetItem>(); var referenceCollector = new DependenciesCollector(); // Reset the dependencies/parts. result.Reset(keepParents); var assetItem = result.Item; // marked as processed to not add it again addedReferences.Add(assetItem.Id); itemsToAnalyze.Enqueue(assetItem); while (itemsToAnalyze.Count > 0) { var item = itemsToAnalyze.Dequeue(); foreach (var link in referenceCollector.GetDependencies(item)) { if (addedReferences.Contains(link.Element.Id)) { continue; } // marked as processed to not add it again addedReferences.Add(link.Element.Id); // add the location to the reference location list var nextItem = assetResolver(link.Element.Id); if (nextItem != null) { result.AddLinkOut(nextItem, link.Type); // add current element to analyze list, to analyze dependencies recursively if (isRecursive) { itemsToAnalyze.Enqueue(nextItem); } } else { result.AddBrokenLinkOut(link); } } if (!isRecursive) { break; } } }