com.wallstop-studios.dxmessaging 2.2.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/CHANGELOG.md +106 -67
  2. package/CHANGELOG.md.meta +7 -7
  3. package/Editor/Analyzers/BaseCallIlInspector.cs +277 -0
  4. package/Editor/Analyzers/BaseCallIlInspector.cs.meta +11 -0
  5. package/Editor/Analyzers/BaseCallLogMessageParser.cs +295 -0
  6. package/Editor/Analyzers/BaseCallLogMessageParser.cs.meta +11 -0
  7. package/Editor/Analyzers/BaseCallReportAggregator.cs +308 -0
  8. package/Editor/Analyzers/BaseCallReportAggregator.cs.meta +11 -0
  9. package/Editor/Analyzers/BaseCallTypeScanner.cs +110 -0
  10. package/Editor/Analyzers/BaseCallTypeScanner.cs.meta +11 -0
  11. package/Editor/Analyzers/BaseCallTypeScannerCore.cs +562 -0
  12. package/Editor/Analyzers/BaseCallTypeScannerCore.cs.meta +11 -0
  13. package/Editor/Analyzers/DxMessagingConsoleHarvester.cs +1122 -0
  14. package/Editor/Analyzers/DxMessagingConsoleHarvester.cs.meta +11 -0
  15. package/Editor/Analyzers/Microsoft.CodeAnalysis.CSharp.dll.meta +44 -44
  16. package/Editor/Analyzers/Microsoft.CodeAnalysis.dll.meta +44 -44
  17. package/Editor/Analyzers/System.Collections.Immutable.dll.meta +44 -44
  18. package/Editor/Analyzers/System.Reflection.Metadata.dll.meta +44 -44
  19. package/Editor/Analyzers/System.Runtime.CompilerServices.Unsafe.dll.meta +44 -44
  20. package/Editor/Analyzers/WallstopStudios.DxMessaging.Analyzer.dll +0 -0
  21. package/Editor/Analyzers/WallstopStudios.DxMessaging.Analyzer.dll.meta +33 -0
  22. package/Editor/Analyzers/WallstopStudios.DxMessaging.SourceGenerators.dll +0 -0
  23. package/Editor/Analyzers/WallstopStudios.DxMessaging.SourceGenerators.dll.meta +72 -72
  24. package/Editor/Analyzers.meta +8 -8
  25. package/Editor/AssemblyInfo.cs.meta +3 -3
  26. package/Editor/CustomEditors/MessageAwareComponentFallbackEditor.cs +81 -0
  27. package/Editor/CustomEditors/MessageAwareComponentFallbackEditor.cs.meta +11 -0
  28. package/Editor/CustomEditors/MessageAwareComponentInspectorOverlay.cs +420 -0
  29. package/Editor/CustomEditors/MessageAwareComponentInspectorOverlay.cs.meta +11 -0
  30. package/Editor/CustomEditors/MessagingComponentEditor.cs +1 -1
  31. package/Editor/CustomEditors/MessagingComponentEditor.cs.meta +2 -2
  32. package/Editor/CustomEditors.meta +2 -2
  33. package/Editor/DxMessagingEditorInitializer.cs.meta +2 -2
  34. package/Editor/DxMessagingMenu.cs.meta +11 -11
  35. package/Editor/DxMessagingSceneBuildProcessor.cs.meta +11 -11
  36. package/Editor/Settings/DxMessagingBaseCallIgnoreSync.cs +190 -0
  37. package/Editor/Settings/DxMessagingBaseCallIgnoreSync.cs.meta +11 -0
  38. package/Editor/Settings/DxMessagingSettings.cs +189 -0
  39. package/Editor/Settings/DxMessagingSettings.cs.meta +2 -2
  40. package/Editor/Settings/DxMessagingSettingsProvider.cs +50 -33
  41. package/Editor/Settings/DxMessagingSettingsProvider.cs.meta +2 -2
  42. package/Editor/Settings.meta +2 -2
  43. package/Editor/SetupCscRsp.cs +209 -8
  44. package/Editor/SetupCscRsp.cs.meta +2 -2
  45. package/Editor/Testing/MessagingComponentEditorHarness.cs +1 -1
  46. package/Editor/Testing/MessagingComponentEditorHarness.cs.meta +3 -3
  47. package/Editor/Testing.meta +3 -3
  48. package/Editor/WallstopStudios.DxMessaging.Editor.asmdef +14 -14
  49. package/Editor/WallstopStudios.DxMessaging.Editor.asmdef.meta +7 -7
  50. package/Editor.meta +8 -8
  51. package/LICENSE.md +9 -9
  52. package/LICENSE.md.meta +7 -7
  53. package/README.md +941 -900
  54. package/README.md.meta +7 -7
  55. package/Runtime/AssemblyInfo.cs +4 -0
  56. package/Runtime/AssemblyInfo.cs.meta +2 -2
  57. package/Runtime/Core/Attributes/DxAutoConstructorAttribute.cs.meta +2 -2
  58. package/Runtime/Core/Attributes/DxBroadcastMessageAttribute.cs.meta +2 -2
  59. package/Runtime/Core/Attributes/DxIgnoreMissingBaseCallAttribute.cs +26 -0
  60. package/Runtime/Core/Attributes/DxIgnoreMissingBaseCallAttribute.cs.meta +11 -0
  61. package/Runtime/Core/Attributes/DxOptionalParameterAttribute.cs.meta +2 -2
  62. package/Runtime/Core/Attributes/DxTargetedMessageAttribute.cs.meta +2 -2
  63. package/Runtime/Core/Attributes/DxUntargetedMessageAttribute.cs.meta +2 -2
  64. package/Runtime/Core/Attributes.meta +2 -2
  65. package/Runtime/Core/Configuration/DxMessagingRuntimeSettings.cs +195 -0
  66. package/Runtime/Core/Configuration/DxMessagingRuntimeSettings.cs.meta +11 -0
  67. package/Runtime/Core/Configuration/DxMessagingRuntimeSettingsProvider.cs +179 -0
  68. package/Runtime/Core/Configuration/DxMessagingRuntimeSettingsProvider.cs.meta +11 -0
  69. package/Runtime/Core/Configuration.meta +9 -0
  70. package/Runtime/Core/DataStructure/CyclicBuffer.cs +2 -2
  71. package/Runtime/Core/DataStructure/CyclicBuffer.cs.meta +2 -2
  72. package/Runtime/Core/DataStructure.meta +2 -2
  73. package/Runtime/Core/Diagnostics/MessageEmissionData.cs.meta +2 -2
  74. package/Runtime/Core/Diagnostics/MessageRegistrationData.cs.meta +2 -2
  75. package/Runtime/Core/Diagnostics/MessageRegistrationType.cs.meta +2 -2
  76. package/Runtime/Core/Diagnostics.meta +2 -2
  77. package/Runtime/Core/DxMessagingStaticState.cs +19 -0
  78. package/Runtime/Core/DxMessagingStaticState.cs.meta +11 -11
  79. package/Runtime/Core/Extensions/EnumExtensions.cs.meta +2 -2
  80. package/Runtime/Core/Extensions/IListExtensions.cs.meta +2 -2
  81. package/Runtime/Core/Extensions/MessageBusExtensions.cs.meta +12 -12
  82. package/Runtime/Core/Extensions/MessageExtensions.cs.meta +11 -11
  83. package/Runtime/Core/Extensions.meta +8 -8
  84. package/Runtime/Core/Helper/MessageCache.cs +32 -0
  85. package/Runtime/Core/Helper/MessageCache.cs.meta +2 -2
  86. package/Runtime/Core/Helper/MessageHelperIndexer.cs.meta +2 -2
  87. package/Runtime/Core/Helper.meta +2 -2
  88. package/Runtime/Core/IMessage.cs +3 -3
  89. package/Runtime/Core/IMessage.cs.meta +11 -11
  90. package/Runtime/Core/InstanceId.cs.meta +11 -11
  91. package/Runtime/Core/Internal/TypedDispatchLinkIndex.cs +51 -0
  92. package/Runtime/Core/Internal/TypedDispatchLinkIndex.cs.meta +11 -0
  93. package/Runtime/Core/Internal/TypedGlobalSlotIndex.cs +38 -0
  94. package/Runtime/Core/Internal/TypedGlobalSlotIndex.cs.meta +11 -0
  95. package/Runtime/Core/Internal/TypedSlotIndex.cs +81 -0
  96. package/Runtime/Core/Internal/TypedSlotIndex.cs.meta +11 -0
  97. package/Runtime/Core/Internal/TypedSlots.cs +613 -0
  98. package/Runtime/Core/Internal/TypedSlots.cs.meta +11 -0
  99. package/Runtime/Core/Internal.meta +9 -0
  100. package/Runtime/Core/MessageBus/DiagnosticsTarget.cs.meta +11 -11
  101. package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs.meta +11 -11
  102. package/Runtime/Core/MessageBus/IMessageBus.cs +177 -3
  103. package/Runtime/Core/MessageBus/IMessageBus.cs.meta +11 -11
  104. package/Runtime/Core/MessageBus/IMessageBusProvider.cs.meta +11 -11
  105. package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs.meta +11 -11
  106. package/Runtime/Core/MessageBus/Internal/BusContextIndex.cs +16 -0
  107. package/Runtime/Core/MessageBus/Internal/BusContextIndex.cs.meta +11 -0
  108. package/Runtime/Core/MessageBus/Internal/BusSinkIndex.cs +40 -0
  109. package/Runtime/Core/MessageBus/Internal/BusSinkIndex.cs.meta +11 -0
  110. package/Runtime/Core/MessageBus/Internal/BusSlots.cs +718 -0
  111. package/Runtime/Core/MessageBus/Internal/BusSlots.cs.meta +11 -0
  112. package/Runtime/Core/MessageBus/Internal/DispatchKind.cs +38 -0
  113. package/Runtime/Core/MessageBus/Internal/DispatchKind.cs.meta +11 -0
  114. package/Runtime/Core/MessageBus/Internal/DispatchPhase.cs +20 -0
  115. package/Runtime/Core/MessageBus/Internal/DispatchPhase.cs.meta +11 -0
  116. package/Runtime/Core/MessageBus/Internal/DispatchVariant.cs +28 -0
  117. package/Runtime/Core/MessageBus/Internal/DispatchVariant.cs.meta +11 -0
  118. package/Runtime/Core/MessageBus/Internal/IEvictableSlot.cs +48 -0
  119. package/Runtime/Core/MessageBus/Internal/IEvictableSlot.cs.meta +11 -0
  120. package/Runtime/Core/MessageBus/Internal/ISweepable.cs +15 -0
  121. package/Runtime/Core/MessageBus/Internal/ISweepable.cs.meta +11 -0
  122. package/Runtime/Core/MessageBus/Internal/RegistrationMethodAxes.cs +222 -0
  123. package/Runtime/Core/MessageBus/Internal/RegistrationMethodAxes.cs.meta +11 -0
  124. package/Runtime/Core/MessageBus/Internal/SlotKey.cs +192 -0
  125. package/Runtime/Core/MessageBus/Internal/SlotKey.cs.meta +11 -0
  126. package/Runtime/Core/MessageBus/Internal.meta +9 -0
  127. package/Runtime/Core/MessageBus/MessageBus.cs +2651 -500
  128. package/Runtime/Core/MessageBus/MessageBus.cs.meta +11 -11
  129. package/Runtime/Core/MessageBus/MessageBusRebindMode.cs.meta +11 -11
  130. package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs.meta +11 -11
  131. package/Runtime/Core/MessageBus/MessagingRegistration.cs.meta +11 -11
  132. package/Runtime/Core/MessageBus/RegistrationLog.cs.meta +11 -11
  133. package/Runtime/Core/MessageBus.meta +8 -8
  134. package/Runtime/Core/MessageHandler.cs +2019 -542
  135. package/Runtime/Core/MessageHandler.cs.meta +11 -11
  136. package/Runtime/Core/MessageRegistrationHandle.cs.meta +11 -11
  137. package/Runtime/Core/MessageRegistrationToken.cs +7 -0
  138. package/Runtime/Core/MessageRegistrationToken.cs.meta +11 -11
  139. package/Runtime/Core/Messages/GlobalStringMessage.cs.meta +2 -2
  140. package/Runtime/Core/Messages/IBroadcastMessage.cs.meta +11 -11
  141. package/Runtime/Core/Messages/ITargetedMessage.cs.meta +11 -11
  142. package/Runtime/Core/Messages/IUntargetedMessage.cs.meta +11 -11
  143. package/Runtime/Core/Messages/ReflexiveMessage.cs.meta +2 -2
  144. package/Runtime/Core/Messages/SourcedStringMessage.cs.meta +11 -11
  145. package/Runtime/Core/Messages/StringMessage.cs.meta +2 -2
  146. package/Runtime/Core/Messages.meta +8 -8
  147. package/Runtime/Core/MessagingDebug.cs.meta +11 -11
  148. package/Runtime/Core/Pooling/CollectionPool.cs +266 -0
  149. package/Runtime/Core/Pooling/CollectionPool.cs.meta +11 -0
  150. package/Runtime/Core/Pooling/CollectionPoolDiagnostics.cs +30 -0
  151. package/Runtime/Core/Pooling/CollectionPoolDiagnostics.cs.meta +11 -0
  152. package/Runtime/Core/Pooling/DxPools.cs +157 -0
  153. package/Runtime/Core/Pooling/DxPools.cs.meta +11 -0
  154. package/Runtime/Core/Pooling/EvictionPlayerLoopHook.cs +106 -0
  155. package/Runtime/Core/Pooling/EvictionPlayerLoopHook.cs.meta +11 -0
  156. package/Runtime/Core/Pooling/IDxMessagingClock.cs +18 -0
  157. package/Runtime/Core/Pooling/IDxMessagingClock.cs.meta +11 -0
  158. package/Runtime/Core/Pooling/PoolDiagnosticsSnapshot.cs +55 -0
  159. package/Runtime/Core/Pooling/PoolDiagnosticsSnapshot.cs.meta +11 -0
  160. package/Runtime/Core/Pooling/StopwatchClock.cs +27 -0
  161. package/Runtime/Core/Pooling/StopwatchClock.cs.meta +11 -0
  162. package/Runtime/Core/Pooling/UnityRealtimeClock.cs +31 -0
  163. package/Runtime/Core/Pooling/UnityRealtimeClock.cs.meta +11 -0
  164. package/Runtime/Core/Pooling.meta +9 -0
  165. package/Runtime/Core.meta +8 -8
  166. package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs.meta +12 -12
  167. package/Runtime/Unity/DxMessagingRuntimeInitializer.cs.meta +11 -11
  168. package/Runtime/Unity/InitialGlobalMessageBusProvider.cs.meta +12 -12
  169. package/Runtime/Unity/Integrations/Reflex/AssemblyInfo.cs.meta +2 -2
  170. package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs +73 -0
  171. package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs.meta +11 -11
  172. package/Runtime/Unity/Integrations/Reflex/WallstopStudios.DxMessaging.Reflex.asmdef +20 -20
  173. package/Runtime/Unity/Integrations/Reflex/WallstopStudios.DxMessaging.Reflex.asmdef.meta +7 -7
  174. package/Runtime/Unity/Integrations/Reflex.meta +8 -8
  175. package/Runtime/Unity/Integrations/VContainer/AssemblyInfo.cs.meta +2 -2
  176. package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs +109 -1
  177. package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs.meta +11 -11
  178. package/Runtime/Unity/Integrations/VContainer/WallstopStudios.DxMessaging.VContainer.asmdef +30 -30
  179. package/Runtime/Unity/Integrations/VContainer/WallstopStudios.DxMessaging.VContainer.asmdef.meta +7 -7
  180. package/Runtime/Unity/Integrations/VContainer.meta +8 -8
  181. package/Runtime/Unity/Integrations/Zenject/AssemblyInfo.cs.meta +2 -2
  182. package/Runtime/Unity/Integrations/Zenject/WallstopStudios.DxMessaging.Zenject.asmdef +30 -30
  183. package/Runtime/Unity/Integrations/Zenject/WallstopStudios.DxMessaging.Zenject.asmdef.meta +7 -7
  184. package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs +79 -1
  185. package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs.meta +11 -11
  186. package/Runtime/Unity/Integrations/Zenject.meta +8 -8
  187. package/Runtime/Unity/Integrations.meta +8 -8
  188. package/Runtime/Unity/MessageAwareComponent.cs +29 -0
  189. package/Runtime/Unity/MessageAwareComponent.cs.meta +11 -11
  190. package/Runtime/Unity/MessageBusProviderHandle.cs.meta +12 -12
  191. package/Runtime/Unity/MessagingComponent.cs.meta +11 -11
  192. package/Runtime/Unity/MessagingComponentInstaller.cs.meta +12 -12
  193. package/Runtime/Unity/ScriptableMessageBusProvider.cs.meta +12 -12
  194. package/Runtime/Unity.meta +8 -8
  195. package/Runtime/WallstopStudios.DxMessaging.asmdef +14 -14
  196. package/Runtime/WallstopStudios.DxMessaging.asmdef.meta +7 -7
  197. package/Runtime.meta +8 -8
  198. package/Samples~/DI/Prefabs/MessagingInstallerSample.prefab +98 -98
  199. package/Samples~/DI/Prefabs/MessagingInstallerSample.prefab.meta +7 -7
  200. package/Samples~/DI/Prefabs.meta +8 -8
  201. package/Samples~/DI/Providers/GlobalMessageBusProvider.asset +14 -14
  202. package/Samples~/DI/Providers/GlobalMessageBusProvider.asset.meta +8 -8
  203. package/Samples~/DI/Providers/InitialGlobalMessageBusProvider.asset +14 -14
  204. package/Samples~/DI/Providers/InitialGlobalMessageBusProvider.asset.meta +8 -8
  205. package/Samples~/DI/Providers.meta +8 -8
  206. package/Samples~/DI/README.md +51 -51
  207. package/Samples~/DI/README.md.meta +7 -7
  208. package/Samples~/DI/Reflex/SampleInstaller.cs +7 -0
  209. package/Samples~/DI/Reflex/SampleInstaller.cs.meta +11 -11
  210. package/Samples~/DI/Reflex.meta +8 -8
  211. package/Samples~/DI/VContainer/SampleLifetimeScope.cs +6 -1
  212. package/Samples~/DI/VContainer/SampleLifetimeScope.cs.meta +11 -11
  213. package/Samples~/DI/VContainer.meta +8 -8
  214. package/Samples~/DI/Zenject/SampleInstaller.cs +8 -0
  215. package/Samples~/DI/Zenject/SampleInstaller.cs.meta +11 -11
  216. package/Samples~/DI/Zenject.meta +8 -8
  217. package/Samples~/DI.meta +8 -8
  218. package/Samples~/Mini Combat/Boot.cs.meta +11 -11
  219. package/Samples~/Mini Combat/Enemy.cs.meta +11 -11
  220. package/Samples~/Mini Combat/Messages.cs.meta +11 -11
  221. package/Samples~/Mini Combat/Player.cs.meta +11 -11
  222. package/Samples~/Mini Combat/README.md +324 -323
  223. package/Samples~/Mini Combat/README.md.meta +7 -7
  224. package/Samples~/Mini Combat/UIOverlay.cs.meta +11 -11
  225. package/Samples~/Mini Combat/Walkthrough.md +430 -430
  226. package/Samples~/Mini Combat/Walkthrough.md.meta +7 -7
  227. package/Samples~/Mini Combat/WallstopStudios.DxMessaging.MiniCombat.Sample.asmdef +13 -13
  228. package/Samples~/Mini Combat/WallstopStudios.DxMessaging.MiniCombat.Sample.asmdef.meta +7 -7
  229. package/Samples~/Mini Combat.meta +8 -8
  230. package/Samples~/UI Buttons + Inspector/DiagnosticsEnabler.cs.meta +11 -11
  231. package/Samples~/UI Buttons + Inspector/Messages.cs.meta +11 -11
  232. package/Samples~/UI Buttons + Inspector/MessagingObserver.cs.meta +11 -11
  233. package/Samples~/UI Buttons + Inspector/README.md +210 -209
  234. package/Samples~/UI Buttons + Inspector/README.md.meta +7 -7
  235. package/Samples~/UI Buttons + Inspector/UIButtonEmitter.cs.meta +11 -11
  236. package/Samples~/UI Buttons + Inspector/WallstopStudios.DxMessaging.UIButtons.Sample.asmdef +13 -13
  237. package/Samples~/UI Buttons + Inspector/WallstopStudios.DxMessaging.UIButtons.Sample.asmdef.meta +7 -7
  238. package/Samples~/UI Buttons + Inspector.meta +8 -8
  239. package/SourceGenerators/Directory.Build.props.meta +7 -7
  240. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/DxAutoConstructorGenerator.cs.meta +11 -11
  241. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/DxMessageIdGenerator.cs.meta +2 -2
  242. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.csproj.meta +7 -7
  243. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.meta +8 -8
  244. package/SourceGenerators.meta +8 -8
  245. package/Third Party Notices.md +3 -3
  246. package/Third Party Notices.md.meta +7 -7
  247. package/package.json +115 -92
  248. package/package.json.meta +7 -7
@@ -0,0 +1,190 @@
1
+ namespace DxMessaging.Editor.Settings
2
+ {
3
+ #if UNITY_EDITOR
4
+ using System;
5
+ using System.Collections.Generic;
6
+ using System.IO;
7
+ using System.Linq;
8
+ using System.Text;
9
+ using UnityEditor;
10
+ using UnityEngine;
11
+
12
+ /// <summary>
13
+ /// Synchronizes the <see cref="DxMessagingSettings._baseCallIgnoredTypes"/> list to a sidecar
14
+ /// text file shipped to the Roslyn analyzer via <c>csc.rsp</c>'s <c>-additionalfile</c> switch.
15
+ /// </summary>
16
+ /// <remarks>
17
+ /// The sidecar is a build-derived view: never hand-edited, always regenerated from the
18
+ /// ScriptableObject. The analyzer reads it because it cannot parse Unity-serialized YAML.
19
+ /// </remarks>
20
+ public static class DxMessagingBaseCallIgnoreSync
21
+ {
22
+ /// <summary>
23
+ /// Project-relative path to the auto-generated sidecar file. Other Editor scripts
24
+ /// (e.g., <see cref="SetupCscRsp"/>) reference this constant when wiring
25
+ /// <c>-additionalfile</c> entries.
26
+ /// </summary>
27
+ public const string SidecarAssetPath = "Assets/Editor/DxMessaging.BaseCallIgnore.txt";
28
+
29
+ private const string HeaderComment =
30
+ "# Auto-generated from Assets/Editor/DxMessagingSettings.asset; edit there instead.";
31
+ private const string FormatComment =
32
+ "# One fully-qualified type name per line. Lines starting with # are comments.";
33
+
34
+ /// <summary>
35
+ /// Regenerates the sidecar text file from the supplied settings asset. Writes only when
36
+ /// the on-disk content differs from what would be written, matching the
37
+ /// <c>FilesDiffer</c>-style policy used elsewhere in this Editor assembly to avoid
38
+ /// AssetDatabase churn during domain reload.
39
+ /// </summary>
40
+ /// <param name="settings">The settings asset. May be <c>null</c> -- no-op in that case.</param>
41
+ /// <remarks>
42
+ /// When called while Unity is mid-compile or mid-asset-import (e.g., from a
43
+ /// <c>ScriptableObject.OnValidate</c> that fires during a domain reload), the actual
44
+ /// regen is deferred via <see cref="EditorApplication.delayCall"/> so we don't trip
45
+ /// AssetDatabase reentrancy guards. Direct calls from EditMode tests run synchronously
46
+ /// because tests don't execute during update/compile.
47
+ /// </remarks>
48
+ public static void RegenerateSidecar(DxMessagingSettings settings)
49
+ {
50
+ if (settings == null)
51
+ {
52
+ return;
53
+ }
54
+
55
+ if (EditorApplication.isUpdating || EditorApplication.isCompiling)
56
+ {
57
+ EditorApplication.delayCall += () => RegenerateSidecarCore(settings);
58
+ return;
59
+ }
60
+
61
+ RegenerateSidecarCore(settings);
62
+ }
63
+
64
+ private static void RegenerateSidecarCore(DxMessagingSettings settings)
65
+ {
66
+ if (settings == null)
67
+ {
68
+ return;
69
+ }
70
+
71
+ try
72
+ {
73
+ string newContent = BuildContent(settings._baseCallIgnoredTypes);
74
+ string absolutePath = GetAbsolutePath();
75
+ EnsureParentDirectoryExists(absolutePath);
76
+
77
+ if (File.Exists(absolutePath))
78
+ {
79
+ string existing = File.ReadAllText(absolutePath);
80
+ if (string.Equals(existing, newContent, StringComparison.Ordinal))
81
+ {
82
+ return;
83
+ }
84
+ }
85
+
86
+ File.WriteAllText(absolutePath, newContent);
87
+ AssetDatabase.ImportAsset(SidecarAssetPath);
88
+ }
89
+ catch (Exception ex)
90
+ {
91
+ Debug.LogWarning(
92
+ $"[DxMessaging] Failed to write base-call ignore sidecar at '{SidecarAssetPath}': {ex.Message}"
93
+ );
94
+ }
95
+ }
96
+
97
+ /// <summary>
98
+ /// Reads the sidecar file and returns its non-comment, non-blank entries.
99
+ /// Tolerant of a missing file (returns an empty list) and of <c>#</c>-prefixed comment lines.
100
+ /// </summary>
101
+ public static IReadOnlyList<string> ReadSidecar()
102
+ {
103
+ try
104
+ {
105
+ string absolutePath = GetAbsolutePath();
106
+ if (!File.Exists(absolutePath))
107
+ {
108
+ return Array.Empty<string>();
109
+ }
110
+
111
+ List<string> entries = new();
112
+ foreach (string rawLine in File.ReadAllLines(absolutePath))
113
+ {
114
+ if (string.IsNullOrWhiteSpace(rawLine))
115
+ {
116
+ continue;
117
+ }
118
+ string trimmed = rawLine.Trim();
119
+ if (trimmed.Length == 0 || trimmed[0] == '#')
120
+ {
121
+ continue;
122
+ }
123
+ entries.Add(trimmed);
124
+ }
125
+ return entries;
126
+ }
127
+ catch (Exception ex)
128
+ {
129
+ Debug.LogWarning(
130
+ $"[DxMessaging] Failed to read base-call ignore sidecar at '{SidecarAssetPath}': {ex.Message}"
131
+ );
132
+ return Array.Empty<string>();
133
+ }
134
+ }
135
+
136
+ internal static string BuildContent(IList<string> ignoredTypes)
137
+ {
138
+ StringBuilder builder = new();
139
+ builder.Append(HeaderComment).Append('\n');
140
+ builder.Append(FormatComment).Append('\n');
141
+
142
+ if (ignoredTypes == null)
143
+ {
144
+ return builder.ToString();
145
+ }
146
+
147
+ // Deterministic order for git-friendly diffs; deduplicate while preserving the user's
148
+ // typed casing where possible (Ordinal sort with Ordinal-set dedupe).
149
+ HashSet<string> seen = new(StringComparer.Ordinal);
150
+ List<string> sorted = new(ignoredTypes.Count);
151
+ foreach (string entry in ignoredTypes)
152
+ {
153
+ if (string.IsNullOrWhiteSpace(entry))
154
+ {
155
+ continue;
156
+ }
157
+ string trimmed = entry.Trim();
158
+ if (seen.Add(trimmed))
159
+ {
160
+ sorted.Add(trimmed);
161
+ }
162
+ }
163
+ sorted.Sort(StringComparer.Ordinal);
164
+
165
+ foreach (string entry in sorted)
166
+ {
167
+ builder.Append(entry).Append('\n');
168
+ }
169
+ return builder.ToString();
170
+ }
171
+
172
+ private static string GetAbsolutePath()
173
+ {
174
+ // Application.dataPath ends in "/Assets"; SidecarAssetPath begins with "Assets/".
175
+ string projectRoot = Path.GetFullPath(Path.Combine(Application.dataPath, ".."))
176
+ .Replace("\\", "/");
177
+ return Path.Combine(projectRoot, SidecarAssetPath).Replace("\\", "/");
178
+ }
179
+
180
+ private static void EnsureParentDirectoryExists(string absolutePath)
181
+ {
182
+ string directory = Path.GetDirectoryName(absolutePath);
183
+ if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
184
+ {
185
+ Directory.CreateDirectory(directory);
186
+ }
187
+ }
188
+ }
189
+ #endif
190
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 99dc9d314eff4388bba3679e20ca06c8
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -1,6 +1,7 @@
1
1
  namespace DxMessaging.Editor.Settings
2
2
  {
3
3
  #if UNITY_EDITOR
4
+ using System.Collections.Generic;
4
5
  using System.Linq;
5
6
  using Core.MessageBus;
6
7
  using UnityEditor;
@@ -32,6 +33,15 @@ namespace DxMessaging.Editor.Settings
32
33
  [SerializeField]
33
34
  internal bool _suppressDomainReloadWarning = true;
34
35
 
36
+ [SerializeField]
37
+ internal List<string> _baseCallIgnoredTypes = new();
38
+
39
+ [SerializeField]
40
+ internal bool _baseCallCheckEnabled = true;
41
+
42
+ [SerializeField]
43
+ internal bool _useConsoleBridge;
44
+
35
45
  /// <summary>
36
46
  /// Controls <see cref="DiagnosticsTarget"/> values applied to <see cref="IMessageBus.GlobalDiagnosticsTargets"/>.
37
47
  /// </summary>
@@ -59,6 +69,94 @@ namespace DxMessaging.Editor.Settings
59
69
  set => _suppressDomainReloadWarning = value;
60
70
  }
61
71
 
72
+ /// <summary>
73
+ /// Master toggle for the <c>MessageAwareComponent</c> base-call check (DXMSG006/007/008).
74
+ /// When <c>false</c>, the Inspector overlay and per-type warnings are silenced; the underlying
75
+ /// compile-time analyzer warnings remain unless explicitly suppressed via <c>.editorconfig</c>.
76
+ /// </summary>
77
+ /// <remarks>
78
+ /// S3: toggling from <c>false</c> back to <c>true</c> pokes
79
+ /// <see cref="DxMessaging.Editor.Analyzers.DxMessagingConsoleHarvester"/> on the next editor
80
+ /// tick so the snapshot repopulates without waiting for the user to clear/re-emit warnings
81
+ /// or to manually invoke <c>Tools/Wallstop Studios/DxMessaging/Rescan Base-Call Warnings</c>. The round-trip
82
+ /// is intentionally indirect (delayCall > RescanNow) to keep this property setter cheap and
83
+ /// safe to invoke from any editor context -- including OnValidate, where AssetDatabase may
84
+ /// be transitional.
85
+ /// </remarks>
86
+ public bool BaseCallCheckEnabled
87
+ {
88
+ get => _baseCallCheckEnabled;
89
+ set
90
+ {
91
+ bool previous = _baseCallCheckEnabled;
92
+ _baseCallCheckEnabled = value;
93
+ if (!previous && value)
94
+ {
95
+ // A master-toggle flip doesn't need a synchronous reflective harvest right now;
96
+ // the polled tick (~250ms) will pick up the sentinel cheaply on the editor's
97
+ // own update thread, avoiding a heavy reflection sweep on the main thread when
98
+ // the user has just clicked a checkbox. Indirected through delayCall so the
99
+ // setter is safe to invoke from any editor context (OnValidate, button click,
100
+ // etc.) without risking AssetDatabase reentrancy.
101
+ EditorApplication.delayCall += DxMessaging
102
+ .Editor
103
+ .Analyzers
104
+ .DxMessagingConsoleHarvester
105
+ .RequestRescan;
106
+ }
107
+ }
108
+ }
109
+
110
+ /// <summary>
111
+ /// Opt-in toggle for the legacy console-scrape bridge that augments the IL-reflection
112
+ /// scanner's snapshot with warnings harvested from <c>UnityEditor.LogEntries</c> and from
113
+ /// <c>CompilationPipeline.assemblyCompilationFinished</c>.
114
+ /// </summary>
115
+ /// <remarks>
116
+ /// <para>
117
+ /// Default <c>false</c>. The IL-reflection scanner
118
+ /// (<see cref="DxMessaging.Editor.Analyzers.BaseCallTypeScanner"/>) is the deterministic,
119
+ /// always-on primary source -- it walks every loaded <c>MessageAwareComponent</c> subclass
120
+ /// and inspects each override's IL body for the base-call shape, which is reliable across
121
+ /// Unity 2021 cache hits, incremental compiles, and arbitrary domain-reload sequences.
122
+ /// </para>
123
+ /// <para>
124
+ /// The legacy bridge predates the IL scanner and was the source of the intermittent
125
+ /// "missing warnings" bug on Unity 2021. Enable it ONLY if you want the union of both
126
+ /// data sources -- for example, to surface a regression in the IL byte-walker that is
127
+ /// already correctly captured by the compile-time analyzer's console output.
128
+ /// </para>
129
+ /// <para>
130
+ /// Toggling this property is observable via a deferred
131
+ /// <see cref="DxMessaging.Editor.Analyzers.DxMessagingConsoleHarvester.RescanNow"/> so the
132
+ /// inspector overlay refreshes without waiting for the next compile.
133
+ /// </para>
134
+ /// </remarks>
135
+ public bool UseConsoleBridge
136
+ {
137
+ get => _useConsoleBridge;
138
+ set
139
+ {
140
+ if (_useConsoleBridge == value)
141
+ {
142
+ return;
143
+ }
144
+ _useConsoleBridge = value;
145
+ EditorUtility.SetDirty(this);
146
+ EditorApplication.delayCall += DxMessaging
147
+ .Editor
148
+ .Analyzers
149
+ .DxMessagingConsoleHarvester
150
+ .RescanNow;
151
+ }
152
+ }
153
+
154
+ /// <summary>
155
+ /// Fully-qualified type names excluded from the base-call check. Editable via the Project Settings UI
156
+ /// or via the Inspector overlay's "Ignore this type" button.
157
+ /// </summary>
158
+ public IReadOnlyList<string> BaseCallIgnoredTypes => _baseCallIgnoredTypes;
159
+
62
160
  /// <summary>
63
161
  /// Loads the settings asset if present, otherwise creates it with sensible defaults.
64
162
  /// </summary>
@@ -83,6 +181,8 @@ namespace DxMessaging.Editor.Settings
83
181
  settings._diagnosticsTargets = DiagnosticsTarget.Off;
84
182
  settings._messageBufferSize = IMessageBus.DefaultMessageBufferSize;
85
183
  settings._suppressDomainReloadWarning = true;
184
+ settings._baseCallCheckEnabled = true;
185
+ settings._baseCallIgnoredTypes = new List<string>();
86
186
  if (!AssetDatabase.IsValidFolder("Assets/Editor"))
87
187
  {
88
188
  AssetDatabase.CreateFolder("Assets", "Editor");
@@ -112,6 +212,95 @@ namespace DxMessaging.Editor.Settings
112
212
  {
113
213
  return new SerializedObject(GetOrCreateSettings());
114
214
  }
215
+
216
+ private void OnEnable()
217
+ {
218
+ // Defensive: the field can be null if the asset was saved before this field existed.
219
+ if (_baseCallIgnoredTypes == null)
220
+ {
221
+ _baseCallIgnoredTypes = new List<string>();
222
+ }
223
+ // Intentionally NOT regenerating the sidecar here. OnEnable fires on every domain reload
224
+ // and play-mode entry; the sidecar on disk is already consistent with what we'd write
225
+ // (RegenerateSidecar is idempotent, but ImportAsset still produces churn). Regen runs
226
+ // only from OnValidate (user-driven edits) and from explicit Add/RemoveIgnoredType calls.
227
+ }
228
+
229
+ private void OnValidate()
230
+ {
231
+ if (_baseCallIgnoredTypes == null)
232
+ {
233
+ _baseCallIgnoredTypes = new List<string>();
234
+ }
235
+ TryRegenerateSidecar();
236
+ }
237
+
238
+ /// <summary>
239
+ /// Adds <paramref name="fullyQualifiedTypeName"/> to the ignore list, marks the asset
240
+ /// dirty, saves, and regenerates the sidecar. No-op when the entry is already present.
241
+ /// </summary>
242
+ internal void AddIgnoredType(string fullyQualifiedTypeName)
243
+ {
244
+ if (string.IsNullOrWhiteSpace(fullyQualifiedTypeName))
245
+ {
246
+ return;
247
+ }
248
+ if (_baseCallIgnoredTypes == null)
249
+ {
250
+ _baseCallIgnoredTypes = new List<string>();
251
+ }
252
+ if (
253
+ _baseCallIgnoredTypes.Any(entry =>
254
+ string.Equals(entry, fullyQualifiedTypeName, System.StringComparison.Ordinal)
255
+ )
256
+ )
257
+ {
258
+ return;
259
+ }
260
+ _baseCallIgnoredTypes.Add(fullyQualifiedTypeName);
261
+ EditorUtility.SetDirty(this);
262
+ AssetDatabase.SaveAssets();
263
+ TryRegenerateSidecar();
264
+ }
265
+
266
+ /// <summary>
267
+ /// Removes <paramref name="fullyQualifiedTypeName"/> from the ignore list, marks the asset
268
+ /// dirty, saves, and regenerates the sidecar. No-op when the entry is absent.
269
+ /// </summary>
270
+ internal void RemoveIgnoredType(string fullyQualifiedTypeName)
271
+ {
272
+ if (string.IsNullOrWhiteSpace(fullyQualifiedTypeName))
273
+ {
274
+ return;
275
+ }
276
+ if (_baseCallIgnoredTypes == null)
277
+ {
278
+ return;
279
+ }
280
+ int removed = _baseCallIgnoredTypes.RemoveAll(entry =>
281
+ string.Equals(entry, fullyQualifiedTypeName, System.StringComparison.Ordinal)
282
+ );
283
+ if (removed > 0)
284
+ {
285
+ EditorUtility.SetDirty(this);
286
+ AssetDatabase.SaveAssets();
287
+ TryRegenerateSidecar();
288
+ }
289
+ }
290
+
291
+ private void TryRegenerateSidecar()
292
+ {
293
+ try
294
+ {
295
+ DxMessagingBaseCallIgnoreSync.RegenerateSidecar(this);
296
+ }
297
+ catch (System.Exception ex)
298
+ {
299
+ Debug.LogWarning(
300
+ $"[DxMessaging] Failed to regenerate base-call ignore sidecar: {ex.Message}"
301
+ );
302
+ }
303
+ }
115
304
  }
116
305
  #endif
117
306
  }
@@ -1,3 +1,3 @@
1
- fileFormatVersion: 2
2
- guid: 477d53eef70c4496b945199c62169dfb
1
+ fileFormatVersion: 2
2
+ guid: 477d53eef70c4496b945199c62169dfb
3
3
  timeCreated: 1749668079
@@ -10,7 +10,7 @@ namespace DxMessaging.Editor.Settings
10
10
  /// Project Settings provider for DxMessaging configuration.
11
11
  /// </summary>
12
12
  /// <remarks>
13
- /// Exposes toggles for global diagnostics mode and message buffer size under Project Settings DxMessaging.
13
+ /// Exposes toggles for global diagnostics mode and message buffer size under Project Settings > Wallstop Studios > DxMessaging.
14
14
  /// </remarks>
15
15
  public sealed class DxMessagingSettingsProvider : SettingsProvider
16
16
  {
@@ -41,53 +41,70 @@ namespace DxMessaging.Editor.Settings
41
41
  /// <param name="searchContext">Search text provided by the Project Settings window.</param>
42
42
  public override void OnGUI(string searchContext)
43
43
  {
44
- SerializedProperty targetsProp = _messagingSettings.FindProperty(
45
- nameof(DxMessagingSettings._diagnosticsTargets)
46
- );
47
- DiagnosticsTarget currentTargets = (DiagnosticsTarget)targetsProp.enumValueFlag;
48
- DiagnosticsTarget updatedTargets = (DiagnosticsTarget)
49
- EditorGUILayout.EnumFlagsField(
44
+ float previousLabelWidth = EditorGUIUtility.labelWidth;
45
+ EditorGUIUtility.labelWidth = 240f;
46
+ try
47
+ {
48
+ SerializedProperty targetsProp = _messagingSettings.FindProperty(
49
+ nameof(DxMessagingSettings._diagnosticsTargets)
50
+ );
51
+ DiagnosticsTarget currentTargets = (DiagnosticsTarget)targetsProp.enumValueFlag;
52
+ DiagnosticsTarget updatedTargets = (DiagnosticsTarget)
53
+ EditorGUILayout.EnumFlagsField(
54
+ new GUIContent(
55
+ "Diagnostics Targets",
56
+ "Select where global diagnostics should be enabled by default. Combine flags for multiple targets."
57
+ ),
58
+ currentTargets
59
+ );
60
+ if (updatedTargets != currentTargets)
61
+ {
62
+ targetsProp.enumValueFlag = (int)updatedTargets;
63
+ }
64
+ EditorGUILayout.PropertyField(
65
+ _messagingSettings.FindProperty(nameof(DxMessagingSettings._messageBufferSize)),
50
66
  new GUIContent(
51
- "Diagnostics Targets",
52
- "Select where global diagnostics should be enabled by default. Combine flags for multiple targets."
67
+ "Message Buffer Size",
68
+ "Number of emissions kept per bus/token when diagnostics mode is active."
69
+ )
70
+ );
71
+ EditorGUILayout.PropertyField(
72
+ _messagingSettings.FindProperty(
73
+ nameof(DxMessagingSettings._suppressDomainReloadWarning)
53
74
  ),
54
- currentTargets
75
+ new GUIContent(
76
+ "Suppress Domain Reload Warning",
77
+ "Disable the warning shown when Enter Play Mode Options skips domain reload; DxMessaging still resets its statics."
78
+ )
55
79
  );
56
- if (updatedTargets != currentTargets)
80
+
81
+ _messagingSettings.ApplyModifiedProperties();
82
+ }
83
+ finally
57
84
  {
58
- targetsProp.enumValueFlag = (int)updatedTargets;
85
+ EditorGUIUtility.labelWidth = previousLabelWidth;
59
86
  }
60
- EditorGUILayout.PropertyField(
61
- _messagingSettings.FindProperty(nameof(DxMessagingSettings._messageBufferSize)),
62
- new GUIContent(
63
- "Message Buffer Size",
64
- "Number of emissions kept per bus/token when diagnostics mode is active."
65
- )
66
- );
67
- EditorGUILayout.PropertyField(
68
- _messagingSettings.FindProperty(
69
- nameof(DxMessagingSettings._suppressDomainReloadWarning)
70
- ),
71
- new GUIContent(
72
- "Suppress Domain Reload Warning",
73
- "Disable the warning shown when Enter Play Mode Options skips domain reload; DxMessaging still resets its statics."
74
- )
75
- );
76
-
77
- _messagingSettings.ApplyModifiedProperties();
78
87
  }
79
88
 
80
- [SettingsProvider]
81
89
  /// <summary>
82
90
  /// Factory used by Unity to register the DxMessaging project settings page.
83
91
  /// </summary>
84
92
  /// <returns>Configured settings provider instance.</returns>
93
+ [SettingsProvider]
85
94
  public static SettingsProvider CreateDxMessagingSettingsProvider()
86
95
  {
87
- DxMessagingSettingsProvider provider = new("Project/DxMessaging")
96
+ DxMessagingSettingsProvider provider = new("Project/Wallstop Studios/DxMessaging")
88
97
  {
89
98
  keywords = new HashSet<string>(
90
- new[] { "DxMessaging", "Diagnostics", "MessageBus", "Targets" }
99
+ new[]
100
+ {
101
+ "DxMessaging",
102
+ "Diagnostics",
103
+ "MessageBus",
104
+ "Targets",
105
+ "Wallstop",
106
+ "Wallstop Studios",
107
+ }
91
108
  ),
92
109
  };
93
110
 
@@ -1,3 +1,3 @@
1
- fileFormatVersion: 2
2
- guid: e4353b92a69a4703abc268fb885a1224
1
+ fileFormatVersion: 2
2
+ guid: e4353b92a69a4703abc268fb885a1224
3
3
  timeCreated: 1749668115
@@ -1,3 +1,3 @@
1
- fileFormatVersion: 2
2
- guid: 73f79e95899848a9b4307c19174b4a45
1
+ fileFormatVersion: 2
2
+ guid: 73f79e95899848a9b4307c19174b4a45
3
3
  timeCreated: 1749668065