Files
UnrealEngine/Engine/Source/Programs/Shared/EpicGames.UHT/Specifiers/UhtPropertyMemberSpecifiers.cs
2025-05-18 13:04:45 +08:00

485 lines
22 KiB
C#

// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using System.Diagnostics.CodeAnalysis;
using EpicGames.Core;
using EpicGames.UHT.Tables;
using EpicGames.UHT.Types;
using EpicGames.UHT.Utils;
namespace EpicGames.UHT.Parsers
{
/// <summary>
/// Collection of property member specifiers
/// </summary>
[UnrealHeaderTool]
[SuppressMessage("CodeQuality", "IDE0051:Remove unused private members", Justification = "Attribute accessed method")]
public static class UhtPropertyMemberSpecifiers
{
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void EditAnywhereSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
if (context.SeenEditSpecifier)
{
context.MessageSite.LogError("Found more than one edit/visibility specifier (EditAnywhere), only one is allowed");
}
context.PropertySettings.PropertyFlags |= EPropertyFlags.Edit;
context.SeenEditSpecifier = true;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void EditInstanceOnlySpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
if (context.SeenEditSpecifier)
{
context.MessageSite.LogError("Found more than one edit/visibility specifier (EditInstanceOnly), only one is allowed");
}
context.PropertySettings.PropertyFlags |= EPropertyFlags.Edit | EPropertyFlags.DisableEditOnTemplate;
context.SeenEditSpecifier = true;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void EditDefaultsOnlySpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
if (context.SeenEditSpecifier)
{
context.MessageSite.LogError("Found more than one edit/visibility specifier (EditDefaultsOnly), only one is allowed");
}
context.PropertySettings.PropertyFlags |= EPropertyFlags.Edit | EPropertyFlags.DisableEditOnInstance;
context.SeenEditSpecifier = true;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void VisibleAnywhereSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
if (context.SeenEditSpecifier)
{
context.MessageSite.LogError("Found more than one edit/visibility specifier (VisibleAnywhere), only one is allowed");
}
context.PropertySettings.PropertyFlags |= EPropertyFlags.Edit | EPropertyFlags.EditConst;
context.SeenEditSpecifier = true;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void VisibleInstanceOnlySpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
if (context.SeenEditSpecifier)
{
context.MessageSite.LogError("Found more than one edit/visibility specifier (VisibleInstanceOnly), only one is allowed");
}
context.PropertySettings.PropertyFlags |= EPropertyFlags.Edit | EPropertyFlags.EditConst | EPropertyFlags.DisableEditOnTemplate;
context.SeenEditSpecifier = true;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void VisibleDefaultsOnlySpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
if (context.SeenEditSpecifier)
{
context.MessageSite.LogError("Found more than one edit/visibility specifier (VisibleDefaultsOnly), only one is allowed");
}
context.PropertySettings.PropertyFlags |= EPropertyFlags.Edit | EPropertyFlags.EditConst | EPropertyFlags.DisableEditOnInstance;
context.SeenEditSpecifier = true;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void BlueprintReadWriteSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
if (context.SeenBlueprintReadOnlySpecifier)
{
context.MessageSite.LogError("Cannot specify a property as being both BlueprintReadOnly and BlueprintReadWrite.");
}
bool allowPrivateAccess = context.MetaData.TryGetValue(UhtNames.AllowPrivateAccess, out string? privateAccessMD) && !privateAccessMD.Equals("false", StringComparison.OrdinalIgnoreCase);
if (specifierContext.AccessSpecifier == UhtAccessSpecifier.Private && !allowPrivateAccess)
{
context.MessageSite.LogError("BlueprintReadWrite should not be used on private members");
}
if (context.PropertySettings.PropertyFlags.HasAnyFlags(EPropertyFlags.EditorOnly) && context.PropertySettings.Outer is UhtScriptStruct)
{
context.MessageSite.LogError("Blueprint exposed struct members cannot be editor only");
}
context.PropertySettings.PropertyFlags |= EPropertyFlags.BlueprintVisible;
context.SeenBlueprintWriteSpecifier = true;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void BlueprintReadOnlySpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
if (context.SeenBlueprintWriteSpecifier)
{
context.MessageSite.LogError("Cannot specify both BlueprintReadOnly and BlueprintReadWrite or BlueprintSetter.");
}
bool allowPrivateAccess = context.MetaData.TryGetValue(UhtNames.AllowPrivateAccess, out string? privateAccessMD) && !privateAccessMD.Equals("false", StringComparison.OrdinalIgnoreCase);
if (specifierContext.AccessSpecifier == UhtAccessSpecifier.Private && !allowPrivateAccess)
{
context.MessageSite.LogError("BlueprintReadOnly should not be used on private members");
}
if (context.PropertySettings.PropertyFlags.HasAnyFlags(EPropertyFlags.EditorOnly) && context.PropertySettings.Outer is UhtScriptStruct)
{
context.MessageSite.LogError("Blueprint exposed struct members cannot be editor only");
}
context.PropertySettings.PropertyFlags |= EPropertyFlags.BlueprintVisible | EPropertyFlags.BlueprintReadOnly;
context.SeenBlueprintReadOnlySpecifier = true;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.SingleString)]
private static void BlueprintSetterSpecifier(UhtSpecifierContext specifierContext, StringView value)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
if (context.SeenBlueprintReadOnlySpecifier)
{
context.MessageSite.LogError("Cannot specify a property as being both BlueprintReadOnly and having a BlueprintSetter.");
}
if (context.PropertySettings.Outer is UhtScriptStruct)
{
context.MessageSite.LogError("Cannot specify BlueprintSetter for a struct member.");
}
context.MetaData.Add(UhtNames.BlueprintSetter, value.ToString());
context.PropertySettings.PropertyFlags |= EPropertyFlags.BlueprintVisible;
context.SeenBlueprintWriteSpecifier = true;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.SingleString)]
private static void BlueprintGetterSpecifier(UhtSpecifierContext specifierContext, StringView value)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
if (context.PropertySettings.Outer is UhtScriptStruct)
{
context.MessageSite.LogError("Cannot specify BlueprintGetter for a struct member.");
}
context.MetaData.Add(UhtNames.BlueprintGetter, value.ToString());
context.PropertySettings.PropertyFlags |= EPropertyFlags.BlueprintVisible;
context.SeenBlueprintGetterSpecifier = true;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void ConfigSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.Config;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void GlobalConfigSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.GlobalConfig | EPropertyFlags.Config;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void LocalizedSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.MessageSite.LogError("The Localized specifier is deprecated");
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void TransientSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.Transient;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void DuplicateTransientSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.DuplicateTransient;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void TextExportTransientSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.TextExportTransient;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void NonPIETransientSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.MessageSite.LogWarning("NonPIETransient is deprecated - NonPIEDuplicateTransient should be used instead");
context.PropertySettings.PropertyFlags |= EPropertyFlags.NonPIEDuplicateTransient;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void NonPIEDuplicateTransientSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.NonPIEDuplicateTransient;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void ExportSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.ExportObject;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void EditInlineSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.MessageSite.LogError("EditInline is deprecated. Remove it, or use Instanced instead.");
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void NoClearSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.NoClear;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void EditFixedSizeSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.EditFixedSize;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void ReplicatedSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
if (context.PropertySettings.Outer is UhtScriptStruct)
{
context.MessageSite.LogError("Struct members cannot be replicated");
}
context.PropertySettings.PropertyFlags |= EPropertyFlags.Net;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.SingleString)]
private static void ReplicatedUsingSpecifier(UhtSpecifierContext specifierContext, StringView value)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
if (context.PropertySettings.Outer is UhtScriptStruct)
{
context.MessageSite.LogError("Struct members cannot be replicated");
}
context.PropertySettings.PropertyFlags |= EPropertyFlags.Net;
if (value.Span.Length == 0)
{
context.MessageSite.LogError("Must specify a valid function name for replication notifications");
}
context.PropertySettings.RepNotifyName = value.ToString();
context.PropertySettings.PropertyFlags |= EPropertyFlags.RepNotify;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void NotReplicatedSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
if (context.PropertySettings.Outer is not UhtScriptStruct)
{
context.MessageSite.LogError("Only Struct members can be marked NotReplicated");
}
context.PropertySettings.PropertyFlags |= EPropertyFlags.RepSkip;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void RepRetrySpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.MessageSite.LogError("'RepRetry' is deprecated.");
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void InterpSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.Edit | EPropertyFlags.BlueprintVisible | EPropertyFlags.Interp;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void NonTransactionalSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.NonTransactional;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void InstancedSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.PersistentInstance | EPropertyFlags.ExportObject | EPropertyFlags.InstancedReference;
context.MetaData.Add(UhtNames.EditInline, true);
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void BlueprintAssignableSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.BlueprintAssignable;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void BlueprintCallableSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.BlueprintCallable;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void BlueprintAuthorityOnlySpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.BlueprintAuthorityOnly;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void AssetRegistrySearchableSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.AssetRegistrySearchable;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void SimpleDisplaySpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.SimpleDisplay;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void AdvancedDisplaySpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.AdvancedDisplay;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void SaveGameSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.SaveGame;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void SkipSerializationSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.SkipSerialization;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void ExperimentalOverridableLogicSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.ExperimentalOverridableLogic;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void ExperimentalAlwaysOverridenSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.ExperimentalAlwaysOverriden;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void ExperimentalNeverOverridenSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyFlags |= EPropertyFlags.ExperimentalNeverOverriden;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.Legacy)]
private static void ExperimentalExternalObjectsSpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
if ((context.PropertySettings.PropertyFlags & EPropertyFlags.ExperimentalOverridableLogic) == 0)
{
context.MessageSite.LogError("ExperimentalExternalObjects can only be used with ExperimentalOverridableLogic");
}
context.PropertySettings.PropertyFlags |= EPropertyFlags.ExperimentalExternalObjects;
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.OptionalString)]
private static void GetterSpecifier(UhtSpecifierContext specifierContext, StringView? value)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
if (context.PropertySettings.Outer is not UhtClass)
{
context.MessageSite.LogError("Only class members can have Setters");
}
context.PropertySettings.PropertyExportFlags |= UhtPropertyExportFlags.GetterSpecified;
if (value != null)
{
StringView temp = (StringView)value;
if (temp.Length > 0)
{
if (temp.Equals("None", StringComparison.OrdinalIgnoreCase))
{
context.PropertySettings.PropertyExportFlags |= UhtPropertyExportFlags.GetterSpecifiedNone;
}
else if (temp.Equals("Auto", StringComparison.OrdinalIgnoreCase))
{
context.PropertySettings.PropertyExportFlags |= UhtPropertyExportFlags.GetterSpecifiedAuto;
}
else
{
context.PropertySettings.Getter = value.ToString();
}
}
}
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.OptionalString)]
private static void SetterSpecifier(UhtSpecifierContext specifierContext, StringView? value)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
if (context.PropertySettings.Outer is not UhtClass)
{
context.MessageSite.LogError("Only class members can have Getters");
}
context.PropertySettings.PropertyExportFlags |= UhtPropertyExportFlags.SetterSpecified;
if (value != null)
{
StringView temp = (StringView)value;
if (temp.Length > 0)
{
if (temp.Equals("None", StringComparison.OrdinalIgnoreCase))
{
context.PropertySettings.PropertyExportFlags |= UhtPropertyExportFlags.SetterSpecifiedNone;
}
else if (temp.Equals("Auto", StringComparison.OrdinalIgnoreCase))
{
context.PropertySettings.PropertyExportFlags |= UhtPropertyExportFlags.SetterSpecifiedAuto;
}
else
{
context.PropertySettings.Setter = value.ToString();
}
}
}
}
[UhtSpecifier(Extends = UhtTableNames.PropertyMember, ValueType = UhtSpecifierValueType.None)]
private static void FieldNotifySpecifier(UhtSpecifierContext specifierContext)
{
UhtPropertySpecifierContext context = (UhtPropertySpecifierContext)specifierContext;
context.PropertySettings.PropertyExportFlags |= UhtPropertyExportFlags.FieldNotify;
}
}
}