use tree_sitter::Node;
use crate::core::signatures::{compact_params, Signature};
use super::super::helpers::{clean_return_type, field_text, has_keyword_child, strip_parens};
pub(crate) fn py_or_c_function(
node: &Node,
name: &str,
ext: &str,
start_col: usize,
source: &[u8],
) -> Signature {
match ext {
"py" | "php" => {
let params = field_text(node, "parameters", source);
let ret = field_text(node, "return_type", source);
let is_method = start_col > 0;
Signature {
kind: if is_method { "method" } else { "fn" },
name: name.to_string(),
params: compact_params(&strip_parens(¶ms)),
return_type: clean_return_type(&ret),
is_async: has_keyword_child(node, "async"),
is_exported: !name.starts_with('_'),
indent: if is_method { 2 } else { 0 },
..Signature::no_span()
}
}
_ => {
let ret = field_text(node, "type", source);
let params = node
.child_by_field_name("declarator")
.and_then(|d| d.child_by_field_name("parameters"))
.and_then(|p| p.utf8_text(source).ok())
.unwrap_or("")
.to_string();
Signature {
kind: "fn",
name: name.to_string(),
params: compact_params(&strip_parens(¶ms)),
return_type: ret.trim().to_string(),
is_async: false,
is_exported: true,
indent: 0,
..Signature::no_span()
}
}
}
}