use tree_sitter::Node;
pub(super) fn declared_idents<'tree>(node: Node<'tree>, _src: &[u8]) -> Vec<Node<'tree>> {
let mut out = Vec::new();
match node.kind() {
"short_var_declaration" | "range_clause" | "receive_statement" => {
if let Some(left) = node.child_by_field_name("left") {
left_idents(left, &mut out);
}
}
"var_spec" | "const_spec" => {
let mut cursor = node.walk();
for name in node.children_by_field_name("name", &mut cursor) {
if name.kind() == "identifier" {
out.push(name);
}
}
}
"parameter_declaration" | "variadic_parameter_declaration" => {
if let Some(name) = node.child_by_field_name("name")
&& name.kind() == "identifier"
{
out.push(name);
}
}
"type_switch_statement" => {
if let Some(alias) = node.child_by_field_name("alias") {
left_idents(alias, &mut out);
}
}
"import_spec" => {
if let Some(name) = node.child_by_field_name("name")
&& name.kind() == "package_identifier"
{
out.push(name);
}
}
_ => {}
}
out
}
fn left_idents<'tree>(node: Node<'tree>, out: &mut Vec<Node<'tree>>) {
let mut cursor = node.walk();
for child in node.children(&mut cursor) {
if child.kind() == "identifier" {
out.push(child);
}
}
}
pub(super) fn is_reference(node: Node<'_>) -> bool {
let Some(parent) = node.parent() else {
return true;
};
if parent.kind() == "literal_element"
&& let Some(grandparent) = parent.parent()
&& grandparent.kind() == "keyed_element"
&& grandparent
.child_by_field_name("key")
.is_some_and(|key| key.id() == parent.id())
{
return false;
}
true
}