static FName Generate(UUserDefinedStruct* Struct, const FString& NameBase, const FGuid Guid, FString* OutFriendlyName = NULL)
    {
        check(Struct);

        FString Result;
        if (!NameBase.IsEmpty())
        {
            const FName NewNameBase(*NameBase);
            if (ensure(NewNameBase.IsValidXName(INVALID_OBJECTNAME_CHARACTERS)))
            {
                Result = NameBase;
            }
        }

        if (Result.IsEmpty())
        {
            Result = TEXT("MemberVar");
        }

        const uint32 UniqueNameId = CastChecked<UUserDefinedStructEditorData>(Struct->EditorData)->GenerateUniqueNameIdForMemberVariable();
        const FString FriendlyName = FString::Printf(TEXT("%s_%u"), *Result, UniqueNameId);
        if (OutFriendlyName)
        {
            *OutFriendlyName = FriendlyName;
        }
        const FName NameResult = *FString::Printf(TEXT("%s_%s"), *FriendlyName, *Guid.ToString(EGuidFormats::Digits));
        check(NameResult.IsValidXName(INVALID_OBJECTNAME_CHARACTERS));
        return NameResult;
    }
	static FName Generate(UBlueprintGeneratedStruct* Struct, const FString& NameBase)
	{
		FString Result;
		if (!NameBase.IsEmpty())
		{
			const FName NewNameBase(*NameBase);
			if (ensure(NewNameBase.IsValidXName(INVALID_OBJECTNAME_CHARACTERS)))
			{
				Result = NameBase;
			}
		}

		if (Result.IsEmpty())
		{
			Result = TEXT("MemberVar");
		}

		if(Struct)
		{
			const uint32 UniqueNameId = Struct->GenerateUniqueNameIdForMemberVariable();
			Result = FString::Printf(TEXT("%s_%u"), *Result, UniqueNameId);
		}
		FName NameResult = FName(*Result);
		check(NameResult.IsValidXName(INVALID_OBJECTNAME_CHARACTERS));
		return NameResult;
	}
bool FStructureEditorUtils::RenameVariable(UBlueprint* Blueprint, FName StructName, FGuid VarGuid, const FString& NewDisplayNameStr)
{
	if (NULL != Blueprint)
	{
		const FScopedTransaction Transaction( LOCTEXT("RenameVariable", "Rename Variable") );
		Blueprint->Modify();

		FBPStructureDescription* StructureDesc = Blueprint->UserDefinedStructures.FindByPredicate(FFindByNameHelper(StructName));
		if (StructureDesc)
		{
			const FName NewNameBase(*NewDisplayNameStr);
			if (NewNameBase.IsValidXName(INVALID_OBJECTNAME_CHARACTERS) &&
				IsUniqueVariableDisplayName(Blueprint, StructName, NewDisplayNameStr))
			{
				const FName NewName = FMemberVariableNameHelper::Generate(StructureDesc->CompiledStruct, NewDisplayNameStr);
				if (NULL == StructureDesc->Fields.FindByPredicate(FFindByNameHelper(NewName)))
				{
					FBPVariableDescription* VarDesc = StructureDesc->Fields.FindByPredicate(FFindByGuidHelper(VarGuid));
					if (VarDesc)
					{
						VarDesc->FriendlyName = NewDisplayNameStr;
						VarDesc->VarName = NewName;
						OnStructureChanged(*StructureDesc, Blueprint);
						return true;
					}
				}
			}
		}
	}
	return false;
}
bool FEnumEditorUtils::IsProperNameForUserDefinedEnumerator(const UEnum* Enum, FString NewName)
{
	if (Enum && !UEnum::IsFullEnumName(*NewName))
	{
		check(Enum->GetFName().IsValidXName());

		const FName ShortName(*NewName);
		const bool bValidName = ShortName.IsValidXName(INVALID_OBJECTNAME_CHARACTERS);

		const FString TrueNameStr = Enum->GenerateFullEnumName(*NewName);
		const FName TrueName(*TrueNameStr);
		check(!bValidName || TrueName.IsValidXName());

		const bool bNameNotUsed = (INDEX_NONE == Enum->FindEnumIndex(TrueName));
		return bNameNotUsed && bValidName;
	}
	return false;
}
bool FStructureEditorUtils::RenameStructure(UBlueprint* Blueprint, FName OldStructName, const FString& NewNameStr)
{
	if(NULL != Blueprint)
	{
		const FScopedTransaction Transaction( LOCTEXT("RenameStructure", "Rename Structure") );
		Blueprint->Modify();

		const FName NewName(*NewNameStr);
		FKismetNameValidator NameValidator(Blueprint);
		if(NewName.IsValidXName(INVALID_OBJECTNAME_CHARACTERS) && (NameValidator.IsValid(NewName) == EValidatorResult::Ok))
		{
			FBPStructureDescription* StructureDesc = Blueprint->UserDefinedStructures.FindByPredicate(FFindByNameHelper(OldStructName));
			if(StructureDesc)
			{
				if(StructureDesc->CompiledStruct)
				{
					if(!StructureDesc->CompiledStruct->Rename(*NewNameStr, NULL, REN_Test))
					{
						return false;
					}

					if(!StructureDesc->CompiledStruct->Rename(*NewNameStr, NULL))
					{
						return false;
					}
				}

				StructureDesc->Name = NewName;

				FBlueprintEditorUtils::MarkBlueprintAsModified(Blueprint);
				return true;
			}
		}
	}
	return false;
}