@@ -62,6 +62,11 @@ def jinja2_def_remove_tempate(data: str):
6262 return re .sub (r"<.*?>" , "" , data )
6363
6464
65+ def jinja2_def_is_empty (data ):
66+ # str、List、Dict
67+ return len (data ) == 0
68+
69+
6570logger = create_console_logger (__name__ )
6671
6772
@@ -95,6 +100,7 @@ def __init__(self, ast_dir: str, out_dir: str):
95100 self .env .globals ["get_wrapper_class_name" ] = jinja2_def_get_wrapper_class_name
96101 self .env .globals ["can_render" ] = jinja2_def_can_render
97102 self .env .globals ["remove_template" ] = jinja2_def_remove_tempate
103+ self .env .globals ["is_empty" ] = jinja2_def_is_empty
98104 pass
99105
100106 def load_ast (self , ast_file_path : str ):
@@ -125,11 +131,12 @@ def process_class_method(
125131 while stack :
126132 cur_class_info = stack .pop ()
127133
128- rendered_scriptx_method .append (
129- class_method_template .render (
130- class_info = cur_class_info , gened_method = gened_method
134+ if not jinja2_def_is_empty (cur_class_info .methods ):
135+ rendered_scriptx_method .append (
136+ class_method_template .render (
137+ class_info = cur_class_info , gened_method = gened_method
138+ )
131139 )
132- )
133140
134141 for inheritances in cur_class_info .inheritances :
135142 if inheritances .definition == "" :
@@ -161,7 +168,7 @@ def process_class_method(
161168 if class_info .name == jinja2_def_remove_tempate (
162169 inheritances .name
163170 ):
164- if not class_info .methods :
171+ if class_info .methods == [] :
165172 logger .warning (
166173 f"skip class: { class_info .name } , no methods"
167174 )
@@ -174,7 +181,58 @@ def process_class_member(self, class_info: ClassInfo):
174181 # TODO: 处理类 member
175182 # 静态成员注册 .prototype(Getter)
176183 # 实例成员注册 .instancePrototype(Getter、Setter)
177- pass
184+
185+ class_member_template = self .env .get_template ("class_member.h.j2" )
186+ rendered_getter_setter : List [str ] = []
187+
188+ # 递归处理继承类
189+ stack : List [ClassInfo ] = [class_info ]
190+ while stack :
191+ cur_class_info = stack .pop ()
192+
193+ if not jinja2_def_is_empty (cur_class_info .members ):
194+ rendered_getter_setter .append (
195+ class_member_template .render (class_info = cur_class_info )
196+ )
197+
198+ for inheritances in cur_class_info .inheritances :
199+ if inheritances .definition == "" :
200+ logger .warning (f"skip empty definition class: { inheritances .name } " )
201+ continue
202+ if inheritances .name .startswith ("std::" ):
203+ logger .warning (f"skip std class: { inheritances .name } " )
204+ continue
205+
206+ # 获取继承类所在文件
207+ fixed_file = jinja2_def_replace_str (
208+ jinja2_def_remove_line_and_column (inheritances .definition ),
209+ r".+endstone" ,
210+ self .ast_dir , # 替换基路径
211+ )
212+ fixed_file = FileUtils .replace_file_extension (fixed_file , ".json" )
213+
214+ # 加载继承类所在的ast文件
215+ inherit_class_info = self .load_ast (fixed_file )
216+ if inherit_class_info is None :
217+ logger .warning (f"skip not found class: { inheritances .name } " )
218+ continue
219+
220+ # 查找继承类
221+ for namespace in inherit_class_info .namespaces :
222+ if namespace .name != "endstone" :
223+ continue
224+ for class_info in namespace .classes :
225+ if class_info .name == jinja2_def_remove_tempate (
226+ inheritances .name
227+ ):
228+ if class_info .members == []:
229+ logger .warning (
230+ f"skip class: { class_info .name } , no methods"
231+ )
232+ continue
233+ stack .append (class_info ) # 加入继承类
234+ break
235+ return rendered_getter_setter
178236
179237 def process_class (self , class_info : ClassInfo , base_namespace : str ):
180238 class_wrapper_template = self .env .get_template ("class_wrapper.h.j2" )
@@ -194,13 +252,15 @@ def process_class(self, class_info: ClassInfo, base_namespace: str):
194252
195253 # 渲染方法
196254 rendered_class_method = self .process_class_method (cur_class_info )
255+ rendered_scriptx_member = self .process_class_member (cur_class_info )
197256
198257 # 生成类包装
199258 rendered_class_wrapper .append (
200259 class_wrapper_template .render (
201260 class_info = cur_class_info ,
202261 class_full_name = full_class_name ,
203262 rendered_scriptx_method = rendered_class_method ,
263+ rendered_scriptx_member = rendered_scriptx_member ,
204264 )
205265 )
206266
0 commit comments