From 2d4db8b3185532303ca40a10b6db7c5b4e2660e0 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Wed, 20 Dec 2023 12:39:55 +0100 Subject: [PATCH] Report when `register_class` overrides classes with the same bl_idname The unregistering of already registered classes is expected behavior, however this was done silently and can be unsafe as two Addons may have the same names for operators and in case of name collision the addon registered first will break silently / start behave unexpectedly. So reporting the unregister step seems reasonable. During Addon development, this might seem noisy when classes are frequently updated, however catching the problematic cases instead of being silent might be beneficial. Part of #116370 --- .../blender/makesrna/intern/rna_animation.cc | 7 ++++ .../blender/makesrna/intern/rna_nodetree.cc | 14 ++++++++ source/blender/makesrna/intern/rna_render.cc | 7 ++++ source/blender/makesrna/intern/rna_ui.cc | 33 +++++++++++++++++++ source/blender/makesrna/intern/rna_usd.cc | 7 ++++ source/blender/makesrna/intern/rna_userdef.cc | 7 ++++ source/blender/makesrna/intern/rna_wm.cc | 21 ++++++++++++ .../blender/makesrna/intern/rna_wm_gizmo.cc | 7 ++++ 8 files changed, 103 insertions(+) diff --git a/source/blender/makesrna/intern/rna_animation.cc b/source/blender/makesrna/intern/rna_animation.cc index 2f3394986ad..c428390a702 100644 --- a/source/blender/makesrna/intern/rna_animation.cc +++ b/source/blender/makesrna/intern/rna_animation.cc @@ -325,6 +325,13 @@ static StructRNA *rna_KeyingSetInfo_register(Main *bmain, /* check if we have registered this info before, and remove it */ ksi = ANIM_keyingset_info_find_name(dummy_ksi.idname); if (ksi) { + BKE_reportf(reports, + RPT_INFO, + "%s '%s', bl_idname '%s' has been registered before, unregistering previous", + error_prefix, + identifier, + dummy_ksi.idname); + StructRNA *srna = ksi->rna_ext.srna; if (!(srna && rna_KeyingSetInfo_unregister(bmain, srna))) { BKE_reportf(reports, diff --git a/source/blender/makesrna/intern/rna_nodetree.cc b/source/blender/makesrna/intern/rna_nodetree.cc index 4d986072a57..25fa4f54020 100644 --- a/source/blender/makesrna/intern/rna_nodetree.cc +++ b/source/blender/makesrna/intern/rna_nodetree.cc @@ -991,6 +991,13 @@ static StructRNA *rna_NodeTree_register(Main *bmain, /* check if we have registered this tree type before, and remove it */ nt = ntreeTypeFind(dummy_nt.idname); if (nt) { + BKE_reportf(reports, + RPT_INFO, + "Registering node tree class: '%s', bl_idname '%s' has been registered before, " + "unregistering previous", + identifier, + dummy_nt.idname); + /* NOTE: unlike most types `nt->rna_ext.srna` doesn't need to be checked for nullptr. */ if (!rna_NodeTree_unregister(bmain, nt->rna_ext.srna)) { BKE_reportf(reports, @@ -1663,6 +1670,13 @@ static bNodeType *rna_Node_register_base(Main *bmain, return nullptr; } + BKE_reportf(reports, + RPT_INFO, + "Registering node class: '%s', bl_idname '%s' has been registered before, " + "unregistering previous", + identifier, + dummy_nt.idname); + /* NOTE: unlike most types `nt->rna_ext.srna` doesn't need to be checked for nullptr. */ if (!rna_Node_unregister(bmain, nt->rna_ext.srna)) { BKE_reportf(reports, diff --git a/source/blender/makesrna/intern/rna_render.cc b/source/blender/makesrna/intern/rna_render.cc index 02270519731..6fca1dcaa91 100644 --- a/source/blender/makesrna/intern/rna_render.cc +++ b/source/blender/makesrna/intern/rna_render.cc @@ -348,6 +348,13 @@ static StructRNA *rna_RenderEngine_register(Main *bmain, et = static_cast( BLI_findstring(&R_engines, dummy_et.idname, offsetof(RenderEngineType, idname))); if (et) { + BKE_reportf(reports, + RPT_INFO, + "%s '%s', bl_idname '%s' has been registered before, unregistering previous", + error_prefix, + identifier, + dummy_et.idname); + StructRNA *srna = et->rna_ext.srna; if (!(srna && rna_RenderEngine_unregister(bmain, srna))) { BKE_reportf(reports, diff --git a/source/blender/makesrna/intern/rna_ui.cc b/source/blender/makesrna/intern/rna_ui.cc index 06db0f3e668..46a159aee75 100644 --- a/source/blender/makesrna/intern/rna_ui.cc +++ b/source/blender/makesrna/intern/rna_ui.cc @@ -315,6 +315,12 @@ static StructRNA *rna_Panel_register(Main *bmain, PanelType *pt_next = pt->next; StructRNA *srna = pt->rna_ext.srna; if (srna) { + BKE_reportf(reports, + RPT_INFO, + "%s '%s', bl_idname '%s' has been registered before, unregistering previous", + error_prefix, + identifier, + dummy_pt.idname); if (!rna_Panel_unregister(bmain, srna)) { BKE_reportf(reports, RPT_ERROR, @@ -721,6 +727,13 @@ static StructRNA *rna_UIList_register(Main *bmain, /* Check if we have registered this UI-list type before, and remove it. */ ult = WM_uilisttype_find(dummy_ult.idname, true); if (ult) { + BKE_reportf(reports, + RPT_INFO, + "%s '%s', bl_idname '%s' has been registered before, unregistering previous", + error_prefix, + identifier, + dummy_ult.idname); + StructRNA *srna = ult->rna_ext.srna; if (!(srna && rna_UIList_unregister(bmain, srna))) { BKE_reportf(reports, @@ -852,6 +865,13 @@ static StructRNA *rna_Header_register(Main *bmain, ht = static_cast( BLI_findstring(&art->headertypes, dummy_ht.idname, offsetof(HeaderType, idname))); if (ht) { + BKE_reportf(reports, + RPT_INFO, + "%s '%s', bl_idname '%s' has been registered before, unregistering previous", + error_prefix, + identifier, + dummy_ht.idname); + StructRNA *srna = ht->rna_ext.srna; if (!(srna && rna_Header_unregister(bmain, srna))) { BKE_reportf(reports, @@ -1002,6 +1022,13 @@ static StructRNA *rna_Menu_register(Main *bmain, /* check if we have registered this menu type before, and remove it */ mt = WM_menutype_find(dummy_mt.idname, true); if (mt) { + BKE_reportf(reports, + RPT_INFO, + "%s '%s', bl_idname '%s' has been registered before, unregistering previous", + error_prefix, + identifier, + dummy_mt.idname); + StructRNA *srna = mt->rna_ext.srna; if (!(srna && rna_Menu_unregister(bmain, srna))) { BKE_reportf(reports, @@ -1207,6 +1234,12 @@ static StructRNA *rna_AssetShelf_register(Main *bmain, LISTBASE_FOREACH (AssetShelfType *, iter_shelf_type, &space_type->asset_shelf_types) { if (STREQ(iter_shelf_type->idname, dummy_shelf_type.idname)) { if (iter_shelf_type->rna_ext.srna) { + BKE_reportf(reports, + RPT_INFO, + "Registering asset shelf class: '%s' has been registered before, " + "unregistering previous", + dummy_shelf_type.idname); + rna_AssetShelf_unregister(bmain, iter_shelf_type->rna_ext.srna); } break; diff --git a/source/blender/makesrna/intern/rna_usd.cc b/source/blender/makesrna/intern/rna_usd.cc index 20f76dec39c..7bd1724bfb8 100644 --- a/source/blender/makesrna/intern/rna_usd.cc +++ b/source/blender/makesrna/intern/rna_usd.cc @@ -82,6 +82,13 @@ static StructRNA *rna_USDHook_register(Main *bmain, /* check if we have registered this hook before, and remove it */ hook = USD_find_hook_name(dummy_hook.idname); if (hook) { + BKE_reportf(reports, + RPT_INFO, + "%s '%s', bl_idname '%s' has been registered before, unregistering previous", + error_prefix, + identifier, + dummy_hook.idname); + StructRNA *srna = hook->rna_ext.srna; if (!rna_USDHook_unregister(bmain, srna)) { BKE_reportf(reports, diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index 5f6eff8aa5d..5c511cb3bda 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -1022,6 +1022,13 @@ static StructRNA *rna_AddonPref_register(Main *bmain, /* Check if we have registered this add-on preference type before, and remove it. */ apt = BKE_addon_pref_type_find(dummy_addon.module, true); if (apt) { + BKE_reportf(reports, + RPT_INFO, + "%s '%s', bl_idname '%s' has been registered before, unregistering previous", + error_prefix, + identifier, + dummy_apt.idname); + StructRNA *srna = apt->rna_ext.srna; if (!(srna && rna_AddonPref_unregister(bmain, srna))) { BKE_reportf(reports, diff --git a/source/blender/makesrna/intern/rna_wm.cc b/source/blender/makesrna/intern/rna_wm.cc index 1440b90badd..cc13f5bd3f0 100644 --- a/source/blender/makesrna/intern/rna_wm.cc +++ b/source/blender/makesrna/intern/rna_wm.cc @@ -1185,6 +1185,13 @@ static StructRNA *rna_wmKeyConfigPref_register(Main *bmain, /* check if we have registered this keyconf-prefs type before, and remove it */ kpt_rt = BKE_keyconfig_pref_type_find(dummy_kpt.idname, true); if (kpt_rt) { + BKE_reportf(reports, + RPT_INFO, + "%s '%s', bl_idname '%s' has been registered before, unregistering previous", + error_prefix, + identifier, + dummy_kpt.idname); + StructRNA *srna = kpt_rt->rna_ext.srna; if (!(srna && rna_wmKeyConfigPref_unregister(bmain, srna))) { BKE_reportf(reports, @@ -1530,6 +1537,13 @@ static StructRNA *rna_Operator_register(Main *bmain, { wmOperatorType *ot = WM_operatortype_find(dummy_ot.idname, true); if (ot) { + BKE_reportf(reports, + RPT_INFO, + "%s '%s', bl_idname '%s' has been registered before, unregistering previous", + error_prefix, + identifier, + dummy_ot.idname); + StructRNA *srna = ot->rna_ext.srna; if (!(srna && rna_Operator_unregister(bmain, srna))) { BKE_reportf(reports, @@ -1700,6 +1714,13 @@ static StructRNA *rna_MacroOperator_register(Main *bmain, { wmOperatorType *ot = WM_operatortype_find(dummy_ot.idname, true); if (ot) { + BKE_reportf(reports, + RPT_INFO, + "%s '%s', bl_idname '%s' has been registered before, unregistering previous", + error_prefix, + identifier, + dummy_ot.idname); + StructRNA *srna = ot->rna_ext.srna; if (!(srna && rna_Operator_unregister(bmain, srna))) { BKE_reportf(reports, diff --git a/source/blender/makesrna/intern/rna_wm_gizmo.cc b/source/blender/makesrna/intern/rna_wm_gizmo.cc index 18c61fa8519..96d3ebb2b05 100644 --- a/source/blender/makesrna/intern/rna_wm_gizmo.cc +++ b/source/blender/makesrna/intern/rna_wm_gizmo.cc @@ -460,6 +460,13 @@ static StructRNA *rna_Gizmo_register(Main *bmain, { const wmGizmoType *gzt = WM_gizmotype_find(dummy_gt.idname, true); if (gzt) { + BKE_reportf(reports, + RPT_INFO, + "%s '%s', bl_idname '%s' has been registered before, unregistering previous", + error_prefix, + identifier, + dummy_gt.idname); + StructRNA *srna = gzt->rna_ext.srna; if (!(srna && rna_Gizmo_unregister(bmain, srna))) { BKE_reportf(reports, -- 2.30.2