@@ -16,14 +16,18 @@ def _getCompound(self, kind, name):
1616
1717 def classDoc (self , name ):
1818 el = self ._getCompound ("class" , name )
19- return ClassDoc (path .join (self .directory , el .get ("refid" ) + ".xml" ))
19+ return ClassDoc (
20+ path .join (self .directory , el .get ("refid" ) + ".xml" ), self .directory
21+ )
2022
2123
2224class ClassDoc :
23- def __init__ (self , filename ):
25+ def __init__ (self , filename , directory = None ):
2426 self .tree = etree .parse (filename )
2527 self .compound = self .tree .find ("./compounddef" )
2628 self .classname = self .compound .find ("compoundname" ).text .strip ()
29+ self .directory = directory if directory else path .dirname (filename )
30+ self ._group_cache = {}
2731
2832 @staticmethod
2933 def _getDoc (el ):
@@ -33,30 +37,91 @@ def _getDoc(el):
3337 detailed = d .text .strip () if d .text else ""
3438 return brief , detailed
3539
40+ def _getMemberFromGroup (self , memberDefKind , name ):
41+ """Look for memberdef in a group file via member refid."""
42+ members = self .compound .xpath (
43+ "sectiondef/member[@kind='" + memberDefKind + "' and name='" + name + "']"
44+ )
45+ if not members :
46+ return None
47+ member = members [0 ]
48+ refid = member .get ("refid" )
49+ if not refid :
50+ return None
51+ group_id = refid .rsplit ("_1" , 1 )[0 ]
52+ if group_id not in self ._group_cache :
53+ group_file = path .join (self .directory , group_id + ".xml" )
54+ if not path .isfile (group_file ):
55+ return None
56+ self ._group_cache [group_id ] = etree .parse (group_file )
57+ group_tree = self ._group_cache [group_id ]
58+ memberdefs = group_tree .xpath (
59+ "//memberdef[@id='" + refid + "' and @kind='" + memberDefKind + "']"
60+ )
61+ if memberdefs :
62+ return memberdefs [0 ]
63+ return None
64+
65+ def _getMemberFromInherited (self , memberDefKind , name ):
66+ """Look for memberdef in base class XML via listofallmembers member refid."""
67+ members = self .compound .xpath ("listofallmembers/member[name='" + name + "']" )
68+ if not members :
69+ return None
70+ member = members [0 ]
71+ refid = member .get ("refid" )
72+ if not refid :
73+ return None
74+ # Extract base class file from refid
75+ # e.g., "classhpp_1_1pinocchio_1_1AbstractDevice_1a312..." -> "classhpp_1_1pinocchio_1_1AbstractDevice"
76+ parts = refid .rsplit ("_1" , 1 )
77+ if len (parts ) < 2 :
78+ return None
79+ base_class_id = parts [0 ]
80+ base_class_file = path .join (self .directory , base_class_id + ".xml" )
81+ if not path .isfile (base_class_file ):
82+ return None
83+ if base_class_id not in self ._group_cache :
84+ self ._group_cache [base_class_id ] = etree .parse (base_class_file )
85+ base_tree = self ._group_cache [base_class_id ]
86+ memberdefs = base_tree .xpath (
87+ "//memberdef[@id='" + refid + "' and @kind='" + memberDefKind + "']"
88+ )
89+ if memberdefs :
90+ return memberdefs [0 ]
91+ return None
92+
3693 def _getMember (self , sectionKind , memberDefKind , name ):
37- # return self.compound.xpath ("sectiondef[@kind='" + sectionKind
38- try :
39- return self .compound .xpath (
40- "sectiondef[re:test(@kind,'"
41- + sectionKind
42- + "')]/memberdef[@kind='"
43- + memberDefKind
44- + "' and name='"
45- + name
46- + "']" ,
47- namespaces = {"re" : "http://exslt.org/regular-expressions" },
48- )[0 ]
49- except IndexError as e :
50- msg = (
51- "Error: Could not find member ("
52- + sectionKind
53- + ") "
54- + name
55- + " of class "
56- + self .classname
57- )
58- print (msg + "\n " + str (e ), file = sys .stderr )
59- raise IndexError (msg )
94+ # First try to find memberdef directly in class XML
95+ results = self .compound .xpath (
96+ "sectiondef[re:test(@kind,'"
97+ + sectionKind
98+ + "')]/memberdef[@kind='"
99+ + memberDefKind
100+ + "' and name='"
101+ + name
102+ + "']" ,
103+ namespaces = {"re" : "http://exslt.org/regular-expressions" },
104+ )
105+ if results :
106+ return results [0 ]
107+ # Fall back to looking in group files (for @ingroup documented classes)
108+ memberdef = self ._getMemberFromGroup (memberDefKind , name )
109+ if memberdef is not None :
110+ return memberdef
111+ # Fall back to looking in base class files (for inherited methods)
112+ memberdef = self ._getMemberFromInherited (memberDefKind , name )
113+ if memberdef is not None :
114+ return memberdef
115+ msg = (
116+ "Error: Could not find member ("
117+ + sectionKind
118+ + ") "
119+ + name
120+ + " of class "
121+ + self .classname
122+ )
123+ print (msg , file = sys .stderr )
124+ raise IndexError (msg )
60125
61126 def getClassDoc (self ):
62127 return self ._getDoc (self .compound )
0 commit comments