// Copyright Epic Games, Inc. All Rights Reserved. #include "PackageDependencyData.h" FName FPackageDependencyData::GetImportPackageName(const TArray& ImportMap, int32 ImportIndex) { for (int32 NumCycles = 0; NumCycles < ImportMap.Num(); ++NumCycles) { if (!ImportMap.IsValidIndex(ImportIndex)) { return NAME_None; } const FObjectImport& Resource = ImportMap[ImportIndex]; // If the import has a package name set, then that's the import package name, if (Resource.HasPackageName()) { return Resource.GetPackageName(); } // If our outer is null, then we have a package else if (Resource.OuterIndex.IsNull()) { return Resource.ObjectName; } if (!Resource.OuterIndex.IsImport()) { return NAME_None; } ImportIndex = Resource.OuterIndex.ToImport(); } return NAME_None; } void FPackageDependencyData::LoadDependenciesFromPackageHeader(FName SourcePackageName, TArray& ImportMap, TArray& SoftPackageReferenceList, TMap>& SearchableNames, TBitArray<>& ImportUsedInGame, TBitArray<>& SoftPackageUsedInGame) { using namespace UE::AssetRegistry; PackageDependencies.Reset(ImportMap.Num() + SoftPackageReferenceList.Num()); check(ImportMap.Num() == ImportUsedInGame.Num()); for (int32 ImportIdx = 0; ImportIdx < ImportMap.Num(); ++ImportIdx) { FName DependencyPackageName = GetImportPackageName(ImportMap, ImportIdx); EDependencyProperty DependencyProperty = EDependencyProperty::Build | EDependencyProperty::Hard; DependencyProperty |= ImportUsedInGame[ImportIdx] ? EDependencyProperty::Game : EDependencyProperty::None; PackageDependencies.Add({ DependencyPackageName, DependencyProperty }); } check(SoftPackageReferenceList.Num() == SoftPackageUsedInGame.Num()); for (int32 SoftPackageIdx = 0; SoftPackageIdx < SoftPackageReferenceList.Num(); ++SoftPackageIdx) { FName DependencyPackageName = SoftPackageReferenceList[SoftPackageIdx]; FAssetIdentifier AssetId(DependencyPackageName); EDependencyProperty DependencyProperty = UE::AssetRegistry::EDependencyProperty::Build; // !EDependencyProperty::Hard DependencyProperty |= (SoftPackageUsedInGame[SoftPackageIdx] ? EDependencyProperty::Game : EDependencyProperty::None); PackageDependencies.Add({ DependencyPackageName, DependencyProperty }); } SearchableNameDependencies.Reset(SearchableNames.Num()); for (const TPair>& SearchableNameList : SearchableNames) { FName ObjectName; FName DependencyPackageName; // Find object and package name from linker FPackageIndex LinkerIndex = SearchableNameList.Key; if (LinkerIndex.IsExport()) { // Package name has to be this package, take a guess at object name DependencyPackageName = SourcePackageName; ObjectName = FName(*FPackageName::GetLongPackageAssetName(DependencyPackageName.ToString())); } else if (LinkerIndex.IsImport()) { int32 ImportIndex = LinkerIndex.ToImport(); if (!ImportMap.IsValidIndex(ImportIndex)) { continue; } FObjectImport& Resource = ImportMap[ImportIndex]; FPackageIndex OuterLinkerIndex = Resource.OuterIndex; if (!OuterLinkerIndex.IsNull()) { ObjectName = Resource.ObjectName; } DependencyPackageName = GetImportPackageName(ImportMap, ImportIndex); if (DependencyPackageName.IsNone()) { continue; } } else { continue; } FSearchableNamesDependency& Dependency = SearchableNameDependencies.Emplace_GetRef(); Dependency.PackageName = DependencyPackageName; Dependency.ObjectName = ObjectName; Dependency.ValueNames = SearchableNameList.Value; } }