void FCompilerResultsLog::InternalLogEvent(const FCompilerEvent& InEvent, int32 InDepth) { const int EventTimeMs = (int)((InEvent.FinishTime - InEvent.StartTime) * 1000); if(EventTimeMs >= EventDisplayThresholdMs) { // Skip display of the top-most event since that time has already been logged if(InDepth > 0) { FString EventString = FString::Printf(TEXT("- %s"), *InEvent.Name); if(InEvent.Counter > 0) { EventString.Append(FString::Printf(TEXT(" (%d)"), InEvent.Counter + 1)); } FFormatNamedArguments Args; Args.Add(TEXT("EventTimeMs"), EventTimeMs); EventString.Append(FText::Format(LOCTEXT("PerformanceSummaryEventTime", " [{EventTimeMs} ms]"), Args).ToString()); FString IndentString = FString::Printf(TEXT("%*s"), (InDepth - 1) << 1, TEXT("")); Note(*FString::Printf(TEXT("%s%s"), *IndentString, *EventString)); } const int32 NumChildEvents = InEvent.ChildEvents.Num(); for(int32 i = 0; i < NumChildEvents; ++i) { InternalLogEvent(InEvent.ChildEvents[i].Get(), InDepth + 1); } } }
void FCompilerResultsLog::InternalLogSummary() { if(CurrentEventScope.IsValid()) { const double CompileStartTime = CurrentEventScope->StartTime; const double CompileFinishTime = CurrentEventScope->FinishTime; FNumberFormattingOptions TimeFormat; TimeFormat.MaximumFractionalDigits = 2; TimeFormat.MinimumFractionalDigits = 2; TimeFormat.MaximumIntegralDigits = 4; TimeFormat.MinimumIntegralDigits = 4; TimeFormat.UseGrouping = false; FFormatNamedArguments Args; Args.Add(TEXT("Time"), FText::AsNumber(CompileFinishTime - GStartTime, &TimeFormat)); Args.Add(TEXT("SourceName"), FText::FromString(FPackageName::ObjectPathToObjectName(SourcePath))); Args.Add(TEXT("SourcePath"), FText::FromString(SourcePath)); Args.Add(TEXT("NumWarnings"), NumWarnings); Args.Add(TEXT("NumErrors"), NumErrors); Args.Add(TEXT("TotalMilliseconds"), (int)((CompileFinishTime - CompileStartTime) * 1000)); if (NumErrors > 0) { FString FailMsg = FText::Format(LOCTEXT("CompileFailed", "[{Time}] Compile of {SourceName} failed. {NumErrors} Fatal Issue(s) {NumWarnings} Warning(s) [in {TotalMilliseconds} ms] ({SourcePath})"), Args).ToString(); Warning(*FailMsg); } else if(NumWarnings > 0) { FString WarningMsg = FText::Format(LOCTEXT("CompileWarning", "[{Time}] Compile of {SourceName} successful, but with {NumWarnings} Warning(s) [in {TotalMilliseconds} ms] ({SourcePath})"), Args).ToString(); Warning(*WarningMsg); } else { FString SuccessMsg = FText::Format(LOCTEXT("CompileSuccess", "[{Time}] Compile of {SourceName} successful! [in {TotalMilliseconds} ms] ({SourcePath})"), Args).ToString(); Note(*SuccessMsg); } if(bLogDetailedResults) { Note(*LOCTEXT("PerformanceSummaryHeading", "Performance summary:").ToString()); InternalLogEvent(*CurrentEventScope.Get()); } } }