// Copyright Epic Games, Inc. All Rights Reserved. #include "ClassLookupReflectionDataProvider.h" #include "UObject/Class.h" #include "UObject/EnumProperty.h" #include "UObject/UnrealType.h" namespace UE::UndoHistory { bool FClassLookupReflectionDataProvider::HasClassDisplayName(const FSoftClassPath& ClassPath) const { return LookUpClass(ClassPath).IsSet(); } TOptional FClassLookupReflectionDataProvider::GetClassDisplayName(const FSoftClassPath& ClassPath) const { const TOptional> Class = LookUpClass(ClassPath); return Class ? (*Class)->GetName() : TOptional{}; } TOptional FClassLookupReflectionDataProvider::GetPropertyReflectionData(const FSoftClassPath& ClassPath, FName PropertyName) const { if (const TOptional> Property = LookUpProperty(ClassPath, PropertyName)) { FPropertyReflectionData Result{}; // Value init so if new members are added they have defined values Result.PropertyType = GetPropertyType(**Property); (*Property)->GetCPPMacroType(Result.CppMacroType); Result.TypeName = (*Property)->GetClass()->GetName(); Result.PropertyFlags = (*Property)->PropertyFlags; return Result; } return {}; } TOptional> FClassLookupReflectionDataProvider::LookUpClass(const FSoftClassPath& ClassPath) const { UClass* Class = LoadObject(nullptr, *ClassPath.ToString()); return LIKELY(Class) ? TOptional>{ Class } : TOptional>{}; } TOptional> FClassLookupReflectionDataProvider::LookUpProperty(const FSoftClassPath& ClassPath, FName PropertyName) const { if (const TOptional> Class = LookUpClass(ClassPath)) { FProperty* Property = (*Class)->FindPropertyByName(PropertyName); return LIKELY(Property) ? TOptional>{ Property } : TOptional>{}; } return {}; } TSharedRef CreateDefaultReflectionProvider() { return MakeShared(); } EPropertyType FClassLookupReflectionDataProvider::GetPropertyType(const FProperty& Property) const { if (CastField(&Property)) { return EPropertyType::ObjectProperty; } if (CastField(&Property)) { return EPropertyType::StructProperty; } if (CastField(&Property)) { return EPropertyType::EnumProperty; } if (CastField(&Property)) { return EPropertyType::StructProperty; } return EPropertyType::Other; } }