Skip to content

Commit 2e0242c

Browse files
committed
feat: add class member getter、setter
1 parent 1d7926a commit 2e0242c

File tree

4 files changed

+99
-10
lines changed

4 files changed

+99
-10
lines changed

generator/binder/WrapperClassGenerator.py

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
6570
logger = 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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// @{{class_info.isStruct and "struct" or "class"}}: {{class_info.name}}
2+
{% for member_info in class_info.members | only_public %}
3+
{% if not member_info.isStatic %}
4+
/**
5+
* @getter {{member_info.name}}
6+
* @definition {{ replace_str(member_info.definition, ".+endstone\/", "") }}
7+
*/
8+
Local<Value> Getter_for_{{member_info.name}}();
9+
10+
{% if not member_info.isConst %}
11+
/**
12+
* @setter {{member_info.name}}
13+
* @definition {{ replace_str(member_info.definition, ".+endstone\/", "") }}
14+
*/
15+
void Setter_for_{{member_info.name}}(Local<Value> value);
16+
{% endif %}
17+
18+
{% endif %}
19+
{% endfor %}

generator/binder/templates/class_method.h.j2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// @{{class_info.isStruct and "struct" or "class"}}: {{class_info.name}}
22
{% for method_info in class_info.methods | only_public | remove_operator | unique_by_field("name") %}
33
{% if not is_constructor(class_info, method_info) and not is_destructor(class_info, method_info)%}
4-
{% if can_render(gened_method, method_info.name) %}
4+
{% if can_render(gened_method, method_info.name) and not method_info.isStatic %}
55
/**
66
* @definition {{ replace_str(method_info.definition, ".+endstone\/", "") }}
77
* @parameters num: {{method_info.parameters | length}}

generator/binder/templates/class_wrapper.h.j2

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,20 @@ public:
3535

3636
[[nodiscard]] SafeResourceHolder<{{class_full_name}}>& getResourceHolder() { return mResourceHolder; }
3737

38-
public:
39-
{% for rendered_template in rendered_scriptx_method %}
40-
{{ rendered_template }}
38+
{% if not is_empty(rendered_scriptx_member) %}
39+
public: /* auto generated member getter、setter */
40+
{% for rendered_member in rendered_scriptx_member %}
41+
{{ rendered_member }}
42+
{% endfor %}
43+
{% endif %}
44+
45+
{% if not is_empty(rendered_scriptx_method) %}
46+
public: /* auto generated methods */
47+
{% for rendered_method in rendered_scriptx_method %}
48+
{{ rendered_method }}
4149
{% endfor %}
50+
{% endif %}
51+
4252
public:
4353
static ClassDefine<{{get_wrapper_class_name(class_info)}}> builder;
4454
};

0 commit comments

Comments
 (0)