public void Build()

in resharper/resharper-unity/src/Unity/Yaml/Psi/Caches/TagManagerAssetHandler.cs [28:86]


        public void Build(IPsiSourceFile sourceFile, ProjectSettingsCacheItem cacheItem)
        {
            if (!(sourceFile.GetDominantPsiFile<YamlLanguage>() is IYamlFile file))
                return;

            var document = file.GetFirstMatchingUnityObjectDocument("TagManager");

            // An empty array will be an IFlowSequenceNode with no elements, otherwise we'll get a block sequence
            var tagsArrayNode = document.GetUnityObjectPropertyValue<INode>("tags");
            if (tagsArrayNode == null)
            {
                myLogger.Error("tagsArray == null");
                return;
            }

            if (tagsArrayNode is IBlockSequenceNode tagsArray)
            {
                foreach (var s in tagsArray.EntriesEnumerable)
                {
                    var text = s.Value.GetUnicodeText();
                    if (!text.IsNullOrEmpty())
                        cacheItem.Tags.Add(text);
                }
            }

            var layersArray = document.GetUnityObjectPropertyValue<IBlockSequenceNode>("layers");
            if (layersArray != null)
            {
                foreach (var s in layersArray.EntriesEnumerable)
                {
                    var text = s.Value.GetUnicodeText();
                    if (!text.IsNullOrEmpty())
                        cacheItem.Layers.Add(text);
                }
            }
            else
            {
                // Older versions of Unity (not sure when, but pre-5.6) have a v1 format, where each layer is stored as
                // a named property - "Builtin Layer 0:" to "Builtin Layer 7:" and "User Layer 8:" to "User Layer 31:"
                var objectProperties = document.GetUnityObjectProperties();
                if (objectProperties == null)
                {
                    myLogger.Error("Cannot find v1 or v2 layers");
                    return;
                }

                foreach (var entry in objectProperties.EntriesEnumerable)
                {
                    var propertyName = entry.Key.GetPlainScalarTextBuffer();
                    if (propertyName != null &&
                        (propertyName.StartsWith("Builtin Layer") || propertyName.StartsWith("User Layer")))
                    {
                        var text = entry.Content?.Value?.GetUnicodeText();
                        if (!text.IsNullOrEmpty())
                            cacheItem.Layers.Add(text);
                    }
                }
            }
        }