From 6041641c742145299946a22cd007d6c9d360e043 Mon Sep 17 00:00:00 2001 From: jyelon Date: Sun, 29 Mar 2026 15:11:45 -0400 Subject: [PATCH] More cleanup of Internal/External IDs --- .../UEWingman/Handlers/ActorComponent_Add.h | 8 ++++---- .../Handlers/BlueprintGraph_Create.h | 8 ++++---- .../Handlers/BlueprintVariable_Create.h | 9 ++++----- .../Handlers/EventDispatcher_Create.h | 13 ++++++------ .../UEWingman/Handlers/Test_Tokenizer.h | 2 +- .../Source/UEWingman/Handlers/Widget_Create.h | 11 +++++----- .../UEWingman/Private/WingTokenizer.cpp | 20 ++++--------------- .../Source/UEWingman/Private/WingUtils.cpp | 17 +++++++++++----- .../Source/UEWingman/Public/WingTokenizer.h | 10 ++-------- .../Source/UEWingman/Public/WingUtils.h | 2 +- 10 files changed, 43 insertions(+), 57 deletions(-) diff --git a/Plugins/UEWingman/Source/UEWingman/Handlers/ActorComponent_Add.h b/Plugins/UEWingman/Source/UEWingman/Handlers/ActorComponent_Add.h index e0821d3f..6de77dd2 100644 --- a/Plugins/UEWingman/Source/UEWingman/Handlers/ActorComponent_Add.h +++ b/Plugins/UEWingman/Source/UEWingman/Handlers/ActorComponent_Add.h @@ -49,10 +49,10 @@ public: if (!BP) return; // Check that the proposed name is valid + FName InternalID = WingUtils::CheckProposedName(Component); + if (InternalID.IsNone()) return; TArray AllComponents = UWingComponentReference::GetAll(BP); - if (!WingUtils::FindNoneWithExternalID(Component, AllComponents, TEXT("Component"))) return; - FString InternalName = WingUtils::CheckProposedName(Component); - if (InternalName.IsEmpty()) return; + if (!WingUtils::FindNoneWithInternalID(InternalID, AllComponents, TEXT("Component"))) return; // Resolve the component class by name UWingTypes::Requirements Req; @@ -69,7 +69,7 @@ public: if (!ParentComp) return; // Create the SCS node - if (!UWingComponentReference::AddComponent(BP, ComponentClass, ParentComp, FName(*InternalName))) return; + if (!UWingComponentReference::AddComponent(BP, ComponentClass, ParentComp, InternalID)) return; UWingServer::Printf(TEXT("Component Added.\n")); } diff --git a/Plugins/UEWingman/Source/UEWingman/Handlers/BlueprintGraph_Create.h b/Plugins/UEWingman/Source/UEWingman/Handlers/BlueprintGraph_Create.h index b2660b52..9c4e4bad 100644 --- a/Plugins/UEWingman/Source/UEWingman/Handlers/BlueprintGraph_Create.h +++ b/Plugins/UEWingman/Source/UEWingman/Handlers/BlueprintGraph_Create.h @@ -76,17 +76,17 @@ public: } // Check graph name uniqueness and legality - if (!WingUtils::FindNoneWithExternalID(Graph, WingUtils::AllGraphs(BP), TEXT("Graph"))) + FName InternalID = WingUtils::CheckProposedName(Graph); + if (InternalID.IsNone()) return; + if (!WingUtils::FindNoneWithInternalID(InternalID, WingUtils::AllGraphs(BP), TEXT("Graph"))) return; - FString InternalName = WingUtils::CheckProposedName(Graph); - if (InternalName.IsEmpty()) return; // Validate argument and return value types before making changes if (!Arguments.IsEmpty() && !WingFunctionArgs::CheckArgs(Arguments)) return; if (!ReturnValues.IsEmpty() && !WingFunctionArgs::CheckArgs(ReturnValues)) return; // Create the Graph - UEdGraph* NewGraph = FBlueprintEditorUtils::CreateNewGraph(BP, FName(InternalName), + UEdGraph* NewGraph = FBlueprintEditorUtils::CreateNewGraph(BP, InternalID, UEdGraph::StaticClass(), UEdGraphSchema_K2::StaticClass()); if (!NewGraph) { diff --git a/Plugins/UEWingman/Source/UEWingman/Handlers/BlueprintVariable_Create.h b/Plugins/UEWingman/Source/UEWingman/Handlers/BlueprintVariable_Create.h index cbe66038..3af3d0af 100644 --- a/Plugins/UEWingman/Source/UEWingman/Handlers/BlueprintVariable_Create.h +++ b/Plugins/UEWingman/Source/UEWingman/Handlers/BlueprintVariable_Create.h @@ -45,15 +45,14 @@ public: if (!BP) return; // Check validity of the proposed name - if (!WingUtils::FindNoneWithExternalID(Name, BP->NewVariables, TEXT("Variable"))) return; - FString InternalName = WingUtils::CheckProposedName(Name); - if (InternalName.IsEmpty()) return; - FName VarFName(InternalName); + FName InternalID = WingUtils::CheckProposedName(Name); + if (InternalID.IsNone()) return; + if (!WingUtils::FindNoneWithInternalID(InternalID, BP->NewVariables, TEXT("Variable"))) return; // Add the variable with a default type FEdGraphPinType DefaultType; DefaultType.PinCategory = UEdGraphSchema_K2::PC_Int; - if (!FBlueprintEditorUtils::AddMemberVariable(BP, VarFName, DefaultType)) + if (!FBlueprintEditorUtils::AddMemberVariable(BP, InternalID, DefaultType)) { UWingServer::Printf(TEXT("ERROR: Failed to add variable '%s' to %s\n"), *Name, *WingUtils::FormatName(BP)); return; diff --git a/Plugins/UEWingman/Source/UEWingman/Handlers/EventDispatcher_Create.h b/Plugins/UEWingman/Source/UEWingman/Handlers/EventDispatcher_Create.h index e076053e..367e42b9 100644 --- a/Plugins/UEWingman/Source/UEWingman/Handlers/EventDispatcher_Create.h +++ b/Plugins/UEWingman/Source/UEWingman/Handlers/EventDispatcher_Create.h @@ -43,11 +43,10 @@ public: if (!BP) return; // Check for valid proposed name - if (!WingUtils::FindNoneWithExternalID(Dispatcher, BP->NewVariables, TEXT("Variable"))) return; - if (!WingUtils::FindNoneWithExternalID(Dispatcher, WingUtils::AllGraphs(BP), TEXT("Graph"))) return; - FString InternalName = WingUtils::CheckProposedName(Dispatcher); - if (InternalName.IsEmpty()) return; - FName VarFName(InternalName); + FName InternalID = WingUtils::CheckProposedName(Dispatcher); + if (InternalID.IsNone()) return; + if (!WingUtils::FindNoneWithInternalID(InternalID, BP->NewVariables, TEXT("Variable"))) return; + if (!WingUtils::FindNoneWithInternalID(InternalID, WingUtils::AllGraphs(BP), TEXT("Graph"))) return; // Make sure the argument types are valid. if (!WingFunctionArgs::CheckArgs(Arguments)) return; @@ -55,7 +54,7 @@ public: // Add the delegate variable FEdGraphPinType DelegateType; DelegateType.PinCategory = UEdGraphSchema_K2::PC_MCDelegate; - if (!FBlueprintEditorUtils::AddMemberVariable(BP, VarFName, DelegateType)) + if (!FBlueprintEditorUtils::AddMemberVariable(BP, InternalID, DelegateType)) { UWingServer::Printf(TEXT("ERROR: Failed to add event dispatcher '%s' to %s\n"), *Dispatcher, *WingUtils::FormatName(BP)); return; @@ -63,7 +62,7 @@ public: // Create the signature graph const UEdGraphSchema_K2* K2Schema = GetDefault(); - UEdGraph* SigGraph = FBlueprintEditorUtils::CreateNewGraph(BP, VarFName, + UEdGraph* SigGraph = FBlueprintEditorUtils::CreateNewGraph(BP, InternalID, UEdGraph::StaticClass(), UEdGraphSchema_K2::StaticClass()); if (!SigGraph) { diff --git a/Plugins/UEWingman/Source/UEWingman/Handlers/Test_Tokenizer.h b/Plugins/UEWingman/Source/UEWingman/Handlers/Test_Tokenizer.h index 794f98b7..4a68d1f8 100644 --- a/Plugins/UEWingman/Source/UEWingman/Handlers/Test_Tokenizer.h +++ b/Plugins/UEWingman/Source/UEWingman/Handlers/Test_Tokenizer.h @@ -28,6 +28,6 @@ public: virtual void Handle() override { WingTokenizer T(Input); - T.PrintEverything(); + T.PrintEverything(UWingServer::GetPrintBuffer()); } }; diff --git a/Plugins/UEWingman/Source/UEWingman/Handlers/Widget_Create.h b/Plugins/UEWingman/Source/UEWingman/Handlers/Widget_Create.h index db2656f5..0559bf13 100644 --- a/Plugins/UEWingman/Source/UEWingman/Handlers/Widget_Create.h +++ b/Plugins/UEWingman/Source/UEWingman/Handlers/Widget_Create.h @@ -66,13 +66,13 @@ public: } // Validate the proposed name. - FString UnsanitizedName = WingUtils::CheckProposedName(Name); - if (UnsanitizedName.IsEmpty()) return; + FName InternalID = WingUtils::CheckProposedName(Name); + if (InternalID.IsNone()) return; // Check that the name is unique among existing widgets. TArray AllWidgets; Tree->GetAllWidgets(AllWidgets); - if (!WingUtils::FindNoneWithExternalID(Name, AllWidgets, TEXT("Widget"))) return; + if (!WingUtils::FindNoneWithInternalID(InternalID, AllWidgets, TEXT("Widget"))) return; // If a parent is specified, find it and verify it's a panel. UPanelWidget* ParentPanel = nullptr; @@ -94,11 +94,10 @@ public: // Create the widget. UWidget* NewWidget; - FName WidgetFName(*UnsanitizedName); if (WidgetClass->IsChildOf(UUserWidget::StaticClass())) - NewWidget = CreateWidget(Tree, WidgetClass, WidgetFName); + NewWidget = CreateWidget(Tree, WidgetClass, InternalID); else - NewWidget = NewObject(Tree, WidgetClass, WidgetFName, RF_Transactional); + NewWidget = NewObject(Tree, WidgetClass, InternalID, RF_Transactional); if (!NewWidget) { diff --git a/Plugins/UEWingman/Source/UEWingman/Private/WingTokenizer.cpp b/Plugins/UEWingman/Source/UEWingman/Private/WingTokenizer.cpp index 299e7efa..c16af66d 100644 --- a/Plugins/UEWingman/Source/UEWingman/Private/WingTokenizer.cpp +++ b/Plugins/UEWingman/Source/UEWingman/Private/WingTokenizer.cpp @@ -1,5 +1,4 @@ #include "WingTokenizer.h" -#include "WingServer.h" void WingCharacterClasses::Assign(Cat Category, FStringView String) @@ -193,11 +192,11 @@ WingTokenizer::WingTokenizer(const FString& Input) if (!Error.IsEmpty()) Tokens.Empty(); } -void WingTokenizer::PrintEverything() const +void WingTokenizer::PrintEverything(FStringBuilderBase &Out) const { if (!Error.IsEmpty()) { - UWingServer::Printf(TEXT("Error: %s\n"), *Error); + Out.Appendf(TEXT("Error: %s\n"), *Error); } for (const Token& T : Tokens) { @@ -215,9 +214,9 @@ void WingTokenizer::PrintEverything() const } } if (T.Type >= 0x20 && T.Type <= 0x7E) - UWingServer::Printf(TEXT("Token '%c': %s\n"), T.Type, *ExtraStr); + Out.Appendf(TEXT("Token '%c': %s\n"), T.Type, *ExtraStr); else - UWingServer::Printf(TEXT("Token %04X: %s\n"), (int32)T.Type, *ExtraStr); + Out.Appendf(TEXT("Token %04X: %s\n"), (int32)T.Type, *ExtraStr); } } @@ -300,17 +299,6 @@ FString WingTokenizer::TryInternalizeID(const FString &ExternalID, FString &Erro return InternalID; } -FString WingTokenizer::CheckInternalizeID(const FString &ExternalID) -{ - FString Error; - FString InternalID = TryInternalizeID(ExternalID, Error); - if (!Error.IsEmpty()) - { - UWingServer::Printf(TEXT("%s\n"), *Error); - UWingServer::SuggestManual(WingManual::Section::EscapeSequences); - } - return InternalID; -} FString WingTokenizer::SimplifyID(const FString &ID) { diff --git a/Plugins/UEWingman/Source/UEWingman/Private/WingUtils.cpp b/Plugins/UEWingman/Source/UEWingman/Private/WingUtils.cpp index 062cb5ef..4e3f4057 100644 --- a/Plugins/UEWingman/Source/UEWingman/Private/WingUtils.cpp +++ b/Plugins/UEWingman/Source/UEWingman/Private/WingUtils.cpp @@ -64,18 +64,25 @@ FString WingUtils::ExternalizeID(FName Name) FName WingUtils::CheckInternalizeID(const FString &ExternalID) { - return FName(WingTokenizer::CheckInternalizeID(ExternalID)); + FString Error; + FString InternalID = WingTokenizer::TryInternalizeID(ExternalID, Error); + if (!Error.IsEmpty()) + { + UWingServer::Printf(TEXT("%s\n"), *Error); + UWingServer::SuggestManual(WingManual::Section::EscapeSequences); + } + return FName(InternalID); } -FString WingUtils::CheckProposedName(const FString &ExternalID) +FName WingUtils::CheckProposedName(const FString &ExternalID) { - FString InternalID = WingTokenizer::CheckInternalizeID(ExternalID); - if (!InternalID.IsEmpty() && !WingTokenizer::WouldExternalizeReadably(InternalID)) + FName InternalID = CheckInternalizeID(ExternalID); + if (!InternalID.IsNone() && !WingTokenizer::WouldExternalizeReadably(InternalID.ToString())) { UWingServer::Printf(TEXT("ERROR: id %s would not be a readable id, may not create item with this name"), *ExternalID); UWingServer::SuggestManual(WingManual::Section::EscapeSequences); - return FString(); + return FName(); } return InternalID; } diff --git a/Plugins/UEWingman/Source/UEWingman/Public/WingTokenizer.h b/Plugins/UEWingman/Source/UEWingman/Public/WingTokenizer.h index b3f367fa..3202d0f7 100644 --- a/Plugins/UEWingman/Source/UEWingman/Public/WingTokenizer.h +++ b/Plugins/UEWingman/Source/UEWingman/Public/WingTokenizer.h @@ -144,12 +144,6 @@ struct WingTokenizer // string and sets the error message. static FString TryInternalizeID(const FString &ExternalID, FString &Error); - // Calls TryInternalizeName. If this generates an - // error, prints the error message, suggests the manual - // entry on identifier sanitization, and returns empty - // string. - static FString CheckInternalizeID(const FString &ExternalID); - // Simplify an ID. This removes any non-identifier // characters from the ID. Be careful! This could // remove the whole identifier! So obviously this @@ -157,8 +151,8 @@ struct WingTokenizer // that's OK. static FString SimplifyID(const FString &ID); - // Print all tokens to the log for debugging. - void PrintEverything() const; + // Print all tokens into a string builder for debugging. + void PrintEverything(FStringBuilderBase &Out) const; private: // Add a token to the token array. diff --git a/Plugins/UEWingman/Source/UEWingman/Public/WingUtils.h b/Plugins/UEWingman/Source/UEWingman/Public/WingUtils.h index f5eff48f..3e06b023 100644 --- a/Plugins/UEWingman/Source/UEWingman/Public/WingUtils.h +++ b/Plugins/UEWingman/Source/UEWingman/Public/WingUtils.h @@ -197,7 +197,7 @@ public: // empty string. //////////////////////////////////////////////////////// - [[nodiscard]] static FString CheckProposedName(const FString &Name); + static FName CheckProposedName(const FString &Name); static FString FormatNodeTitle(const UEdGraphNode *Node);