2025-09-17 16:40:02 -07:00

57 lines
1.8 KiB
C#

namespace AssetRipper.AssemblyDumper;
internal class ClassProperty : PropertyBase
{
public ClassProperty(PropertyDefinition definition, FieldDefinition? backingField, InterfaceProperty @base, GeneratedClassInstance @class) : base(definition)
{
BackingField = backingField;
if (!IsInjected && backingField?.Name is not null)
{
ReleaseNode = @class.Class.ReleaseRootNode?.TryGetSubNodeByName(backingField.Name);
EditorNode = @class.Class.EditorRootNode?.TryGetSubNodeByName(backingField.Name);
if (ReleaseNode is null && EditorNode is null)
{
throw new Exception($"Failed to find node: {@class.Name}.{backingField.Name} on {@class.VersionRange}");
}
}
Class = @class;
Base = @base;
Base.AddImplementation(this);
}
public UniversalNode? ReleaseNode { get; }
public UniversalNode? EditorNode { get; }
public string? OriginalFieldName => ReleaseNode?.OriginalName ?? EditorNode?.OriginalName;
public FieldDefinition? BackingField { get; }
public InterfaceProperty Base { get; }
public GeneratedClassInstance Class { get; }
[MemberNotNullWhen(false, nameof(BackingField))]
public bool IsAbsent => BackingField is null;
[MemberNotNullWhen(true, nameof(BackingField))]
public bool IsPresent => !IsAbsent;
[MemberNotNullWhen(true, nameof(ReleaseNode))]
[MemberNotNullWhen(false, nameof(EditorNode))]
public bool IsReleaseOnly => ReleaseNode is not null && EditorNode is null;
[MemberNotNullWhen(false, nameof(ReleaseNode))]
[MemberNotNullWhen(true, nameof(EditorNode))]
public bool IsEditorOnly => ReleaseNode is null && EditorNode is not null;
[MemberNotNullWhen(true, nameof(BackingField))]
public bool HasBackingFieldInDeclaringType
{
get
{
return BackingField is not null && BackingField.DeclaringType == Class.Type;
}
}
}