157 def _recurse(self, cursor: Cursor):
158 name = ""
159 kind = cursor.kind
160
161 if cursor.location.file is not None:
162 name = cursor.location.file.name
163 if name in self.processed_files or not name.startswith('../..'):
164 return
165 self.files_seen_in_unit.add(name)
166
167 if kind == CursorKind.CLASS_DECL:
168 if not cursor.is_definition():
169 return
170 usr = cursor.get_usr()
171 if usr in self.classes_by_usr:
172 return
173 self.name_stack.
append(cursor.spelling)
174 class_name = '::'.join(self.name_stack)
175 class_info = _ClassInfo(self._format_location(cursor.location))
176 self.info_stack.
append(class_info)
177 self.symbols_index.classes[class_name] = class_info
178 self.classes_by_usr[usr] = class_info
179 elif kind == CursorKind.NAMESPACE:
180 self.name_stack.
append(cursor.spelling)
181 elif kind == CursorKind.FUNCTION_DECL and cursor.is_definition():
182 namespace_prefix = ""
183 if cursor.semantic_parent.kind == CursorKind.NAMESPACE:
184 namespace_prefix = '::'.join(self.name_stack) + (
185 '::' if len(self.name_stack) > 0 else "")
186 function_name = namespace_prefix + cursor.spelling
187 self.symbols_index.functions[function_name] = self._format_location(
188 cursor.location)
189 return
190 elif kind == CursorKind.CXX_METHOD and cursor.is_definition():
191 parent = cursor.semantic_parent
192 if parent.kind == CursorKind.CLASS_DECL:
193 class_info_or_none = self.classes_by_usr.get(parent.get_usr())
194 if class_info_or_none is None:
195 return
196 class_info_or_none.members[
197 cursor.spelling] = self._format_location(cursor.location)
198 return
199 elif kind == CursorKind.VAR_DECL and cursor.is_definition():
200 parent = cursor.semantic_parent
201 if parent.kind == CursorKind.CLASS_DECL:
202 class_info_or_none = self.classes_by_usr.get(parent.get_usr())
203 if class_info_or_none is None:
204 return
205 class_info_or_none.members[
206 cursor.spelling] = self._format_location(cursor.location)
207
208 for child in cursor.get_children():
209 self._recurse(child)
210
211 if kind == CursorKind.NAMESPACE:
212 self.name_stack.
pop()
213 elif kind == CursorKind.CLASS_DECL:
214 self.name_stack.
pop()
215 self.info_stack.
pop()
216
static std::function< void(void)> pop(std::deque< std::function< void(void)> > *list)
static void append(char **dst, size_t *count, const char *src, size_t n)