Skip to content

Commit 185a5b8

Browse files
committed
Preserve class-local member definition order
`handle_class()` now uses a new _iter_class_members() helper that: - preserves class_.__dict__ definition order for class-local members - then appends additional visible members from dir()/getattr() so inherited or lazily exposed names are still seen That makes nested class discovery consistent with the earlier module-level fix, so the printer's topological sort now gets real definition order as its stable tie-break for nested classes too.
1 parent 49e181e commit 185a5b8

1 file changed

Lines changed: 19 additions & 1 deletion

File tree

pybind11_stubgen/parser/mixins/parse.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class ParserDispatchMixin(IParser):
4848
def handle_class(self, path: QualifiedName, class_: type) -> Class | None:
4949
base_classes = class_.__bases__
5050
result = Class(name=path[-1], bases=self.handle_bases(path, base_classes))
51-
for name, member in inspect.getmembers(class_):
51+
for name, member in self._iter_class_members(class_):
5252
obj = self.handle_class_member(
5353
QualifiedName([*path, Identifier(name)]), class_, member
5454
)
@@ -70,6 +70,24 @@ def handle_class(self, path: QualifiedName, class_: type) -> Class | None:
7070
raise AssertionError()
7171
return result
7272

73+
def _iter_class_members(self, class_: type):
74+
seen: set[str] = set()
75+
76+
# Preserve definition order for class-local members, then append any
77+
# inherited or lazily exposed members that are visible via dir/getattr.
78+
for name, member in class_.__dict__.items():
79+
seen.add(name)
80+
yield name, member
81+
82+
for name in dir(class_):
83+
if name in seen:
84+
continue
85+
try:
86+
member = getattr(class_, name)
87+
except AttributeError:
88+
continue
89+
yield name, member
90+
7391
def handle_class_member(
7492
self, path: QualifiedName, class_: type, member: Any
7593
) -> Docstring | Alias | Class | list[Method] | Field | Property | None:

0 commit comments

Comments
 (0)