51 lines
1.7 KiB
C#
51 lines
1.7 KiB
C#
using System.Runtime.CompilerServices;
|
|
|
|
namespace OECS;
|
|
|
|
/// <summary>
|
|
/// Registry of component types discovered at compile time by the
|
|
/// OECS.SourceGen incremental generator. The consuming project's
|
|
/// generated code populates this via a module initializer, so no
|
|
/// manual registration is needed.
|
|
/// </summary>
|
|
public static class ComponentRegistry
|
|
{
|
|
private static ComponentDescriptor[]? _descriptors;
|
|
private static Dictionary<string, ComponentDescriptor>? _byTypeName;
|
|
|
|
/// <summary>
|
|
/// All discovered component descriptors. Populated automatically
|
|
/// by the source generator at module initialization.
|
|
/// </summary>
|
|
public static ComponentDescriptor[] Descriptors =>
|
|
_descriptors ?? Array.Empty<ComponentDescriptor>();
|
|
|
|
/// <summary>
|
|
/// Lookup by assembly-qualified type name. Populated automatically
|
|
/// by the source generator at module initialization.
|
|
/// </summary>
|
|
public static IReadOnlyDictionary<string, ComponentDescriptor> ByTypeName
|
|
{
|
|
get
|
|
{
|
|
if (_byTypeName == null)
|
|
{
|
|
var dict = new Dictionary<string, ComponentDescriptor>();
|
|
foreach (var desc in Descriptors)
|
|
dict[desc.TypeName] = desc;
|
|
_byTypeName = dict;
|
|
}
|
|
return _byTypeName;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Called by generated code to register discovered component types.
|
|
/// Must be called before any serialization occurs.
|
|
/// </summary>
|
|
public static void Initialize(ComponentDescriptor[] descriptors)
|
|
{
|
|
_descriptors = descriptors;
|
|
_byTypeName = null; // Rebuild on next access.
|
|
}
|
|
} |