Skip to content

修复了在UE5.8下执行Puerts.Gen命令会重复生成UE编辑器侧动态类型的bug - #2351

Open
easonwzs wants to merge 1 commit into
Tencent:masterfrom
easonwzs:master
Open

修复了在UE5.8下执行Puerts.Gen命令会重复生成UE编辑器侧动态类型的bug#2351
easonwzs wants to merge 1 commit into
Tencent:masterfrom
easonwzs:master

Conversation

@easonwzs

Copy link
Copy Markdown

我在UE5.8下当项目根目录中已存在 Typing/ue/ue_bp.d.ts 类型声明文件时,再次执行 Puerts.Gen 命令会重复生成编辑器侧的动态类型,如下:

Typing/ue/ue_bp.d.ts:45520:15 - error TS2300: Duplicate identifier 'EditorDataStorageTableDynamicTag$58$$58$Property$32$Information'.
45520         class EditorDataStorageTableDynamicTag$58$$58$Property$32$Information extends UE.EditorDataStorageTableDynamicTag {
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Typing/ue/ue_bp.d.ts:45535:15 - error TS2300: Duplicate identifier 'EditorDataStorageTableDynamicTag$58$$58$Type$32$Information'.
45535         class EditorDataStorageTableDynamicTag$58$$58$Type$32$Information extends UE.EditorDataStorageTableDynamicTag {

大概率是因为 UE5.8 引入/暴露的编辑器侧动态类型有关,Puerts 自己做的“非法 TS 标识符转义”。
主要可能是 UE5.8 里多了更容易被资产注册表枚举到这些 Engine.TedsDynamicColumns 相关的动态类型,比如:

EditorDataStorageTableDynamicTag::Alerts chain
EditorDataStorageTableDynamicTag::Property Information
SettingsModuleTag::Magnate

为此,我做了两件事:修复 ue_bp.d.ts 第二次生成重复声明的根因,并过滤不需要的 UE5.8 编辑器动态类型。

  • 根因修复放在 DeclarationGenerator.cpp 的恢复缓存逻辑中。

  • 过滤逻辑放在资产注册表枚举阶段,优先跳过 /Engine/TedsDynamicColumns,减少无用声明。

关键修改

  • 修复 RestoreBlueprintTypeDeclInfos

    • .d.ts 恢复 namespace 时,对每个 namespace 片段调用 PUERTS_NAMESPACE::TypeScriptVariableNameToFilename,再组装真实 package path。

    • class/enum 名称正则增加 $ 支持,完整捕获 $58$$32$ 这类转义名。

    • 恢复出的类型名也调用 TypeScriptVariableNameToFilename,确保 NameToDecl 的 key 和 WriteOutputObj->GetFName() 一致。

  • 增加资产过滤:

    • LoadAllWidgetBlueprint 遍历 AssetList 时跳过 AssetData.PackagePathAssetData.PackageName/Engine/TedsDynamicColumns 开头的资产。
    • 对已从旧 ue_bp.d.ts 恢复出的 /Engine/TedsDynamicColumns 缓存项也跳过输出或标记为不存在,避免历史污染继续保留。
  • 保持 FFileHelper::SaveStringToFile 覆盖写行为不变。

实现细节

  • 增加一个小函数,例如 RestoreEscapedPackageNameFromNamespace

    • 输入:Engine.TedsDynamicColumns.EditorDataStorageTableDynamicTag_Alerts$32$chain
    • 输出:/Engine/TedsDynamicColumns/EditorDataStorageTableDynamicTag_Alerts chain
  • 增加一个小函数,例如 ShouldSkipBlueprintDeclarationAsset

    • 默认返回 true 的路径:/Engine/TedsDynamicColumns
    • 同时用于资产枚举过滤和恢复缓存输出过滤,避免两处规则不一致。
  • 对过滤命中项不生成、不保留旧声明;业务项目 /Game 和项目插件内容不受影响。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant