fluidattacks-blends-domain 0.2.0

Blends functional core: pure AST graph to syntax graph (no_std)
Documentation
use crate::syntax::readers::c_sharp;
use crate::syntax::SyntaxReader;

#[must_use]
#[allow(
    clippy::too_many_lines,
    reason = "one match arm per migrated c# node type; grows with the migration"
)]
pub fn dispatcher(node_type: &str) -> Option<SyntaxReader> {
    match node_type {
        "accessor_declaration" => Some(c_sharp::accessor_declaration::reader),
        "anonymous_object_creation_expression" => Some(c_sharp::anonymous_object_creation::reader),
        "argument" | "attribute_argument" => Some(c_sharp::argument::reader),
        "argument_list" | "attribute_argument_list" => Some(c_sharp::argument_list::reader),
        "array_creation_expression" | "implicit_array_creation_expression" => {
            Some(c_sharp::array_creation_expression::reader)
        }
        "arrow_expression_clause" => Some(c_sharp::arrow_expression_clause::reader),
        "assignment_expression" => Some(c_sharp::assignment_expression::reader),
        "attribute" => Some(c_sharp::attribute::reader),
        "attribute_list" => Some(c_sharp::attribute_list::reader),
        "binary_expression" => Some(c_sharp::binary_expression::reader),
        "block" => Some(c_sharp::execution_block::reader),
        "boolean_literal" => Some(c_sharp::boolean_literal::reader),
        "bracketed_argument_list" => Some(c_sharp::bracketed_argument_list::reader),
        "break_statement" => Some(c_sharp::break_statement::reader),
        "cast_expression" => Some(c_sharp::cast_expression::reader),
        "catch_clause" => Some(c_sharp::catch_clause::reader),
        "catch_declaration" => Some(c_sharp::catch_declaration::reader),
        "class_declaration" => Some(c_sharp::class_declaration::reader),
        "character_literal" | "predefined_type" | "string_literal" | "verbatim_string_literal" => {
            Some(c_sharp::string_literal::reader)
        }
        "comment" => Some(c_sharp::comment::reader),
        "compilation_unit" => Some(c_sharp::compilation_unit::reader),
        "conditional_access_expression" => Some(c_sharp::conditional_access_expression::reader),
        "constructor_declaration" => Some(c_sharp::constructor_declaration::reader),
        "continue_statement" => Some(c_sharp::continue_statement::reader),
        "declaration_list" => Some(c_sharp::declaration_block::reader),
        "do_statement" => Some(c_sharp::do_statement::reader),
        "element_access_expression" => Some(c_sharp::element_access_expression::reader),
        "element_binding_expression" => Some(c_sharp::element_binding_expression::reader),
        "expression_statement" => Some(c_sharp::expression_statement::reader),
        "field_declaration" | "variable_declaration" => Some(c_sharp::variable_declaration::reader),
        "file_scoped_namespace_declaration" => {
            Some(c_sharp::file_scoped_namespace_declaration::reader)
        }
        "finally_clause" => Some(c_sharp::finally_clause::reader),
        "for_each_statement" => Some(c_sharp::for_each_statement::reader),
        "for_statement" => Some(c_sharp::for_statement::reader),
        "global_statement" => Some(c_sharp::global_statement::reader),
        "identifier" => Some(c_sharp::identifier::reader),
        "conditional_expression" | "if_statement" => Some(c_sharp::if_statement::reader),
        "implicit_parameter" => Some(c_sharp::implicit_parameter::reader),
        "initializer_expression" => Some(c_sharp::initializer_expression::reader),
        "integer_literal" | "real_literal" => Some(c_sharp::number_literal::reader),
        "interface_declaration" => Some(c_sharp::interface_declaration::reader),
        "interpolated_string_expression" | "interpolation_brace" => {
            Some(c_sharp::interpolated_string_expression::reader)
        }
        "interpolation" => Some(c_sharp::interpolation::reader),
        "invocation_expression" => Some(c_sharp::invocation_expression::reader),
        "lambda_expression" => Some(c_sharp::lambda_expression::reader),
        "local_declaration_statement" => Some(c_sharp::local_declaration_statement::reader),
        "local_function_statement" | "method_declaration" => {
            Some(c_sharp::method_declaration::reader)
        }
        "member_access_expression" => Some(c_sharp::member_access_expression::reader),
        "member_binding_expression" => Some(c_sharp::member_binding_expression::reader),
        "name_equals" => Some(c_sharp::name_equals::reader),
        "namespace_declaration" => Some(c_sharp::namespace_declaration::reader),
        "null_literal" => Some(c_sharp::null_literal::reader),
        "object_creation_expression" => Some(c_sharp::object_creation_expression::reader),
        "parameter" => Some(c_sharp::parameter::reader),
        "implicit_parameter_list" | "parameter_list" => Some(c_sharp::parameter_list::reader),
        "parenthesized_expression" => Some(c_sharp::parenthesized_expression::reader),
        "postfix_unary_expression" => Some(c_sharp::postfix_unary_expression::reader),
        "prefix_unary_expression" => Some(c_sharp::prefix_expression::reader),
        "property_declaration" => Some(c_sharp::property_declaration::reader),
        "return_statement" => Some(c_sharp::return_statement::reader),
        "switch_body" => Some(c_sharp::switch_body::reader),
        "switch_section" => Some(c_sharp::switch_section::reader),
        "switch_statement" => Some(c_sharp::switch_statement::reader),
        "this" => Some(c_sharp::this_node::reader),
        "this_expression" => Some(c_sharp::this_expression::reader),
        "throw_statement" => Some(c_sharp::throw_statement::reader),
        "try_statement" => Some(c_sharp::try_statement::reader),
        "type_of_expression" => Some(c_sharp::type_of_expression::reader),
        "type_parameter_list" => Some(c_sharp::type_parameter_list::reader),
        "unary_expression" => Some(c_sharp::unary_expression::reader),
        "using_directive" => Some(c_sharp::using_global_directive::reader),
        "using_statement" => Some(c_sharp::using_statement::reader),
        "while_statement" => Some(c_sharp::while_statement::reader),
        _ => None,
    }
}

#[cfg(test)]
mod tests {
    use super::dispatcher;

    #[test]
    #[allow(
        clippy::too_many_lines,
        reason = "one assert per migrated c# node type; grows with the migration"
    )]
    fn maps_the_implemented_c_sharp_node_types() {
        assert!(dispatcher("compilation_unit").is_some());
        assert!(dispatcher("block").is_some());
        assert!(dispatcher("declaration_list").is_some());
        assert!(dispatcher("namespace_declaration").is_some());
        assert!(dispatcher("class_declaration").is_some());
        assert!(dispatcher("constructor_declaration").is_some());
        assert!(dispatcher("interface_declaration").is_some());
        assert!(dispatcher("method_declaration").is_some());
        assert!(dispatcher("local_function_statement").is_some());
        assert!(dispatcher("parameter_list").is_some());
        assert!(dispatcher("parameter").is_some());
        assert!(dispatcher("field_declaration").is_some());
        assert!(dispatcher("variable_declaration").is_some());
        assert!(dispatcher("local_declaration_statement").is_some());
        assert!(dispatcher("expression_statement").is_some());
        assert!(dispatcher("binary_expression").is_some());
        assert!(dispatcher("unary_expression").is_some());
        assert!(dispatcher("prefix_unary_expression").is_some());
        assert!(dispatcher("postfix_unary_expression").is_some());
        assert!(dispatcher("parenthesized_expression").is_some());
        assert!(dispatcher("assignment_expression").is_some());
        assert!(dispatcher("member_access_expression").is_some());
        assert!(dispatcher("member_binding_expression").is_some());
        assert!(dispatcher("conditional_access_expression").is_some());
        assert!(dispatcher("cast_expression").is_some());
        assert!(dispatcher("element_access_expression").is_some());
        assert!(dispatcher("name_equals").is_some());
        assert!(dispatcher("return_statement").is_some());
        assert!(dispatcher("throw_statement").is_some());
        assert!(dispatcher("while_statement").is_some());
        assert!(dispatcher("try_statement").is_some());
        assert!(dispatcher("type_of_expression").is_some());
        assert!(dispatcher("type_parameter_list").is_some());
        assert!(dispatcher("catch_clause").is_some());
        assert!(dispatcher("finally_clause").is_some());
        assert!(dispatcher("catch_declaration").is_some());
        assert!(dispatcher("if_statement").is_some());
        assert!(dispatcher("conditional_expression").is_some());
        assert!(dispatcher("for_statement").is_some());
        assert!(dispatcher("for_each_statement").is_some());
        assert!(dispatcher("global_statement").is_some());
        assert!(dispatcher("switch_statement").is_some());
        assert!(dispatcher("switch_body").is_some());
        assert!(dispatcher("switch_section").is_some());
        assert!(dispatcher("do_statement").is_some());
        assert!(dispatcher("break_statement").is_some());
        assert!(dispatcher("continue_statement").is_some());
        assert!(dispatcher("this").is_some());
        assert!(dispatcher("this_expression").is_some());
        assert!(dispatcher("attribute").is_some());
        assert!(dispatcher("object_creation_expression").is_some());
        assert!(dispatcher("using_statement").is_some());
        assert!(dispatcher("using_directive").is_some());
        assert!(dispatcher("argument").is_some());
        assert!(dispatcher("attribute_argument").is_some());
        assert!(dispatcher("argument_list").is_some());
        assert!(dispatcher("bracketed_argument_list").is_some());
        assert!(dispatcher("attribute_argument_list").is_some());
        assert!(dispatcher("attribute_list").is_some());
        assert!(dispatcher("array_creation_expression").is_some());
        assert!(dispatcher("implicit_array_creation_expression").is_some());
        assert!(dispatcher("anonymous_object_creation_expression").is_some());
        assert!(dispatcher("accessor_declaration").is_some());
        assert!(dispatcher("arrow_expression_clause").is_some());
        assert!(dispatcher("element_binding_expression").is_some());
        assert!(dispatcher("implicit_parameter").is_some());
        assert!(dispatcher("initializer_expression").is_some());
        assert!(dispatcher("interpolated_string_expression").is_some());
        assert!(dispatcher("interpolation").is_some());
        assert!(dispatcher("interpolation_brace").is_some());
        assert!(dispatcher("file_scoped_namespace_declaration").is_some());
        assert!(dispatcher("invocation_expression").is_some());
        assert!(dispatcher("lambda_expression").is_some());
        assert!(dispatcher("property_declaration").is_some());
        assert!(dispatcher("identifier").is_some());
        assert!(dispatcher("comment").is_some());
        assert!(dispatcher("integer_literal").is_some());
        assert!(dispatcher("real_literal").is_some());
        assert!(dispatcher("boolean_literal").is_some());
        assert!(dispatcher("null_literal").is_some());
        assert!(dispatcher("string_literal").is_some());
        assert!(dispatcher("verbatim_string_literal").is_some());
        assert!(dispatcher("character_literal").is_some());
        assert!(dispatcher("predefined_type").is_some());
    }

    #[test]
    fn unmapped_node_types_have_no_reader() {
        assert!(dispatcher("qualified_name").is_none());
        assert!(dispatcher("").is_none());
    }
}