Extract the function name from a declarator node. Returns `(Option , is_scoped_method)`. For `ClassName::method`, returns the full qualified name.
(&self, declarator: &Node, source: &str)
| 279 | /// Returns `(Option<name>, is_scoped_method)`. |
| 280 | /// For `ClassName::method`, returns the full qualified name. |
| 281 | fn extract_function_name(&self, declarator: &Node, source: &str) -> (Option<String>, bool) { |
| 282 | match declarator.kind() { |
| 283 | "function_declarator" => { |
| 284 | // The first child of function_declarator is the name or |
| 285 | // a qualified_identifier / scoped identifier. |
| 286 | if let Some(name_node) = declarator.child(0) { |
| 287 | match name_node.kind() { |
| 288 | "qualified_identifier" | "scoped_identifier" => { |
| 289 | let text = self.node_text(&name_node, source); |
| 290 | (Some(text), true) |
| 291 | } |
| 292 | "field_identifier" | "identifier" | "destructor_name" => { |
| 293 | let text = self.node_text(&name_node, source); |
| 294 | (Some(text), false) |
| 295 | } |
| 296 | "operator_name" => { |
| 297 | let text = self.node_text(&name_node, source); |
| 298 | (Some(text), false) |
| 299 | } |
| 300 | "template_function" => { |
| 301 | // template<> void foo<int>() — extract the inner name |
| 302 | if let Some(inner) = name_node.child(0) { |
| 303 | let text = self.node_text(&inner, source); |
| 304 | let scoped = text.contains("::"); |
| 305 | (Some(text), scoped) |
| 306 | } else { |
| 307 | (None, false) |
| 308 | } |
| 309 | } |
| 310 | _ => { |
| 311 | let text = self.node_text(&name_node, source); |
| 312 | let scoped = text.contains("::"); |
| 313 | (Some(text), scoped) |
| 314 | } |
| 315 | } |
| 316 | } else { |
| 317 | (None, false) |
| 318 | } |
| 319 | } |
| 320 | "reference_declarator" | "pointer_declarator" => { |
| 321 | // e.g., `int &foo()` or `int *foo()` — unwrap to inner declarator |
| 322 | if let Some(inner) = declarator.child(1).or_else(|| declarator.child(0)) { |
| 323 | self.extract_function_name(&inner, source) |
| 324 | } else { |
| 325 | (None, false) |
| 326 | } |
| 327 | } |
| 328 | _ => { |
| 329 | // Try child_by_field_name for other wrapper nodes |
| 330 | if let Some(inner) = declarator.child_by_field_name("declarator") { |
| 331 | self.extract_function_name(&inner, source) |
| 332 | } else { |
| 333 | let text = self.node_text(declarator, source); |
| 334 | let scoped = text.contains("::"); |
| 335 | (Some(text), scoped) |
| 336 | } |
| 337 | } |
| 338 | } |
no test coverage detected