use bonsai_common::FileId;
use tree_sitter::Tree;
use super::{
collect_kinds, first_identifier_descendant, first_identifier_like_child, node_text, span_of,
GrammarHandler,
};
pub fn extract_decorators(
tree: &Tree,
file: FileId,
src: &[u8],
handler: &GrammarHandler,
) -> Vec<crate::Ref> {
let mut out = Vec::new();
for node in collect_kinds(tree, handler.decorator_kinds) {
let name_node = node
.child_by_field_name("name")
.or_else(|| first_identifier_like_child(&node))
.or_else(|| first_identifier_descendant(node));
let Some(name_node) = name_node else { continue };
let name = node_text(&name_node, src)
.trim_start_matches('@')
.trim()
.to_string();
if name.is_empty() {
continue;
}
out.push(crate::Ref {
span: span_of(file, &node),
name,
kind: crate::RefKind::Decorator,
scope: None,
resolved: None,
});
}
out
}