Skip to content

Commit d029458

Browse files
committed
fix(visitor): skip hidden objects during visitation and model generation
1 parent 758043f commit d029458

2 files changed

Lines changed: 22 additions & 3 deletions

File tree

src/dwarf2cpp/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class Object:
1212

1313
name: str
1414
parent: "Namespace | Object | None" = field(default=None, compare=False)
15-
is_implicit: bool = False
15+
is_hidden: bool = False # should this object be hidden from the final result?
1616
is_declaration: bool = False
1717
access: AccessAttribute | None = None
1818
template: "Template | None" = field(default=None, compare=False)

src/dwarf2cpp/visitor.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,9 @@ def _handle_unit(self, die: DWARFDie):
173173

174174
self.visit(child)
175175
if obj := self._get(child):
176+
if obj.is_hidden:
177+
continue
178+
176179
if template := obj.template:
177180
if template := self._register_template(decl_file, decl_line, template):
178181
self._add(decl_file, decl_line, template)
@@ -244,6 +247,9 @@ def visit_namespace(self, die: DWARFDie) -> None:
244247
if member := self._get(child):
245248
assert member.parent is None or member.parent.name == namespace.name, "Already has a parent"
246249
member.parent = namespace
250+
if member.is_hidden:
251+
continue
252+
247253
if template := member.template:
248254
template.parent = namespace
249255
if template := self._register_template(decl_file, decl_line, template):
@@ -358,6 +364,9 @@ def visit_subprogram(self, die: DWARFDie) -> None:
358364
if not die.find("DW_AT_decl_file") or not die.find("DW_AT_decl_line"):
359365
if not die.find("DW_AT_specification"):
360366
return
367+
is_hidden = True # hide from the final output if it's a forward declaration
368+
else:
369+
is_hidden = False
361370

362371
if not die.short_name:
363372
return
@@ -402,7 +411,12 @@ def visit_subprogram(self, die: DWARFDie) -> None:
402411
# lambda function definitions - skip them
403412
return
404413

405-
function = Function(name=name, returns=declaration.returns, is_const=declaration.is_const)
414+
function = Function(
415+
name=name,
416+
returns=declaration.returns,
417+
is_const=declaration.is_const,
418+
is_hidden=is_hidden,
419+
)
406420
else:
407421
if die.find("DW_AT_artificial") is not None:
408422
return
@@ -422,7 +436,12 @@ def visit_subprogram(self, die: DWARFDie) -> None:
422436
returns = None
423437

424438
# for member function, we set is_static to True by default, unless we find the `this` pointer later
425-
function = Function(name=name, returns=returns, is_static=is_member_function)
439+
function = Function(
440+
name=name,
441+
returns=returns,
442+
is_static=is_member_function,
443+
is_hidden=is_hidden,
444+
)
426445

427446
for attribute in die.attributes:
428447
if attribute.name in {

0 commit comments

Comments
 (0)