11#include " jsb_object_bindings.h"
22#include " jsb_transpiler.h"
33#include " jsb_type_convert.h"
4+ #include " ../internal/jsb_class_util.h"
45// TODO: Refactor. Violates isolation of bridge.
56#include " ../weaver/jsb_script_instance.h"
67#include " ../weaver/jsb_script_language.h"
@@ -14,17 +15,18 @@ namespace jsb
1415
1516 jsb_check (p_class_info);
1617
17- String class_name = internal::NamingUtil::get_class_name (p_class_info->name );
18+ const StringName& internal_class_name = internal::ClassUtil::get_internal_class_name (*p_class_info);
19+ String class_name = internal::NamingUtil::get_class_name (internal_class_name);
1820 const NativeClassID class_id = p_env->add_native_class (NativeClassType::GodotObject, class_name);
19- JSB_LOG (VeryVerbose, " expose godot type %s(%d) as %s" , p_class_info-> name , class_id, class_name);
21+ JSB_LOG (VeryVerbose, " expose godot type %s(%d) as %s" , internal_class_name , class_id, class_name);
2022
2123 // construct type template
2224 {
2325
2426 impl::ClassBuilder class_builder = ObjectTemplate::create (p_env, class_id);
2527
2628 // NOTE all singleton object will overwrite the class itself in 'godot' module, so we need make all things defined on PrototypeTemplate.
27- const bool is_singleton_class = Engine::get_singleton ()->has_singleton (p_class_info-> name );
29+ const bool is_singleton_class = Engine::get_singleton ()->has_singleton (internal_class_name );
2830 auto static_builder = is_singleton_class ? class_builder.Instance () : class_builder.Static ();
2931
3032#if JSB_EXCLUDE_GETSET_METHODS
@@ -85,14 +87,14 @@ namespace jsb
8587 }
8688 }
8789
88- if (p_class_info-> name == jsb_string_name (Object))
90+ if (internal_class_name == jsb_string_name (Object))
8991 {
9092 // class: special methods
9193 class_builder.Instance ().Method (jsb_literal (free), _godot_object_free);
9294 }
9395
9496 // class: signals
95- for (const KeyValue<StringName, MethodInfo> & pair : p_class_info-> signal_map )
97+ for (auto & pair : internal::ClassUtil::get_class_signal_map (* p_class_info) )
9698 {
9799 v8::HandleScope handle_scope_for_signal (isolate);
98100 String signal_name = internal::NamingUtil::get_member_name (pair.key );
@@ -103,23 +105,21 @@ namespace jsb
103105 HashSet<StringName> enum_consts;
104106
105107 // class: enum (nested in class)
106- for (const KeyValue<StringName, ClassDB::ClassInfo::EnumInfo>& pair : p_class_info->enum_map )
107- {
108+ internal::ClassUtil::for_class_enums (*p_class_info, [&](const StringName& enum_name, const internal::ClassEnumInfo& enum_info) {
108109 v8::HandleScope handle_scope_for_enum (isolate);
109- impl::ClassBuilder::EnumDeclaration enumeration = static_builder.Enum (internal::NamingUtil::get_enum_name (pair.key ));
110- for (const StringName& enum_value_name : pair.value .constants )
111- {
112- const String& js_enum_name = internal::NamingUtil::get_enum_value_name (enum_value_name);
110+ impl::ClassBuilder::EnumDeclaration enumeration = static_builder.Enum (internal::NamingUtil::get_enum_name (enum_name));
111+
112+ const internal::ClassConstantMap& enum_map = internal::ClassUtil::get_class_enum_constants (*p_class_info, enum_name);
113+ internal::ClassUtil::for_enum_internal_names (enum_info, [&](const StringName& internal_name) {
114+ const String& js_enum_name = internal::NamingUtil::get_enum_value_name (internal_name);
113115 jsb_not_implemented (js_enum_name.contains (" ." ), " hierarchically nested definition is currently not supported" );
114- const auto & const_it = p_class_info->constant_map .find (enum_value_name);
115- jsb_check (const_it);
116- enumeration.Value (js_enum_name, const_it->value );
117- enum_consts.insert (enum_value_name);
118- }
119- }
116+ enumeration.Value (js_enum_name, enum_map[internal_name]);
117+ enum_consts.insert (internal_name);
118+ });
119+ });
120120
121121 // class: constants
122- for (const KeyValue<StringName, int64_t >& pair : p_class_info-> constant_map )
122+ for (const KeyValue<StringName, int64_t >& pair : internal::ClassUtil::get_class_constant_map (* p_class_info) )
123123 {
124124 if (enum_consts.has (pair.key )) continue ;
125125 const String& js_const_name = (String) internal::NamingUtil::get_constant_name (pair.key );
@@ -138,7 +138,7 @@ namespace jsb
138138 // It's safe to expect that the base class is fully built,
139139 // because single inheritance is used in Godot (which means a reflect_bind class will only be accessed until it's fully built).
140140 class_builder.Inherit (super_class_info->clazz );
141- JSB_LOG (VeryVerbose, " %s (%d) extends %s (%d)" , p_class_info-> name , class_id, p_class_info-> inherits_ptr -> name , super_class_id);
141+ JSB_LOG (VeryVerbose, " %s (%d) extends %s (%d)" , internal_class_name , class_id, internal::ClassUtil::get_class_super_type_internal_name (* p_class_info) , super_class_id);
142142 }
143143
144144 // preparation for return
@@ -147,8 +147,8 @@ namespace jsb
147147
148148 class_info->clazz = class_builder.Build ();
149149 jsb_check (!class_info->clazz .IsEmpty ());
150- jsb_check (class_info->name == internal::NamingUtil::get_class_name (p_class_info-> name ));
151- JSB_LOG (VeryVerbose, " build class info %s (%d) exposed as %s, addr: %s" , p_class_info-> name , class_id, class_info->name , class_info.ptr ());
150+ jsb_check (class_info->name == internal::NamingUtil::get_class_name (internal_class_name ));
151+ JSB_LOG (VeryVerbose, " build class info %s (%d) exposed as %s, addr: %s" , internal_class_name , class_id, class_info->name , class_info.ptr ());
152152 if (r_class_id) *r_class_id = class_id;
153153 return class_info;
154154 }
0 commit comments