@@ -97,9 +97,9 @@ def get_file_list(api_filepath, output_dir, headers=False, sources=False):
9797 files .append (str (source_filename .as_posix ()))
9898
9999 for  engine_class  in  api ["classes" ]:
100-  # TODO: Properly setup this  singleton since it conflicts with ClassDB in the bindings . 
100+  # Generate code for the ClassDB  singleton under a different name . 
101101 if  engine_class ["name" ] ==  "ClassDB" :
102-  continue 
102+  engine_class [ "name" ]  =   "ClassDBSingleton" 
103103 header_filename  =  include_gen_folder  /  "classes"  /  (camel_to_snake (engine_class ["name" ]) +  ".hpp" )
104104 source_filename  =  source_gen_folder  /  "classes"  /  (camel_to_snake (engine_class ["name" ]) +  ".cpp" )
105105 if  headers :
@@ -1036,21 +1036,21 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node):
10361036
10371037 # First create map of classes and singletons. 
10381038 for  class_api  in  api ["classes" ]:
1039-  # TODO: Properly setup this  singleton since it conflicts with ClassDB in the bindings . 
1039+  # Generate code for the ClassDB  singleton under a different name . 
10401040 if  class_api ["name" ] ==  "ClassDB" :
1041-  continue 
1041+  class_api [ "name" ]  =   "ClassDBSingleton" 
10421042 engine_classes [class_api ["name" ]] =  class_api ["is_refcounted" ]
10431043 for  native_struct  in  api ["native_structures" ]:
10441044 engine_classes [native_struct ["name" ]] =  False 
10451045 native_structures .append (native_struct ["name" ])
10461046
10471047 for  singleton  in  api ["singletons" ]:
1048+  # Generate code for the ClassDB singleton under a different name. 
1049+  if  singleton ["name" ] ==  "ClassDB" :
1050+  singleton ["name" ] =  "ClassDBSingleton" 
10481051 singletons .append (singleton ["name" ])
10491052
10501053 for  class_api  in  api ["classes" ]:
1051-  # TODO: Properly setup this singleton since it conflicts with ClassDB in the bindings. 
1052-  if  class_api ["name" ] ==  "ClassDB" :
1053-  continue 
10541054 # Check used classes for header include. 
10551055 used_classes  =  set ()
10561056 fully_used_classes  =  set ()
@@ -1242,7 +1242,7 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
12421242 if  len (fully_used_classes ) >  0 :
12431243 result .append ("" )
12441244
1245-  if  class_name  !=  "Object" :
1245+  if  class_name  !=  "Object"   and   class_name   !=   "ClassDBSingleton" :
12461246 result .append ("#include <godot_cpp/core/class_db.hpp>" )
12471247 result .append ("" )
12481248 result .append ("#include <type_traits>" )
@@ -1421,6 +1421,51 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
14211421 result .append (f'VARIANT_ENUM_CAST({ class_name } { enum_api ["name" ]}  )
14221422 result .append ("" )
14231423
1424+  if  class_name  ==  "ClassDBSingleton" :
1425+  result .append ("#define CLASSDB_SINGLETON_FORWARD_METHODS \\ " )
1426+  for  method  in  class_api ["methods" ]:
1427+  # ClassDBSingleton shouldn't have any static or vararg methods, but if some appear later, lets skip them. 
1428+  if  vararg :
1429+  continue 
1430+  if  "is_static"  in  method  and  method ["is_static" ]:
1431+  continue 
1432+ 
1433+  method_signature  =  "\t static " 
1434+  if  "return_type"  in  method :
1435+  method_signature  +=  f'{ correct_type (method ["return_type" ])}  
1436+  elif  "return_value"  in  method :
1437+  method_signature  +=  (
1438+  correct_type (method ["return_value" ]["type" ], method ["return_value" ].get ("meta" , None )) +  " " 
1439+  )
1440+  else :
1441+  method_signature  +=  "void " 
1442+ 
1443+  method_signature  +=  f'{ method ["name" ]}  
1444+ 
1445+  method_arguments  =  []
1446+  if  "arguments"  in  method :
1447+  method_arguments  =  method ["arguments" ]
1448+ 
1449+  method_signature  +=  make_function_parameters (
1450+  method_arguments , include_default = True , for_builtin = True , is_vararg = False 
1451+  )
1452+ 
1453+  method_signature  +=  ") { \\ " 
1454+ 
1455+  result .append (method_signature )
1456+ 
1457+  method_body  =  "\t \t " 
1458+  if  "return_type"  in  method  or  "return_value"  in  method :
1459+  method_body  +=  "return " 
1460+  method_body  +=  f'ClassDBSingleton::get_singleton()->{ method ["name" ]}  
1461+  method_body  +=  ", " .join (map (lambda  x : escape_identifier (x ["name" ]), method_arguments ))
1462+  method_body  +=  "); \\ " 
1463+ 
1464+  result .append (method_body )
1465+  result .append ("\t } \\ " )
1466+  result .append ("\t ;" )
1467+  result .append ("" )
1468+ 
14241469 result .append (f"#endif // ! { header_guard }  )
14251470
14261471 return  "\n " .join (result )
@@ -1453,7 +1498,10 @@ def generate_engine_class_source(class_api, used_classes, fully_used_classes, us
14531498
14541499 if  is_singleton :
14551500 result .append (f"{ class_name } { class_name }  )
1456-  result .append (f"\t const StringName _gde_class_name = { class_name }  )
1501+  if  class_name  !=  "ClassDBSingleton" :
1502+  result .append (f"\t const StringName _gde_class_name = { class_name }  )
1503+  else :
1504+  result .append (f"\t static const StringName _gde_class_name = StringName(\" ClassDB\" );" )
14571505 result .append (
14581506 "\t static GDExtensionObjectPtr singleton_obj = internal::gdextension_interface_global_get_singleton(_gde_class_name._native_ptr());" 
14591507 )
@@ -1480,7 +1528,10 @@ def generate_engine_class_source(class_api, used_classes, fully_used_classes, us
14801528 result .append (method_signature  +  " {" )
14811529
14821530 # Method body. 
1483-  result .append (f"\t const StringName _gde_class_name = { class_name }  )
1531+  if  class_name  !=  "ClassDBSingleton" :
1532+  result .append (f"\t const StringName _gde_class_name = { class_name }  )
1533+  else :
1534+  result .append (f"\t static const StringName _gde_class_name = StringName(\" ClassDB\" );" )
14841535 result .append (f'\t const StringName _gde_method_name = "{ method ["name" ]}  )
14851536 result .append (
14861537 f'\t static GDExtensionMethodBindPtr _gde_method_bind = internal::gdextension_interface_classdb_get_method_bind(_gde_class_name._native_ptr(), _gde_method_name._native_ptr(), { method ["hash" ]}  
@@ -2285,6 +2336,7 @@ def escape_identifier(id):
22852336 "operator" : "_operator" ,
22862337 "typeof" : "type_of" ,
22872338 "typename" : "type_name" ,
2339+  "enum" : "_enum" ,
22882340 }
22892341 if  id  in  cpp_keywords_map :
22902342 return  cpp_keywords_map [id ]
0 commit comments