rust-code-analysis 0.0.18

Tool to compute and export code metrics
Documentation
use crate::node::Node;

#[allow(dead_code)]
pub fn get_parent<'a>(node: &'a Node<'a>, level: usize) -> Option<Node<'a>> {
    let mut level = level;
    let mut node = *node;
    while level != 0 {
        if let Some(parent) = node.object().parent() {
            node = Node::new(parent);
        } else {
            return None;
        }
        level -= 1;
    }

    Some(node)
}

#[doc(hidden)]
#[macro_use]
macro_rules! has_ancestors {
    ($node:expr, $( $typs:pat )|*, $( $typ:pat ),+) => {{
        let mut res = false;
        loop {
            let mut node = *$node;
            $(
                if let Some(parent) = node.object().parent() {
                    match parent.kind_id().into() {
                        $typ => {
                            node = Node::new(parent);
                        },
                        _ => {
                            break;
                        }
                    }
                } else {
                    break;
                }
            )*
            if let Some(parent) = node.object().parent() {
                match parent.kind_id().into() {
                    $( $typs )|+ => {
                        res = true;
                    },
                    _ => {
                        break;
                    }
                }
            } else {
                break;
            }
            break;
        }
        res
    }};
}

#[doc(hidden)]
#[macro_use]
macro_rules! count_specific_ancestors {
    ($node:expr, $( $typs:pat )|*, $( $stops:pat )|*) => {{
        let mut count = 0;
        let mut node = *$node;
        while let Some(parent) = node.object().parent() {
            match parent.kind_id().into() {
                $( $typs )|* => {
                    if !Self::is_else_if(&Node::new(parent)) {
                        count += 1;
                    }
                },
                $( $stops )|* => break,
                _ => {}
            }
            node = Node::new(parent);
        }
        count
    }};
}