MCPcopy Create free account
hub / github.com/atomicdotdev/atomic / extract_function_name

Method extract_function_name

atomic-semantic/src/parsers/cpp.rs:281–339  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

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 }

Callers 1

extract_functionMethod · 0.80

Calls 3

kindMethod · 0.45
node_textMethod · 0.45
containsMethod · 0.45

Tested by

no test coverage detected