gobject-ast 0.1.1

AST representation of GObject C code
Documentation
use tree_sitter::Node;

use crate::{
    model::{Argument, CallExpression},
    parser::Parser,
};

impl Parser {
    pub(crate) fn parse_call_expression(
        &self,
        node: Node,
        source: &[u8],
    ) -> Option<CallExpression> {
        let function_node = node.child_by_field_name("function")?;
        let function = self.parse_expression(function_node, source)?;

        let mut arguments = Vec::new();
        if let Some(args_node) = node.child_by_field_name("arguments") {
            let mut cursor = args_node.walk();
            for child in args_node.children(&mut cursor) {
                if child.is_named()
                    && child.kind() != ","
                    && Self::is_expression_node(&child)
                    && let Some(expr) = self.parse_expression(child, source)
                {
                    arguments.push(Argument::Expression(Box::new(expr)));
                }
            }
        }

        Some(CallExpression {
            function: Box::new(function),
            arguments,
            location: self.node_location(node),
        })
    }
}