use crate::scope::Scope;
use rnix::{ast::Ident, NixLanguage, SyntaxKind};
use rowan::{api::SyntaxNode, ast::AstNode};
pub fn find(name: &Ident, node: &SyntaxNode<NixLanguage>) -> bool {
if let Some(scope) = Scope::new(node) {
if scope.inherits_from(name) {
return true;
}
for binding in scope.bindings() {
if binding.name.syntax().text() == name.syntax().text() {
return false;
}
}
scope.bodies().any(|node| find(name, &node))
} else if node.kind() == SyntaxKind::NODE_IDENT {
let ident = Ident::cast(node.clone()).unwrap();
ident.syntax().text() == name.syntax().text()
} else if node.kind() == SyntaxKind::NODE_ATTRPATH {
node.children().any(|node| {
(node.kind() == SyntaxKind::NODE_DYNAMIC || node.kind() == SyntaxKind::NODE_STRING)
&& find(name, &node)
})
} else {
node.children().any(|node| find(name, &node))
}
}