Skip to content

Commit 34a0377

Browse files
committed
feat: add insert_name filter for improved type formatting
1 parent 0b3a4d0 commit 34a0377

4 files changed

Lines changed: 41 additions & 6 deletions

File tree

src/dwarf2cpp/cli.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from tqdm import tqdm
77

88
from ._dwarf import DWARFContext
9-
from .filters import do_ns_actions, do_ns_chain
9+
from .filters import do_insert_name, do_ns_actions, do_ns_chain
1010
from .post_process import cleanup
1111
from .visitor import Visitor
1212

@@ -34,6 +34,7 @@ def main(path: Path, base_dir: str, output_path: Path | None):
3434
env = Environment(loader=FileSystemLoader(template_dir), keep_trailing_newline=True)
3535
env.filters["ns_chain"] = do_ns_chain
3636
env.filters["ns_actions"] = do_ns_actions
37+
env.filters["insert_name"] = do_insert_name
3738

3839
for rel_path, file in (pbar := tqdm(visitor.files)):
3940
result = env.get_template("file.jinja").render(file=file)

src/dwarf2cpp/filters.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import functools
2+
import re
3+
14
from .models import Namespace
25

36

@@ -25,3 +28,37 @@ def do_ns_actions(prev: list[Namespace], curr: list[Namespace]):
2528
actions.append({"kind": "open", "namespace": n})
2629

2730
return actions
31+
32+
33+
@functools.cache
34+
def do_insert_name(tp: str, name: str):
35+
"""Insert `name` into the C++ declarator described by `tp`."""
36+
t = tp.strip()
37+
38+
if not name:
39+
return t
40+
41+
# Arrays: BASE [N][M]...
42+
m = re.match(r"^(?P<base>.+?)(?P<arrays>(?:\s*\[[^\]]*\]\s*)+)$", t)
43+
if m:
44+
base = m.group("base").strip()
45+
arrays = m.group("arrays").strip()
46+
return f"{base} {name}{arrays}"
47+
48+
# Plain C-style function pointer: RET (* )(ARGS...)
49+
m = re.match(r"^(?P<ret>.+?)\s*\(\s*\*\s*\)\s*\((?P<args>.*)\)$", t)
50+
if m:
51+
ret = m.group("ret").strip()
52+
args = m.group("args").strip()
53+
return f"{ret} (*{name})({args})"
54+
55+
# # Member function pointer: RET (Class::*)(ARGS...) [cv/ref qualifiers]
56+
# m = re.match(r'^(?P<ret>.+?)\s*\(\s*(?P<cls>.+::\*)\s*\)\s*(?P<rest>.*)$', t)
57+
# if m:
58+
# ret = m.group('ret').strip()
59+
# cls_ptr = m.group('cls').strip() # e.g. Bedrock::JSONObject::Node::*
60+
# rest = m.group('rest').strip() # e.g. (bool) const
61+
# return f"{ret} ({cls_ptr}{name}){(' ' + rest) if rest and not rest.startswith('(') else rest}"
62+
63+
# Fallback: just a normal "type name"
64+
return f"{t} {name}"
Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
{%- set parts = obj.type.split('[', maxsplit=1) -%}
2-
{%- set type = parts[0] -%}
3-
{%- set array = ('[{}'.format(parts[1]) if parts|length > 1 else '') -%}
41
{{- "alignas({}) ".format(obj.alignment) if obj.alignment -}}
5-
{{ type }} {{ obj.name }}{{ array }}
2+
{{ obj.type | insert_name(obj.name) }}
63
{{- " : {}".format(obj.bit_size) if obj.bit_size is not none -}}
74
{{- " = {}".format(obj.default_value) if obj.default_value is not none -}}

src/dwarf2cpp/templates/function.jinja

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
{%- for parameter in obj.parameters -%}
99
{%- if parameter.name != "this" -%}
1010
{%- if parameter.kind.value == "positional" -%}
11-
{{ parameter.type }}{{ " " ~ parameter.name if parameter.name }}
11+
{{ parameter.type | insert_name(parameter.name) }}
1212
{%- elif parameter.kind.value == "variadic" -%}
1313
...
1414
{%- endif -%}

0 commit comments

Comments
 (0)