lib-ruby-parser 3.0.11

Ruby parser
Documentation
use lib_ruby_parser_nodes::template::*;

const TEMPLATE: &str = "// This file is auto-generated by {{ helper generated-by }}

use crate::nodes::InnerNode;
use crate::nodes::*;
use crate::Loc;
use crate::Bytes;
crate::use_native_or_external!(Ptr);
crate::use_native_or_external!(List);
crate::use_native_or_external!(Maybe);
crate::use_native_or_external!(StringPtr);

/// Generic combination of all known nodes.
#[allow(missing_docs)]
#[derive(Debug, Clone, PartialEq)]
#[repr(C)]
pub enum Node {
{{ each node }}<dnl>
    {{ helper node-camelcase-name }}({{ helper node-camelcase-name }}),
{{ end }}<dnl>
}

impl Node {
    pub(crate) fn inner_ref(&self) -> &dyn InnerNode {
        match &self {
{{ each node }}<dnl>
            Node::{{ helper node-camelcase-name }}(inner) => inner,
{{ end }}<dnl>
        }
    }

    // new_<node> FNs
{{ each node }}<dnl>
    /// Constructs `Node::{{ helper node-camelcase-name }}` variant
    pub(crate) fn new_{{ helper node-lower-name }}({{ each node-field }}{{ helper node-field-rust-field-name }}: {{ helper node-field-rust-field-type }}, {{ end }}) -> Self {
        Self::{{ helper node-camelcase-name }}({{ helper node-camelcase-name }} { {{ each node-field }}{{ helper node-field-rust-field-name }}, {{ end }} })
    }
{{ end }}<dnl>

    // is_<node> FNs
{{ each node }}<dnl>
    /// Returns true if `self` is `Node::{{ helper node-camelcase-name }}`
    pub fn is_{{ helper node-lower-name }}(&self) -> bool {
        matches!(self, Self::{{ helper node-camelcase-name }}(_))
    }
{{ end }}<dnl>

    // as_<node> FNs
{{ each node }}<dnl>
    /// Casts `&Node` to `Option<&nodes::{{ helper node-camelcase-name }}>`
    pub fn as_{{ helper node-lower-name }}(&self) -> Option<&{{ helper node-camelcase-name }}> {
        if let Self::{{ helper node-camelcase-name }}(inner) = self {
            Some(inner)
        } else {
            None
        }
    }
{{ end }}<dnl>

    // as_<node>_mut FNs
{{ each node }}<dnl>
    /// Casts `&Node` to `Option<&mut nodes::{{ helper node-camelcase-name }}>`
    #[allow(non_snake_case)]
    pub fn as_{{ helper node-lower-name }}_mut(&mut self) -> Option<&mut {{ helper node-camelcase-name }}> {
        if let Self::{{ helper node-camelcase-name }}(inner) = self {
            Some(inner)
        } else {
            None
        }
    }
{{ end }}<dnl>

    // into_<node> FNs
{{ each node }}<dnl>
    /// Casts `self` to `nodes::{{ helper node-camelcase-name }}`, panics if variant doesn't match
    pub fn into_{{ helper node-lower-name }}(self) -> {{ helper node-camelcase-name }} {
        if let Self::{{ helper node-camelcase-name }}(inner) = self {
            inner
        } else {
            panic!(\"bug: expected type {{ helper node-camelcase-name }}, got {:?}\", self)
        }
    }
{{ end }}<dnl>
}
";

pub(crate) fn codegen() {
    let template = TemplateRoot::new(TEMPLATE).unwrap();
    let fns = crate::codegen::fns::default_fns!();

    let contents = template.render(ALL_DATA, &fns);
    std::fs::write("src/nodes/node_enum/native.rs", contents).unwrap();
}