in resharper/resharper-unity/src/Unity/Yaml/Psi/DeferredCaches/PrefabImportCache.cs [123:199]
private IDictionary<long, IHierarchyElement> DoImport(Guid ownerGuid, AssetDocumentHierarchyElement assetDocumentHierarchyElement, HashSet<Guid> visitedGuid)
{
var result = new Dictionary<long, IHierarchyElement>();
foreach (var prefabInstanceHierarchy in assetDocumentHierarchyElement.GetPrefabInstanceHierarchies())
{
Interruption.Current.CheckAndThrow();
var guid = prefabInstanceHierarchy.SourcePrefabGuid;
var sourceFilePath = myMetaFileGuidCache.GetAssetFilePathsFromGuid(guid).FirstOrDefault();
if (sourceFilePath == null)
continue;
if (!myUnityExternalFilesPsiModule.TryGetFileByPath(sourceFilePath, out var sourceFile))
continue;
var prefabHierarchy = assetDocumentHierarchyElement.AssetDocumentHierarchyElementContainer.GetAssetHierarchyFor(sourceFile);
if (prefabHierarchy == null)
continue;
if (!myCache.TryGetFromCache(guid, out var importedElements))
{
if (!visitedGuid.Contains(guid)) // invalid assets with cycles in prefab imports
{
myDependencies.Add(guid, ownerGuid);
visitedGuid.Add(guid);
importedElements = DoImport(guid, prefabHierarchy, visitedGuid);
StoreResult(guid, importedElements);
}
else
{
importedElements = EmptyDictionary<long, IHierarchyElement>.Instance;
}
}
foreach (var element in prefabHierarchy.Elements())
{
if (element is IStrippedHierarchyElement)
continue;
if (element is IPrefabInstanceHierarchy)
continue;
var imported = element.Import(prefabInstanceHierarchy);
if (imported == null)
continue;
result[imported.Location.LocalDocumentAnchor] = imported;
}
foreach (var element in importedElements.Values)
{
Assertion.Assert(!(element is IStrippedHierarchyElement), "element should be imported");
Assertion.Assert(!(element is IPrefabInstanceHierarchy), "prefab should be imported");
var imported = element.Import(prefabInstanceHierarchy);
if (imported == null)
continue;
result[imported.Location.LocalDocumentAnchor] = imported;
}
}
foreach (var value in result.Values)
{
var transform = value as ImportedTransformHierarchy;
var reference = transform?.OwningGameObject;
if (reference == null)
continue;
var importedGameObject = result.GetValueSafe(reference.Value.LocalDocumentAnchor) as ImportedGameObjectHierarchy;
if (importedGameObject == null)
continue;
importedGameObject.TransformHierarchy = transform;
}
return result;
}