use crate::syntax::readers::go;
use crate::syntax::SyntaxReader;
#[allow(clippy::too_many_lines, reason = "one match arm per mapped node type")]
#[must_use]
pub fn dispatcher(node_type: &str) -> Option<SyntaxReader> {
match node_type {
"argument_list" => Some(go::argument_list::reader),
"assignment_statement" | "short_var_declaration" => Some(go::assignment_statement::reader),
"binary_expression" => Some(go::binary_expression::reader),
"block" => Some(go::block::reader),
"break_statement" => Some(go::break_statement::reader),
"call_expression" => Some(go::call_expression::reader),
"comment" => Some(go::comment::reader),
"composite_literal" => Some(go::composite_literal::reader),
"const_declaration" | "var_declaration" => Some(go::var_declaration::reader),
"default_case" | "expression_case" | "type_case" => Some(go::switch_section::reader),
"defer" | "go" => Some(go::reserved_words::reader),
"defer_statement" | "expression_statement" | "go_statement" => {
Some(go::expression_statement::reader)
}
"expression_list" => Some(go::expression_list::reader),
"false" | "true" => Some(go::boolean_literal::reader),
"field_declaration" => Some(go::field_declaration::reader),
"for_statement" => Some(go::for_statement::reader),
"func_literal" | "function_declaration" | "method_declaration" => {
Some(go::function_declaration::reader)
}
"blank_identifier" | "field_identifier" | "identifier" | "package_identifier"
| "type_identifier" => Some(go::identifier::reader),
"if_statement" => Some(go::if_statement::reader),
"inc_statement" | "dec_statement" => Some(go::inc_statement::reader),
"import_spec" => Some(go::import_declaration::reader),
"index_expression" => Some(go::index_expression::reader),
"int_literal" => Some(go::int_literal::reader),
"interface_type" => Some(go::interface_type::reader),
"interpreted_string_literal" | "raw_string_literal" | "rune_literal" => {
Some(go::string_literal::reader)
}
"keyed_element" => Some(go::pair::reader),
"literal_value" => Some(go::literal_value::reader),
"method_elem" => Some(go::method_elem::reader),
"nil" => Some(go::nil::reader),
"package_clause" => Some(go::package_clause::reader),
"parameter_declaration" => Some(go::parameter_declaration::reader),
"parameter_list" => Some(go::parameter_list::reader),
"qualified_type" => Some(go::qualified_type::reader),
"return_statement" => Some(go::return_statement::reader),
"selector_expression" => Some(go::selector_expression::reader),
"slice_expression" => Some(go::slice_expression::reader),
"source_file" => Some(go::source_file::reader),
"struct_type" => Some(go::struct_type::reader),
"switch" => Some(go::switch_body::reader),
"expression_switch_statement" | "type_switch_statement" => {
Some(go::switch_statement::reader)
}
"type_conversion_expression" => Some(go::type_conversion::reader),
"type_declaration" => Some(go::type_declaration::reader),
"type_elem" => Some(go::type_elem::reader),
"type_spec" | "type_alias" => Some(go::type_spec::reader),
"type_assertion_expression" | "unary_expression" => Some(go::unary_expression::reader),
"variadic_argument" => Some(go::spread_element::reader),
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::dispatcher;
#[test]
#[allow(clippy::too_many_lines, reason = "one assert per mapped node type")]
fn maps_the_implemented_go_node_types() {
assert!(dispatcher("source_file").is_some());
assert!(dispatcher("true").is_some());
assert!(dispatcher("false").is_some());
assert!(dispatcher("interpreted_string_literal").is_some());
assert!(dispatcher("raw_string_literal").is_some());
assert!(dispatcher("rune_literal").is_some());
assert!(dispatcher("int_literal").is_some());
assert!(dispatcher("composite_literal").is_some());
assert!(dispatcher("literal_value").is_some());
assert!(dispatcher("argument_list").is_some());
assert!(dispatcher("assignment_statement").is_some());
assert!(dispatcher("short_var_declaration").is_some());
assert!(dispatcher("binary_expression").is_some());
assert!(dispatcher("block").is_some());
assert!(dispatcher("break_statement").is_some());
assert!(dispatcher("call_expression").is_some());
assert!(dispatcher("comment").is_some());
assert!(dispatcher("nil").is_some());
assert!(dispatcher("identifier").is_some());
assert!(dispatcher("defer").is_some());
assert!(dispatcher("defer_statement").is_some());
assert!(dispatcher("go").is_some());
assert!(dispatcher("go_statement").is_some());
assert!(dispatcher("unary_expression").is_some());
assert!(dispatcher("type_conversion_expression").is_some());
assert!(dispatcher("qualified_type").is_some());
assert!(dispatcher("selector_expression").is_some());
assert!(dispatcher("slice_expression").is_some());
assert!(dispatcher("index_expression").is_some());
assert!(dispatcher("keyed_element").is_some());
assert!(dispatcher("expression_statement").is_some());
assert!(dispatcher("variadic_argument").is_some());
assert!(dispatcher("expression_list").is_some());
assert!(dispatcher("package_clause").is_some());
assert!(dispatcher("parameter_declaration").is_some());
assert!(dispatcher("parameter_list").is_some());
assert!(dispatcher("return_statement").is_some());
assert!(dispatcher("var_declaration").is_some());
assert!(dispatcher("const_declaration").is_some());
assert!(dispatcher("import_spec").is_some());
assert!(dispatcher("type_declaration").is_some());
assert!(dispatcher("struct_type").is_some());
assert!(dispatcher("interface_type").is_some());
assert!(dispatcher("method_elem").is_some());
assert!(dispatcher("type_elem").is_some());
assert!(dispatcher("field_declaration").is_some());
assert!(dispatcher("type_spec").is_some());
assert!(dispatcher("type_alias").is_some());
assert!(dispatcher("function_declaration").is_some());
assert!(dispatcher("method_declaration").is_some());
assert!(dispatcher("func_literal").is_some());
assert!(dispatcher("if_statement").is_some());
assert!(dispatcher("inc_statement").is_some());
assert!(dispatcher("dec_statement").is_some());
assert!(dispatcher("for_statement").is_some());
assert!(dispatcher("expression_case").is_some());
assert!(dispatcher("default_case").is_some());
assert!(dispatcher("type_case").is_some());
assert!(dispatcher("switch").is_some());
assert!(dispatcher("expression_switch_statement").is_some());
assert!(dispatcher("type_switch_statement").is_some());
}
#[test]
fn unmapped_node_types_have_no_reader() {
assert!(dispatcher("float_literal").is_none());
assert!(dispatcher("").is_none());
}
}