refactor(joinir): Phase 286 P2.6 コード品質 - pattern3.rs 重複削除 + 共通化
## 変更内容 - pattern3.rs: has_return_statement() 削除 → common_helpers 使用 - pattern3.rs: has_control_flow_statement() → has_forbidden_control_flow_for_pattern3() にリネーム - Pattern3 固有のセマンティクス(ネスト if 禁止)を明確化 - common_helpers.rs: find_if_else_statement() 追加 - PoC subset コメント付き(最初の if-else だけ取る) ## 効果 - 重複コード削除: -34 lines net - 関数名で意図を明確化(Pattern3 固有の制約) - common_helpers の再利用性向上 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -200,6 +200,27 @@ pub(crate) fn has_if_else_statement(body: &[ASTNode]) -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
/// Phase 286: Find first if-else statement in loop body (non-recursive)
|
||||
///
|
||||
/// Returns first if statement with else branch in the given body.
|
||||
/// This is a PoC subset helper - only finds the FIRST if-else (Pattern3 constraint).
|
||||
///
|
||||
/// # Returns
|
||||
/// - Some(&ASTNode) if an if-else statement found
|
||||
/// - None if no if-else statement found
|
||||
///
|
||||
/// # Note
|
||||
/// This is intentionally non-recursive (top-level only) for Pattern3 extraction.
|
||||
/// Pattern3 allows multiple if statements - this just finds the first if-else.
|
||||
pub(crate) fn find_if_else_statement(body: &[ASTNode]) -> Option<&ASTNode> {
|
||||
for stmt in body {
|
||||
if matches!(stmt, ASTNode::If { else_body: Some(_), .. }) {
|
||||
return Some(stmt); // Found first if-else
|
||||
}
|
||||
}
|
||||
None // No if-else found
|
||||
}
|
||||
|
||||
/// ============================================================
|
||||
/// Group 3: Condition Validation (比較演算検証)
|
||||
/// ============================================================
|
||||
|
||||
@ -44,7 +44,7 @@ pub(crate) fn extract_loop_with_if_phi_parts(
|
||||
};
|
||||
|
||||
// Phase 2: Find if-else statement
|
||||
let if_stmt = match find_if_else_statement(body) {
|
||||
let if_stmt = match super::common_helpers::find_if_else_statement(body) {
|
||||
Some(stmt) => stmt,
|
||||
None => return Ok(None), // No if-else → Not Pattern3
|
||||
};
|
||||
@ -56,12 +56,13 @@ pub(crate) fn extract_loop_with_if_phi_parts(
|
||||
};
|
||||
|
||||
// Phase 4a: Check for return (early Ok(None) - let other patterns try)
|
||||
if has_return_statement(body) {
|
||||
if super::common_helpers::has_return_statement(body) {
|
||||
return Ok(None); // Has return → delegate to other patterns
|
||||
}
|
||||
|
||||
// Phase 4b: Validate NO control flow (break/continue/nested-if only)
|
||||
if has_control_flow_statement(body) {
|
||||
// Phase 4b: Validate NO forbidden control flow (break/continue/nested-if only)
|
||||
// Pattern3 allows ONE if-else (the PHI pattern) but rejects nested if
|
||||
if has_forbidden_control_flow_for_pattern3(body) {
|
||||
return Ok(None); // Has break/continue/nested-if → Not Pattern3
|
||||
}
|
||||
|
||||
@ -76,19 +77,6 @@ pub(crate) fn extract_loop_with_if_phi_parts(
|
||||
}))
|
||||
}
|
||||
|
||||
/// Find if-else statement in loop body
|
||||
///
|
||||
/// Returns first if statement with else branch.
|
||||
/// Allows multiple if statements - just finds the first if-else.
|
||||
fn find_if_else_statement(body: &[ASTNode]) -> Option<&ASTNode> {
|
||||
for stmt in body {
|
||||
if matches!(stmt, ASTNode::If { else_body: Some(_), .. }) {
|
||||
return Some(stmt); // Found first if-else
|
||||
}
|
||||
}
|
||||
None // No if-else found
|
||||
}
|
||||
|
||||
/// Extract variables assigned in BOTH then and else branches
|
||||
fn extract_phi_assignments(if_stmt: &ASTNode) -> Option<Vec<String>> {
|
||||
let (then_body, else_body) = match if_stmt {
|
||||
@ -132,50 +120,23 @@ fn extract_assignment_targets(body: &[ASTNode]) -> Vec<String> {
|
||||
targets
|
||||
}
|
||||
|
||||
/// Check for return statements (Pattern3 version)
|
||||
/// Check for forbidden control flow (Pattern3-specific)
|
||||
///
|
||||
/// Return → Ok(None) to let other patterns try.
|
||||
/// This is checked separately before control flow validation.
|
||||
fn has_return_statement(body: &[ASTNode]) -> bool {
|
||||
/// Pattern3 allows ONE if-else (that's the PHI pattern) but rejects:
|
||||
/// - break/continue statements
|
||||
/// - NESTED if statements (if inside then/else branches)
|
||||
///
|
||||
/// Return is checked separately (not forbidden, just delegated to other patterns).
|
||||
fn has_forbidden_control_flow_for_pattern3(body: &[ASTNode]) -> bool {
|
||||
for stmt in body {
|
||||
if has_return_recursive(stmt) {
|
||||
if has_forbidden_control_flow_recursive_p3(stmt) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn has_return_recursive(node: &ASTNode) -> bool {
|
||||
match node {
|
||||
ASTNode::Return { .. } => true,
|
||||
ASTNode::If {
|
||||
then_body,
|
||||
else_body,
|
||||
..
|
||||
} => {
|
||||
then_body.iter().any(has_return_recursive)
|
||||
|| else_body
|
||||
.as_ref()
|
||||
.map_or(false, |b| b.iter().any(has_return_recursive))
|
||||
}
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
/// Check for control flow (Pattern3 version)
|
||||
///
|
||||
/// Pattern3 allows ONE if-else (that's the PHI pattern).
|
||||
/// Reject: break, continue, NESTED if only (return checked separately).
|
||||
fn has_control_flow_statement(body: &[ASTNode]) -> bool {
|
||||
for stmt in body {
|
||||
if has_control_flow_recursive_p3(stmt) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn has_control_flow_recursive_p3(node: &ASTNode) -> bool {
|
||||
fn has_forbidden_control_flow_recursive_p3(node: &ASTNode) -> bool {
|
||||
match node {
|
||||
ASTNode::Break { .. } | ASTNode::Continue { .. } => true,
|
||||
// Return removed - checked separately
|
||||
@ -195,10 +156,10 @@ fn has_control_flow_recursive_p3(node: &ASTNode) -> bool {
|
||||
}
|
||||
|
||||
// Check control flow INSIDE branches
|
||||
then_body.iter().any(has_control_flow_recursive_p3)
|
||||
then_body.iter().any(has_forbidden_control_flow_recursive_p3)
|
||||
|| else_body
|
||||
.as_ref()
|
||||
.map_or(false, |b| b.iter().any(has_control_flow_recursive_p3))
|
||||
.map_or(false, |b| b.iter().any(has_forbidden_control_flow_recursive_p3))
|
||||
}
|
||||
|
||||
_ => false,
|
||||
@ -535,7 +496,7 @@ pub(crate) fn extract_pattern3_plan(
|
||||
let parts = parts.unwrap();
|
||||
|
||||
// Step 2: Extract if-else statement (validated to exist)
|
||||
let if_stmt = find_if_else_statement(body)
|
||||
let if_stmt = super::common_helpers::find_if_else_statement(body)
|
||||
.ok_or_else(|| "Pattern3: if-else statement not found after validation".to_string())?;
|
||||
|
||||
// Step 3: Extract if condition and branch updates
|
||||
|
||||
Reference in New Issue
Block a user