public object Build()

in resharper/resharper-unity/src/Unity/Yaml/Psi/DeferredCaches/AssetHierarchy/AssetDocumentHierarchyElementContainer.cs [61:169]


        public object Build(IPsiSourceFile currentAssetSourceFile, AssetDocument assetDocument)
        {
            var anchorRaw = AssetUtils.GetAnchorFromBuffer(assetDocument.Buffer);
            if (!anchorRaw.HasValue)
                return null;

            var anchor = anchorRaw.Value;
            var isStripped = AssetUtils.IsStripped(assetDocument.Buffer);
            var location = new LocalReference(currentAssetSourceFile.PsiStorage.PersistentIndex.NotNull("owningPsiPersistentIndex != null"), anchor);

            if (isStripped)
            {
                var prefabInstance = AssetUtils.GetPrefabInstance(currentAssetSourceFile, assetDocument.Buffer) as LocalReference?;
                var correspondingSourceObject = AssetUtils.GetCorrespondingSourceObject(currentAssetSourceFile, assetDocument.Buffer) as ExternalReference?;

                if (prefabInstance != null && correspondingSourceObject != null)
                    return new StrippedHierarchyElement(location, prefabInstance.Value, correspondingSourceObject.Value);

                return null;
            }

            var gameObject = AssetUtils.GetGameObjectReference(currentAssetSourceFile, assetDocument.Buffer) as LocalReference?;

            if (gameObject != null && AssetUtils.IsMonoBehaviourDocument(assetDocument.Buffer))
            {
                var documentReference =
                    assetDocument.Document.GetUnityObjectPropertyValue<INode>(UnityYamlConstants.ScriptProperty)
                        ?.ToHierarchyReference(currentAssetSourceFile);

                if (documentReference is ExternalReference scriptReference)
                {
                    return new ScriptComponentHierarchy(location, gameObject.Value, scriptReference);
                }
            } else if (gameObject != null && AssetUtils.IsTransform(assetDocument.Buffer))
            {
                if (AssetUtils.GetTransformFather(currentAssetSourceFile, assetDocument.Buffer) is not LocalReference father)
                    return null;

                var rootOrder = AssetUtils.GetRootOrder(assetDocument.Buffer);
                var children = AssetUtils.GetChildren(currentAssetSourceFile, assetDocument.Buffer);
                return new TransformHierarchy(location, gameObject.Value, father, rootOrder, children);
            }
            else if (AssetUtils.IsGameObject(assetDocument.Buffer))
            {
                var name = AssetUtils.GetGameObjectName(assetDocument.Buffer);
                if (name != null)
                {
                    return new GameObjectHierarchy(location, name);
                }
            } else if (AssetUtils.IsPrefabModification(assetDocument.Buffer))
            {
                var modification = AssetUtils.GetPrefabModification(assetDocument.Document);
                var parentTransform =
                    modification?.GetMapEntryValue<INode>(UnityYamlConstants.TransformParentProperty)
                        ?.ToHierarchyReference(currentAssetSourceFile) as LocalReference? ?? LocalReference.Null;
                var modifications = modification?.GetMapEntryValue<IBlockSequenceNode>(UnityYamlConstants.ModificationsProperty);
                var result = new List<PrefabModification>();
                if (modifications != null)
                {
                    foreach (var entry in modifications.Entries)
                    {
                        var map = entry.Value as IBlockMappingNode;

                        var target = map?.GetMapEntryValue<INode>(UnityYamlConstants.TargetProperty)
                            .ToHierarchyReference(currentAssetSourceFile);
                        if (target == null)
                            continue;

                        var name = map.GetMapEntryScalarText(UnityYamlConstants.PropertyPathProperty);
                        if (name == null)
                            continue;

                        var valueNode = map.GetMapEntry(UnityYamlConstants.ValueProperty)?.Content;
                        if (valueNode == null)
                            continue;

                        IAssetValue value = null;
                        foreach (var assetInspectorValueDeserializer in myAssetInspectorValueDeserializers)
                        {
                            if (assetInspectorValueDeserializer.TryGetInspectorValue(currentAssetSourceFile, valueNode, out value))
                                break;
                        }

                        var objectReference = map.GetMapEntryValue<INode>("objectReference").ToHierarchyReference(currentAssetSourceFile);

                        var valueRange = valueNode.Value.GetTreeTextRange();

                        result.Add(new PrefabModification(target, name, value,
                            new TextRange(assetDocument.StartOffset + valueRange.StartOffset.Offset,
                                assetDocument.StartOffset + valueRange.EndOffset.Offset),  objectReference));
                    }
                }

                var sourcePrefabGuid = AssetUtils.GetSourcePrefab(currentAssetSourceFile, assetDocument.Buffer) as ExternalReference?;
                if (sourcePrefabGuid == null)
                    return null;

                return new PrefabInstanceHierarchy(location, parentTransform, result, sourcePrefabGuid.Value.ExternalAssetGuid);
            }
            else if (gameObject != null)// regular component
            {
                var name = AssetUtils.GetRawComponentName(assetDocument.Buffer);
                if (name == null)
                    return null;

                return new ComponentHierarchy(location, gameObject.Value, name);
            }
            return null;
        }