Files
UnrealEngineUWP/Engine/Source/Programs/UnrealHeaderTool/Private/HeaderProvider.cpp
Steve Robb cbe5b79c73 Merging using Orion->UE4
CL# 2698724:
UHT speed improvements:

Code is now generated with tabs, rather than going through a separate Tabify step.
Some expensive temporaries created during iteration and during iteration have been removed.
FFunctionData::FunctionDataMap now uses unique ownership instead of shared ownership.
TCString::Spc (and the new TCString::Tab) now uses a compile-time array instead of one generated at runtime with a static.
TSet::Compact no longer rehashes if no compaction was performed.
TArray assignment no longer reallocs to the same capacity.

[CL 2698780 by Steve Robb in Main branch]
2015-09-21 07:53:49 -04:00

109 lines
2.4 KiB
C++

// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
#include "UnrealHeaderTool.h"
#include "HeaderProvider.h"
#include "UnrealSourceFile.h"
#include "ClassMaps.h"
FHeaderProvider::FHeaderProvider(EHeaderProviderSourceType InType, const FString& InId, bool bInAutoInclude/* = false*/)
: Type(InType), Id(InId), Cache(nullptr), bAutoInclude(bInAutoInclude)
{
}
template <class Predicate>
bool TryFindSourceFileWithPredicate(FUnrealSourceFile*& Out, Predicate Pred)
{
for (const TPair<FString, TSharedRef<FUnrealSourceFile>>& MapPair : GUnrealSourceFilesMap)
{
if (Pred(MapPair.Value.Get()))
{
Out = &(MapPair.Value.Get());
return true;
}
}
return false;
}
FUnrealSourceFile* FHeaderProvider::Resolve()
{
if (Type != EHeaderProviderSourceType::Resolved)
{
if (Type == EHeaderProviderSourceType::ClassName)
{
for (const auto& Pair : GTypeDefinitionInfoMap)
{
if (Pair.Key->GetFName() == *Id)
{
Cache = &Pair.Value->GetUnrealSourceFile();
break;
}
}
}
else
{
auto* SourceFileSharedPtr = GUnrealSourceFilesMap.Find(Id);
if (SourceFileSharedPtr != nullptr)
{
Cache = &SourceFileSharedPtr->Get();
}
else
{
if (!TryFindSourceFileWithPredicate(Cache, [this](const FUnrealSourceFile& SourceFile) { return SourceFile.GetIncludePath() == Id; }))
{
FString SlashId = TEXT("/") + Id;
FString BackslashId = TEXT("\\") + Id;
TryFindSourceFileWithPredicate(Cache,
[&SlashId, &BackslashId](const FUnrealSourceFile& SourceFile)
{
return SourceFile.GetFilename().EndsWith(SlashId) || SourceFile.GetFilename().EndsWith(BackslashId);
}
);
}
}
}
Type = EHeaderProviderSourceType::Resolved;
}
return Cache;
}
FString FHeaderProvider::ToString() const
{
return FString::Printf(TEXT("%s %s"), Type == EHeaderProviderSourceType::ClassName ? TEXT("class") : TEXT("file"), *Id);
}
const FString& FHeaderProvider::GetId() const
{
return Id;
}
EHeaderProviderSourceType FHeaderProvider::GetType() const
{
return Type;
}
const FUnrealSourceFile* FHeaderProvider::GetResolved() const
{
check(Type == EHeaderProviderSourceType::Resolved);
return Cache;
}
bool operator==(const FHeaderProvider& A, const FHeaderProvider& B)
{
if (A.Cache != B.Cache)
{
return false;
}
if (A.Cache == nullptr)
{
return A.Id == B.Id && A.Type == B.Type;
}
return true;
}