void UK2Node_FunctionResult::ValidateNodeDuringCompilation(class FCompilerResultsLog& MessageLog) const { Super::ValidateNodeDuringCompilation(MessageLog); auto AllResultNodes = GetAllResultNodes(); UK2Node_FunctionResult* OtherResult = AllResultNodes.Num() ? AllResultNodes[0] : nullptr; if (OtherResult && (OtherResult != this)) { for (auto Pin : Pins) { auto OtherPin = OtherResult->FindPin(Pin->PinName); if (!OtherPin || (OtherPin->PinType != Pin->PinType)) { MessageLog.Error(*NSLOCTEXT("K2Node", "FunctionResult_DifferentReturnError", "Return nodes don't match each other: @@, @@").ToString(), this, OtherResult); break; } } } }
void UK2Node_FunctionResult::SyncWithPrimaryResultNode() { UK2Node_FunctionResult* PrimaryNode = nullptr; TArray<UK2Node_FunctionResult*> AllResultNodes = GetAllResultNodes(); for (auto ResultNode : AllResultNodes) { if (ResultNode && (this != ResultNode)) { PrimaryNode = ResultNode; break; } } if (PrimaryNode) { TArray< TSharedPtr<FUserPinInfo> > UDPinsCopy = UserDefinedPins; for (auto UDPin : UDPinsCopy) { RemoveUserDefinedPin(UDPin); } UserDefinedPins.Empty(); SignatureClass = PrimaryNode->SignatureClass; SignatureName = PrimaryNode->SignatureName; bIsEditable = PrimaryNode->bIsEditable; for (auto UDPin : PrimaryNode->UserDefinedPins) { if (UDPin.IsValid()) { TSharedPtr<FUserPinInfo> NewPinInfo = MakeShareable(new FUserPinInfo()); NewPinInfo->PinName = UDPin->PinName; NewPinInfo->PinType = UDPin->PinType; NewPinInfo->DesiredPinDirection = UDPin->DesiredPinDirection; UserDefinedPins.Add(NewPinInfo); } } ReconstructNode(); } }
void UK2Node_FunctionResult::SyncWithPrimaryResultNode() { UK2Node_FunctionResult* PrimaryNode = nullptr; TArray<UK2Node_FunctionResult*> AllResultNodes = GetAllResultNodes(); for (auto ResultNode : AllResultNodes) { if (ResultNode && (this != ResultNode)) { PrimaryNode = ResultNode; break; } } if (PrimaryNode) { SignatureClass = PrimaryNode->SignatureClass; SignatureName = PrimaryNode->SignatureName; bIsEditable = PrimaryNode->bIsEditable; // Temporary array that will contain our list of Old Pins that are no longer part of the return signature TArray< TSharedPtr<FUserPinInfo> > OldPins = UserDefinedPins; // Temporary array that will contain our list of Signature Pins that need to be added TArray< TSharedPtr<FUserPinInfo> > SignaturePins = PrimaryNode->UserDefinedPins; for (int OldIndex = OldPins.Num() - 1; OldIndex >= 0; --OldIndex) { TSharedPtr<FUserPinInfo> OldPin = OldPins[OldIndex]; if (!OldPin.IsValid()) { OldPins.RemoveAt(OldIndex); } else { for (int SignatureIndex = SignaturePins.Num() - 1; SignatureIndex >= 0; --SignatureIndex) { TSharedPtr<FUserPinInfo> SignaturePin = SignaturePins[SignatureIndex]; if (!SignaturePin.IsValid()) { SignaturePins.RemoveAt(SignatureIndex); } else if (OldPin->PinName == SignaturePin->PinName && OldPin->PinType == SignaturePin->PinType && OldPin->DesiredPinDirection == SignaturePin->DesiredPinDirection) { // We have a match between our Signature pins and our Old Pins, // so we can leave the old pin as is by removing it from both temporary lists. OldPins.RemoveAt(OldIndex); SignaturePins.RemoveAt(SignatureIndex); break; } } } } // Remove old pins that are not part of the primary node signature for (TSharedPtr<FUserPinInfo> OldPinToRemove : OldPins) { RemoveUserDefinedPin(OldPinToRemove); } // Add pins that don't exist yet but are part of the primary node signature for (TSharedPtr<FUserPinInfo> SignaturePinToAdd : SignaturePins) { TSharedPtr<FUserPinInfo> NewPinInfo = MakeShareable(new FUserPinInfo()); NewPinInfo->PinName = SignaturePinToAdd->PinName; NewPinInfo->PinType = SignaturePinToAdd->PinType; NewPinInfo->DesiredPinDirection = SignaturePinToAdd->DesiredPinDirection; UserDefinedPins.Add(NewPinInfo); } ReconstructNode(); } }