refactor: MIR Builder Phase 1 - モジュール分割準備完了
【Phase 1完了内容】 - src/mir/builder/ ディレクトリ構造作成 - MirBuilder コア機能を core.rs に分離(8関数実装済み) - 責務別モジュール準備(expressions/statements/control_flow/box_handlers) - ビルド確認: 新構造でコンパイル正常完了 【技術詳細】 - MirBuilder本体 + emit_instruction/emit_type_check等コア機能 - プレースホルダー実装でビルド安全性確保 - CURRENT_TASK.md更新(Phase 1完了状況記録) - 49関数/1547行の段階的分割準備 【次のPhase】 - Phase 2: 実際の関数移動(expressions.rs最優先) - 慎重アプローチ: デッドコード削除は後回し 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
18
src/mir/builder/box_handlers.rs
Normal file
18
src/mir/builder/box_handlers.rs
Normal file
@ -0,0 +1,18 @@
|
||||
/*!
|
||||
* MIR Builder Box Handlers - Box-related AST node conversion
|
||||
*
|
||||
* Handles conversion of Box-related AST nodes (new expressions, box declarations) to MIR instructions
|
||||
*/
|
||||
|
||||
use super::*;
|
||||
use crate::ast::ASTNode;
|
||||
|
||||
// TODO: This module will contain box-related builder methods
|
||||
// Currently keeping as placeholder to maintain compilation
|
||||
|
||||
impl MirBuilder {
|
||||
// Placeholder - actual implementation will be moved from builder.rs in Phase 2
|
||||
pub(super) fn build_box_placeholder(&mut self, _ast: ASTNode) -> Result<ValueId, String> {
|
||||
Err("Box handling not yet implemented in modular structure".to_string())
|
||||
}
|
||||
}
|
||||
18
src/mir/builder/control_flow.rs
Normal file
18
src/mir/builder/control_flow.rs
Normal file
@ -0,0 +1,18 @@
|
||||
/*!
|
||||
* MIR Builder Control Flow - Control flow AST node conversion
|
||||
*
|
||||
* Handles conversion of control flow AST nodes (if, loop, try-catch) to MIR instructions
|
||||
*/
|
||||
|
||||
use super::*;
|
||||
use crate::ast::ASTNode;
|
||||
|
||||
// TODO: This module will contain control flow-related builder methods
|
||||
// Currently keeping as placeholder to maintain compilation
|
||||
|
||||
impl MirBuilder {
|
||||
// Placeholder - actual implementation will be moved from builder.rs in Phase 2
|
||||
pub(super) fn build_control_flow_placeholder(&mut self, _ast: ASTNode) -> Result<ValueId, String> {
|
||||
Err("Control flow building not yet implemented in modular structure".to_string())
|
||||
}
|
||||
}
|
||||
192
src/mir/builder/core.rs
Normal file
192
src/mir/builder/core.rs
Normal file
@ -0,0 +1,192 @@
|
||||
/*!
|
||||
* MIR Builder Core - Core builder functionality
|
||||
*
|
||||
* Contains the MirBuilder struct and core instruction emission functionality
|
||||
*/
|
||||
|
||||
use super::*;
|
||||
use crate::ast::ASTNode;
|
||||
use std::collections::HashMap;
|
||||
use std::collections::HashSet;
|
||||
|
||||
pub fn builder_debug_enabled() -> bool {
|
||||
std::env::var("NYASH_BUILDER_DEBUG").is_ok()
|
||||
}
|
||||
|
||||
pub fn builder_debug_log(msg: &str) {
|
||||
if builder_debug_enabled() {
|
||||
eprintln!("[BUILDER] {}", msg);
|
||||
}
|
||||
}
|
||||
|
||||
/// MIR builder for converting AST to SSA form
|
||||
pub struct MirBuilder {
|
||||
/// Current module being built
|
||||
pub(super) current_module: Option<MirModule>,
|
||||
|
||||
/// Current function being built
|
||||
pub(super) current_function: Option<MirFunction>,
|
||||
|
||||
/// Current basic block being built
|
||||
pub(super) current_block: Option<BasicBlockId>,
|
||||
|
||||
/// Value ID generator
|
||||
pub(super) value_gen: ValueIdGenerator,
|
||||
|
||||
/// Basic block ID generator
|
||||
pub(super) block_gen: BasicBlockIdGenerator,
|
||||
|
||||
/// Variable name to ValueId mapping (for SSA conversion)
|
||||
pub(super) variable_map: HashMap<String, ValueId>,
|
||||
|
||||
/// Pending phi functions to be inserted
|
||||
#[allow(dead_code)]
|
||||
pub(super) pending_phis: Vec<(BasicBlockId, ValueId, String)>,
|
||||
|
||||
/// Origin tracking for simple optimizations (e.g., object.method after new)
|
||||
pub(super) value_origins: HashMap<ValueId, String>,
|
||||
}
|
||||
|
||||
impl MirBuilder {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
current_module: None,
|
||||
current_function: None,
|
||||
current_block: None,
|
||||
value_gen: ValueIdGenerator::new(),
|
||||
block_gen: BasicBlockIdGenerator::new(),
|
||||
variable_map: HashMap::new(),
|
||||
pending_phis: Vec::new(),
|
||||
value_origins: HashMap::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn emit_type_check(&mut self, value: ValueId, expected_type: String) -> Result<ValueId, String> {
|
||||
let target_value = self.value_gen.next_value_id();
|
||||
|
||||
let instruction = MirInstruction::TypeOp {
|
||||
dst: target_value,
|
||||
operation: super::TypeOpKind::Check,
|
||||
operand: value,
|
||||
type_info: expected_type,
|
||||
effects: EffectMask::new(Effect::ReadOnly),
|
||||
};
|
||||
|
||||
self.emit_instruction(instruction)?;
|
||||
Ok(target_value)
|
||||
}
|
||||
|
||||
pub(super) fn emit_cast(&mut self, value: ValueId, target_type: super::MirType) -> Result<ValueId, String> {
|
||||
let target_value = self.value_gen.next_value_id();
|
||||
|
||||
let instruction = MirInstruction::TypeOp {
|
||||
dst: target_value,
|
||||
operation: super::TypeOpKind::Cast,
|
||||
operand: value,
|
||||
type_info: format!("{:?}", target_type),
|
||||
effects: EffectMask::new(Effect::ReadOnly),
|
||||
};
|
||||
|
||||
self.emit_instruction(instruction)?;
|
||||
Ok(target_value)
|
||||
}
|
||||
|
||||
pub(super) fn emit_weak_new(&mut self, box_val: ValueId) -> Result<ValueId, String> {
|
||||
let weak_ref = self.value_gen.next_value_id();
|
||||
|
||||
let instruction = MirInstruction::WeakNew {
|
||||
dst: weak_ref,
|
||||
source: box_val,
|
||||
effects: EffectMask::new(Effect::Pure),
|
||||
};
|
||||
|
||||
self.emit_instruction(instruction)?;
|
||||
Ok(weak_ref)
|
||||
}
|
||||
|
||||
pub(super) fn emit_weak_load(&mut self, weak_ref: ValueId) -> Result<ValueId, String> {
|
||||
let loaded_value = self.value_gen.next_value_id();
|
||||
|
||||
let instruction = MirInstruction::WeakLoad {
|
||||
dst: loaded_value,
|
||||
weak_ref,
|
||||
effects: EffectMask::new(Effect::ReadOnly),
|
||||
};
|
||||
|
||||
self.emit_instruction(instruction)?;
|
||||
Ok(loaded_value)
|
||||
}
|
||||
|
||||
pub(super) fn emit_barrier_read(&mut self, ptr: ValueId) -> Result<(), String> {
|
||||
let instruction = MirInstruction::BarrierRead {
|
||||
ptr,
|
||||
effects: EffectMask::new(Effect::SideEffect),
|
||||
};
|
||||
|
||||
self.emit_instruction(instruction)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(super) fn emit_barrier_write(&mut self, ptr: ValueId) -> Result<(), String> {
|
||||
let instruction = MirInstruction::BarrierWrite {
|
||||
ptr,
|
||||
effects: EffectMask::new(Effect::SideEffect),
|
||||
};
|
||||
|
||||
self.emit_instruction(instruction)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(super) fn emit_instruction(&mut self, instruction: MirInstruction) -> Result<(), String> {
|
||||
// Ensure we have a current function to emit into
|
||||
if self.current_function.is_none() {
|
||||
return Err("Cannot emit instruction without current function".to_string());
|
||||
}
|
||||
|
||||
// Ensure we have a current block to emit into
|
||||
if self.current_block.is_none() {
|
||||
return Err("Cannot emit instruction without current block".to_string());
|
||||
}
|
||||
|
||||
let current_block_id = self.current_block.unwrap();
|
||||
|
||||
// Get a mutable reference to the current function
|
||||
let current_function = self.current_function.as_mut().unwrap();
|
||||
|
||||
// Ensure the block exists
|
||||
self.ensure_block_exists(current_block_id)?;
|
||||
|
||||
// Add instruction to current block
|
||||
if let Some(block) = current_function.basic_blocks.get_mut(¤t_block_id) {
|
||||
block.instructions.push(instruction);
|
||||
} else {
|
||||
return Err(format!("Block {:?} not found in current function", current_block_id));
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(super) fn ensure_block_exists(&mut self, block_id: BasicBlockId) -> Result<(), String> {
|
||||
let current_function = self.current_function.as_mut()
|
||||
.ok_or("No current function")?;
|
||||
|
||||
if !current_function.basic_blocks.contains_key(&block_id) {
|
||||
current_function.basic_blocks.insert(block_id, BasicBlock {
|
||||
id: block_id,
|
||||
instructions: Vec::new(),
|
||||
});
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(super) fn start_new_block(&mut self, block_id: BasicBlockId) -> Result<(), String> {
|
||||
// Ensure the block exists in the current function
|
||||
self.ensure_block_exists(block_id)?;
|
||||
|
||||
// Set as current block
|
||||
self.current_block = Some(block_id);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
18
src/mir/builder/expressions.rs
Normal file
18
src/mir/builder/expressions.rs
Normal file
@ -0,0 +1,18 @@
|
||||
/*!
|
||||
* MIR Builder Expressions - Expression AST node conversion
|
||||
*
|
||||
* Handles conversion of expression AST nodes to MIR instructions
|
||||
*/
|
||||
|
||||
use super::*;
|
||||
use crate::ast::{ASTNode, LiteralValue, BinaryOperator};
|
||||
|
||||
// TODO: This module will contain expression-related builder methods
|
||||
// Currently keeping as placeholder to maintain compilation
|
||||
|
||||
impl MirBuilder {
|
||||
// Placeholder - actual implementation will be moved from builder.rs in Phase 2
|
||||
pub(super) fn build_expression_placeholder(&mut self, _ast: ASTNode) -> Result<ValueId, String> {
|
||||
Err("Expression building not yet implemented in modular structure".to_string())
|
||||
}
|
||||
}
|
||||
27
src/mir/builder/mod.rs
Normal file
27
src/mir/builder/mod.rs
Normal file
@ -0,0 +1,27 @@
|
||||
/*!
|
||||
* MIR Builder Module - Modular AST to MIR conversion
|
||||
*
|
||||
* This module contains the refactored MIR builder split into focused sub-modules:
|
||||
*
|
||||
* - `core`: Core builder functionality and instruction emission
|
||||
* - `expressions`: Expression AST node conversion
|
||||
* - `statements`: Statement AST node conversion
|
||||
* - `control_flow`: Control flow constructs (if, loop, try-catch)
|
||||
* - `box_handlers`: Box-related operations (new, declarations)
|
||||
*/
|
||||
|
||||
pub mod core;
|
||||
pub mod expressions;
|
||||
pub mod statements;
|
||||
pub mod control_flow;
|
||||
pub mod box_handlers;
|
||||
|
||||
// Re-export the main builder struct and key functionality
|
||||
pub use self::core::MirBuilder;
|
||||
|
||||
// Re-export commonly used types from the parent module
|
||||
pub use super::{
|
||||
MirInstruction, BasicBlock, BasicBlockId, MirFunction, MirModule,
|
||||
FunctionSignature, ValueId, ConstValue, BinaryOp, UnaryOp, CompareOp,
|
||||
MirType, EffectMask, Effect, BasicBlockIdGenerator, ValueIdGenerator
|
||||
};
|
||||
18
src/mir/builder/statements.rs
Normal file
18
src/mir/builder/statements.rs
Normal file
@ -0,0 +1,18 @@
|
||||
/*!
|
||||
* MIR Builder Statements - Statement AST node conversion
|
||||
*
|
||||
* Handles conversion of statement AST nodes to MIR instructions
|
||||
*/
|
||||
|
||||
use super::*;
|
||||
use crate::ast::ASTNode;
|
||||
|
||||
// TODO: This module will contain statement-related builder methods
|
||||
// Currently keeping as placeholder to maintain compilation
|
||||
|
||||
impl MirBuilder {
|
||||
// Placeholder - actual implementation will be moved from builder.rs in Phase 2
|
||||
pub(super) fn build_statement_placeholder(&mut self, _ast: ASTNode) -> Result<ValueId, String> {
|
||||
Err("Statement building not yet implemented in modular structure".to_string())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user