backyard-generator 0.1.10

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

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

use super::identifier::IdentifierGenerator;

pub struct UseGenerator;

impl UseGenerator {
  pub fn generate<'arena>(
    generator: &mut Generator<'arena, '_>,
    builder: &mut Builder,
    node: &Node<'arena>
  ) {
    let node = cast_node!(Use, &node.wrapper);
    builder.push("use ");

    let mut items = generator.generate_nodes_new(
      &node.items,
      &mut GeneratorArgument::for_parameter(&[(NodeType::UseItem, Self::generate_item)])
    );

    if let Some(name) = &node.name {
      builder.push(&name.to_string());

      builder.push("{");
      if
        Generator::check_nodes_has_comments(&node.items) ||
        1 + builder.last_len() + items.total_len_with_separator(" ") > generator.max_length
      {
        items.indent();
        builder.extend(items);
        builder.new_line();
      } else {
        builder.push(&items.print(" "));
      }
      builder.push("}");
    } else if
      Generator::check_nodes_has_comments(&node.items) ||
      1 + builder.last_len() + items.total_len_with_separator(" ") > generator.max_length
    {
      items.indent();
      builder.extend_first_line(items);
    } else {
      builder.push(&items.print(" "));
    }
  }

  pub fn generate_item<'arena>(
    generator: &mut Generator<'arena, '_>,
    builder: &mut Builder,
    node: &Node<'arena>
  ) {
    let node = cast_node!(UseItem, &node.wrapper);
    if let Some(n) = &node.modifier {
      builder.push(format!("{} ", n).as_str());
    }
    builder.push(&node.name.to_string());

    if let Some(alias) = &node.alias {
      builder.push(" as ");
      IdentifierGenerator::generate(generator, builder, alias);
    }
  }
}