backyard-generator 0.1.10

Convert AST node back to PHP code.
Documentation
use backyard_nodes::{ cast_node, BodyType, Node, NodeType, NodeWrapper };

use crate::generator::{ Builder, Generator, GeneratorArgument };

use super::{ block::BlockGenerator, identifier::IdentifierGenerator };

pub struct DeclareGenerator;

impl DeclareGenerator {
  pub fn generate<'arena>(
    generator: &mut Generator<'arena, '_>,
    builder: &mut Builder,
    node: &Node<'arena>
  ) {
    let node = cast_node!(Declare, &node.wrapper);
    builder.push("declare");
    let mut arguments = generator.generate_nodes_new(
      &node.arguments,
      &mut GeneratorArgument::for_parameter(&[(NodeType::DeclareArgument, Self::generate_argument)])
    );
    builder.push("(");
    if
      Generator::check_nodes_has_comments(&node.arguments) ||
      2 + builder.last_len() + arguments.total_len_with_separator(" ") > generator.max_length
    {
      arguments.indent();
      builder.extend(arguments);
      builder.new_line();
    } else {
      builder.push(&arguments.print(" "));
    }
    builder.push(")");
    match node.body_type {
      BodyType::Basic => {
        if let Some(n) = &node.body {
          BlockGenerator::generate(generator, builder, n, None);
        }
      }
      BodyType::Short => {
        if let Some(n) = &node.body {
          BlockGenerator::generate(generator, builder, n, Some("enddeclare;"));
        }
      }
      BodyType::Empty => {
        builder.push(";");
      }
    }
  }

  pub fn generate_argument<'arena>(
    generator: &mut Generator<'arena, '_>,
    builder: &mut Builder,
    node: &Node<'arena>
  ) {
    let node = cast_node!(DeclareArgument, &node.wrapper);
    IdentifierGenerator::generate(generator, builder, &node.name);
    builder.push(" = ");
    generator.generate_node(builder, &node.value, &mut GeneratorArgument::default());
  }
}