refactor: Quick Win cleanup - 102 lines deleted, zero regressions
Completed three high-efficiency refactoring tasks: ## Task 1: Pattern1Context deletion (40 lines) - Removed deprecated Pattern1Context struct from simple_while_minimal.rs - Removed context parameter from lowering pipeline - Simplified API surface (one less unused type) - Files: simple_while_minimal.rs, pattern1_minimal.rs, loop_to_join.rs ## Task 2: #[allow(dead_code)] cleanup (62 lines) - Deleted new_with_outputs() from inline_boundary.rs (truly dead, deprecated) - Deleted extract_type_hint() from generic_type_resolver.rs (future placeholder) - Removed 3 incorrect annotations (code IS actually used) - Added clear comments for future-work items ## Task 3: Test organization (0 lines, +26 doc lines) - Added 4-section navigation to loop_scope_shape/tests.rs - Improved test discoverability (17 tests → organized by module) - Low-risk organization improvement - Easy path for future per-module test file splitting ## Summary - Total deletion: 102 net lines - Files modified: 9 - Build status: ✅ Clean (0 errors, 0 warnings) - Test status: ✅ 21/21 PASS - Regressions: 0 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -35,15 +35,14 @@ impl MirBuilder {
|
||||
/// # Phase 188-Impl-2: Host Variable Integration
|
||||
///
|
||||
/// Extracts the loop variable from the host function (e.g., `i` from `i < 3`)
|
||||
/// and passes it to the Pattern 1 lowerer along with a ValueId allocator.
|
||||
/// and creates a JoinInlineBoundary for mapping between host and JoinIR ValueIds.
|
||||
///
|
||||
/// # Pipeline
|
||||
/// 1. Extract loop variable name from condition
|
||||
/// 2. Look up ValueId in host variable_map
|
||||
/// 3. Create Pattern1Context with host variable + allocator
|
||||
/// 4. Call simple_while_minimal::lower_simple_while_minimal() → JoinModule
|
||||
/// 5. convert_join_module_to_mir_with_meta() → MirModule
|
||||
/// 6. Merge MIR blocks into current_function
|
||||
/// 3. Call simple_while_minimal::lower_simple_while_minimal() → JoinModule
|
||||
/// 4. convert_join_module_to_mir_with_meta() → MirModule
|
||||
/// 5. Merge MIR blocks into current_function
|
||||
pub(in crate::mir::builder) fn cf_loop_pattern1_minimal(
|
||||
&mut self,
|
||||
condition: &ASTNode,
|
||||
@ -51,9 +50,7 @@ impl MirBuilder {
|
||||
_func_name: &str,
|
||||
debug: bool,
|
||||
) -> Result<Option<ValueId>, String> {
|
||||
use crate::mir::join_ir::lowering::simple_while_minimal::{
|
||||
lower_simple_while_minimal, Pattern1Context,
|
||||
};
|
||||
use crate::mir::join_ir::lowering::simple_while_minimal::lower_simple_while_minimal;
|
||||
use crate::mir::BasicBlockId;
|
||||
use std::collections::{BTreeMap, BTreeSet};
|
||||
|
||||
@ -89,16 +86,8 @@ impl MirBuilder {
|
||||
variable_definitions: BTreeMap::new(),
|
||||
};
|
||||
|
||||
// Phase 188-Impl-2: Create Pattern1Context with host variable + allocator
|
||||
// Clone value_gen to move into closure
|
||||
let mut value_gen_clone = self.value_gen.clone();
|
||||
let ctx = Pattern1Context {
|
||||
loop_var: loop_var_id,
|
||||
value_allocator: Box::new(move || value_gen_clone.next()),
|
||||
};
|
||||
|
||||
// Call Pattern 1 lowerer with host context
|
||||
let join_module = match lower_simple_while_minimal(scope, Some(ctx)) {
|
||||
// Call Pattern 1 lowerer
|
||||
let join_module = match lower_simple_while_minimal(scope) {
|
||||
Some(module) => module,
|
||||
None => {
|
||||
// Phase 195: Use unified trace
|
||||
|
||||
@ -115,32 +115,9 @@ impl GenericTypeResolver {
|
||||
None
|
||||
}
|
||||
|
||||
/// PHI の type_hint から型を抽出(将来拡張用)
|
||||
///
|
||||
/// # Phase 66 現在
|
||||
///
|
||||
/// P3-C メソッドは JoinIR で type_hint を設定しないため、
|
||||
/// この関数は現在使用されない。
|
||||
///
|
||||
/// # Phase 67+ 拡張
|
||||
///
|
||||
/// 型変数システム導入後、ArrayBox<T>.get() の T を
|
||||
/// type_hint として伝播する際に使用。
|
||||
#[allow(dead_code)]
|
||||
pub fn extract_type_hint(function: &MirFunction, ret_val: ValueId) -> Option<MirType> {
|
||||
function
|
||||
.blocks
|
||||
.values()
|
||||
.flat_map(|bb| &bb.instructions)
|
||||
.find_map(|inst| {
|
||||
if let MirInstruction::Phi { dst, type_hint, .. } = inst {
|
||||
if *dst == ret_val {
|
||||
return type_hint.clone();
|
||||
}
|
||||
}
|
||||
None
|
||||
})
|
||||
}
|
||||
// NOTE: extract_type_hint() method was removed as dead code.
|
||||
// It was intended for Phase 67+ type variable system (ArrayBox<T>.get() type hints).
|
||||
// If needed in the future, reintroduce from git history.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
||||
@ -24,7 +24,6 @@ use super::if_phi_context::IfPhiContext;
|
||||
pub struct IfMergeLowerer {
|
||||
debug_level: u8,
|
||||
// Phase 61-1: If-in-loop context (None = Pure If)
|
||||
#[allow(dead_code)]
|
||||
context: Option<IfPhiContext>,
|
||||
}
|
||||
|
||||
|
||||
@ -20,7 +20,6 @@ use super::if_phi_context::IfPhiContext;
|
||||
pub struct IfSelectLowerer {
|
||||
debug_level: u8,
|
||||
// Phase 61-1: If-in-loop context (None = Pure If)
|
||||
#[allow(dead_code)]
|
||||
context: Option<IfPhiContext>,
|
||||
}
|
||||
|
||||
|
||||
@ -271,42 +271,6 @@ impl JoinInlineBoundary {
|
||||
///
|
||||
/// **DEPRECATED**: Use `new_with_exit_bindings` instead.
|
||||
///
|
||||
/// Reserved for future loop patterns that produce values.
|
||||
///
|
||||
/// 現在の実装では Multi-carrier 出力には未対応だが、型としては複数出力を
|
||||
/// 表現できるようにしておく。
|
||||
#[allow(dead_code)]
|
||||
#[deprecated(since = "Phase 190", note = "Use new_with_exit_bindings instead")]
|
||||
pub fn new_with_outputs(
|
||||
join_inputs: Vec<ValueId>,
|
||||
host_inputs: Vec<ValueId>,
|
||||
join_outputs: Vec<ValueId>,
|
||||
host_outputs: Vec<ValueId>,
|
||||
) -> Self {
|
||||
assert_eq!(
|
||||
join_inputs.len(),
|
||||
host_inputs.len(),
|
||||
"join_inputs and host_inputs must have same length"
|
||||
);
|
||||
assert_eq!(
|
||||
join_outputs.len(),
|
||||
host_outputs.len(),
|
||||
"join_outputs and host_outputs must have same length"
|
||||
);
|
||||
Self {
|
||||
join_inputs,
|
||||
host_inputs,
|
||||
join_outputs,
|
||||
#[allow(deprecated)]
|
||||
host_outputs,
|
||||
exit_bindings: vec![],
|
||||
#[allow(deprecated)]
|
||||
condition_inputs: vec![], // Phase 171: Default to empty (deprecated)
|
||||
condition_bindings: vec![], // Phase 171-fix: Default to empty
|
||||
expr_result: None, // Phase 33-14
|
||||
loop_var_name: None, // Phase 33-16
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a new boundary with inputs and **host outputs only** (DEPRECATED)
|
||||
///
|
||||
|
||||
@ -57,7 +57,6 @@ impl LoopVarClass {
|
||||
/// - `progress_carrier`: 進捗チェック用(将来の Verifier で使用予定)
|
||||
/// - `variable_definitions`: definition blocks collected from LoopFormIntake snapshots
|
||||
#[derive(Debug, Clone)]
|
||||
#[allow(dead_code)] // Block IDs and progress_carrier are reserved for future F-3/F-4 use
|
||||
pub(crate) struct LoopScopeShape {
|
||||
pub header: BasicBlockId,
|
||||
pub body: BasicBlockId,
|
||||
|
||||
@ -1,9 +1,25 @@
|
||||
//! Tests for loop_scope_shape module
|
||||
//!
|
||||
//! ## Test Organization
|
||||
//!
|
||||
//! This file contains tests for multiple components:
|
||||
//! - **LoopScopeShape tests** (shape.rs): from_loop_form, needs_phi, block_ids, ordering
|
||||
//! - **CaseAContext tests** (case_a*.rs): validation, lowering shape
|
||||
//! - **Variable classification tests** (structural.rs): classify, phi consistency
|
||||
//! - **Variable definitions tests** (builder.rs): availability, inspector
|
||||
//!
|
||||
//! Future work: Consider splitting into per-module test files for better organization.
|
||||
|
||||
use super::shape::LoopVarClass;
|
||||
use super::*;
|
||||
use crate::mir::join_ir::lowering::loop_form_intake::LoopFormIntake;
|
||||
use crate::mir::{BasicBlockId, MirQuery, ValueId};
|
||||
use std::collections::{BTreeMap, BTreeSet};
|
||||
|
||||
// ============================================================================
|
||||
// Test Fixtures (shared across all tests)
|
||||
// ============================================================================
|
||||
|
||||
fn make_dummy_loop_form() -> crate::mir::loop_form::LoopForm {
|
||||
crate::mir::loop_form::LoopForm {
|
||||
preheader: BasicBlockId::new(1),
|
||||
@ -47,6 +63,10 @@ impl MirQuery for EmptyQuery {
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// LoopScopeShape Tests (shape.rs)
|
||||
// ============================================================================
|
||||
|
||||
#[test]
|
||||
fn test_from_loop_form_basic() {
|
||||
let loop_form = make_dummy_loop_form();
|
||||
@ -118,6 +138,10 @@ fn test_ordered_accessors() {
|
||||
assert!(carriers.contains(&"i".to_string()));
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// CaseAContext Tests (case_a*.rs)
|
||||
// ============================================================================
|
||||
|
||||
/// CaseAContext::from_scope で header == exit のとき None を返すテスト
|
||||
#[test]
|
||||
fn test_from_scope_validation_header_eq_exit() {
|
||||
@ -234,6 +258,10 @@ fn test_needs_phi_consistency() {
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Variable Classification Tests (structural.rs)
|
||||
// ============================================================================
|
||||
|
||||
/// classify() メソッドのテスト
|
||||
#[test]
|
||||
fn test_classify_method() {
|
||||
@ -326,6 +354,10 @@ fn test_get_exit_live() {
|
||||
assert!(exit_live.contains("i"));
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Variable Definitions Tests (builder.rs)
|
||||
// ============================================================================
|
||||
|
||||
/// Phase 48-4: is_available_in_all() API テスト(空の variable_definitions)
|
||||
#[test]
|
||||
fn test_is_available_in_all_phase48_4() {
|
||||
|
||||
@ -360,8 +360,8 @@ impl LoopToJoinLowerer {
|
||||
eprintln!("[LoopToJoinLowerer] Trying Pattern 1 lowering for {:?}", name);
|
||||
}
|
||||
|
||||
// Phase 188-Impl-2: Use standalone mode (None context) for backward compatibility
|
||||
if let Some(result) = super::simple_while_minimal::lower_simple_while_minimal(scope.clone(), None) {
|
||||
// Phase 188-Impl-3: Call lowerer directly (context removed)
|
||||
if let Some(result) = super::simple_while_minimal::lower_simple_while_minimal(scope.clone()) {
|
||||
if self.debug {
|
||||
eprintln!("[LoopToJoinLowerer] Pattern 1 lowering succeeded for {:?}", name);
|
||||
}
|
||||
|
||||
@ -49,31 +49,6 @@ use crate::mir::join_ir::{
|
||||
};
|
||||
use crate::mir::ValueId;
|
||||
|
||||
/// Context passed from the host function to the Pattern 1 lowerer
|
||||
///
|
||||
/// Phase 188-Impl-3: This context is now REMOVED - JoinIR uses only local ValueIds
|
||||
/// The boundary mapping is handled by JoinInlineBoundary instead.
|
||||
#[deprecated(since = "188-Impl-3", note = "Use JoinInlineBoundary for host integration")]
|
||||
pub struct Pattern1Context {
|
||||
/// DEPRECATED: This is no longer used, JoinIR uses local ValueIds
|
||||
pub loop_var: ValueId,
|
||||
/// DEPRECATED: JoinIR allocates sequentially from 0
|
||||
pub value_allocator: Box<dyn FnMut() -> ValueId>,
|
||||
}
|
||||
|
||||
impl Pattern1Context {
|
||||
/// Create a standalone context with hardcoded ValueIds (for backward compatibility)
|
||||
pub fn standalone() -> Self {
|
||||
let mut counter = 0u32;
|
||||
Self {
|
||||
loop_var: ValueId(counter),
|
||||
value_allocator: Box::new(move || {
|
||||
counter += 1;
|
||||
ValueId(counter)
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Lower Pattern 1 (Simple While Loop) to JoinIR
|
||||
///
|
||||
@ -98,7 +73,6 @@ impl Pattern1Context {
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `_scope` - LoopScopeShape (reserved for future generic implementation)
|
||||
/// * `_ctx` - DEPRECATED: No longer used, kept for backward compatibility
|
||||
///
|
||||
/// # Returns
|
||||
///
|
||||
@ -110,10 +84,7 @@ impl Pattern1Context {
|
||||
/// This function returns a JoinModule with:
|
||||
/// - **Input slot**: ValueId(0) in loop_step function represents the loop variable
|
||||
/// - **Caller responsibility**: Create JoinInlineBoundary to map ValueId(0) to host's loop var
|
||||
pub fn lower_simple_while_minimal(
|
||||
_scope: LoopScopeShape,
|
||||
_ctx: Option<Pattern1Context>,
|
||||
) -> Option<JoinModule> {
|
||||
pub fn lower_simple_while_minimal(_scope: LoopScopeShape) -> Option<JoinModule> {
|
||||
// Phase 188-Impl-3: Use local ValueId allocator (sequential from 0)
|
||||
// JoinIR has NO knowledge of host ValueIds - boundary handled separately
|
||||
let mut value_counter = 0u32;
|
||||
|
||||
Reference in New Issue
Block a user