using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace Amanotes.Core { [InitializeOnLoad] internal partial class AmaDevSettings { static AmaDevSettings() { EditorApplication.delayCall += AutoSyncOnLoad; } private static void AutoSyncOnLoad() { if (EditorApplication.isPlayingOrWillChangePlaymode) return; var settings = Instance; if (settings == null) return; settings.ReadSymbols(); if (!IsCscInSync(settings)) WriteCscFromSettings(settings); } internal static bool IsCscInSync(AmaDevSettings settings) { var expected = GatherExpectedSymbols(settings); var actual = ParseCscRspSymbols(); return expected.SetEquals(actual); } internal static HashSet GatherExpectedSymbols(AmaDevSettings settings) { var result = new HashSet(); for (int i = 0; i < settings.symbolDefine.symbols.Count; i++) { var sym = settings.symbolDefine.symbols[i]; if (sym.enabled && sym.source == SymbolSource.Csc) result.Add(sym.name); } if (settings.logV2.enabled) { for (int i = 0; i < settings.logV2.tags.Count; i++) { if (settings.logV2.tags[i].enabled) result.Add(settings.logV2.tags[i].name); } } LocalSymbolOverrides.Load().ApplyTo(result); return result; } internal static HashSet ParseCscRspSymbols() => CscRspFile.Parse(); private static void WriteCscFromSettings(AmaDevSettings settings) { var expected = GatherExpectedSymbols(settings); CscRspFile.Write(expected); Debug.Log("[AmaDev] Auto-synced csc.rsp with AmaDevSettings."); AssetDatabase.Refresh(); } internal void ReadSymbols() { symbolDefine.Read(); SyncLoggerTagsFromCsc(); } private void SyncLoggerTagsFromCsc() { if (!logV2.enabled || logV2.tags.Count == 0) return; var cscSymbols = CscRspFile.Parse(); for (int i = 0; i < logV2.tags.Count; i++) logV2.tags[i].enabled = cscSymbols.Contains(logV2.tags[i].name); } internal void Apply() { symbolDefine.Write(logV2.tags); logV2.GenerateLogger(); MarkDirty(); AssetDatabase.Refresh(); } } }