lemonlang 0.0.3

an experimental, modern, purely safe, programming language.
use crate::ir;

use super::Disassembler;

impl<'ir> Disassembler<'ir> {
	pub fn disassemble_function(&self, function: &'ir ir::Function, output: &mut String) {
		if function.is_extern_function() {
			output.push_str("extern ");
		}
		output.push_str(&format!("fn {}(", function.name));
		for (arg_position, arg) in function.args.iter().enumerate() {
			self.disassemble_args(arg, output);
			if arg_position != function.args.len() - 1 {
				output.push_str(", ");
			}
		}

		if function.is_variadic_args() {
			output.push_str("...");
		}

		let type_name = self.type_store.get_display_ir_type(function.ret);
		output.push_str(&format!("): {} = ", type_name));

		if function.is_extern_function() {
			output.push_str("{}\n");
			return;
		}

		output.push_str("{\n");
		for (index, block) in function.blocks.iter().enumerate() {
			self.disassemble_block(block, output);
			if index != function.blocks.len() - 1 {
				output.push('\n');
			}
		}

		output.push_str("\n}\n");
	}

	pub fn disassemble_args(&self, bind: &'ir ir::IrBasicValue, output: &mut String) {
		output.push_str(bind.value.as_str());
		let type_name = self.type_store.get_display_ir_type(bind.get_type());
		output.push_str(&format!(": {}", type_name));
	}
}