phase29an(p5): classify if-without-else as if2 skeleton

This commit is contained in:
2025-12-29 18:40:16 +09:00
parent d35343087a
commit 1319cbfb27

View File

@ -21,10 +21,7 @@ pub(in crate::mir::builder) fn try_extract_skeleton_facts_from_stmt(
) -> Result<Option<SkeletonFacts>, Freeze> {
let kind = match stmt {
ASTNode::Loop { .. } => SkeletonKind::Loop,
ASTNode::If {
else_body: Some(_),
..
} => SkeletonKind::If2,
ASTNode::If { .. } => SkeletonKind::If2,
ASTNode::MatchExpr { .. } => SkeletonKind::BranchN,
_ => return Ok(None),
};
@ -63,6 +60,66 @@ mod tests {
assert_eq!(facts.kind, SkeletonKind::Loop);
}
#[test]
fn skeleton_facts_if_without_else_is_if2() {
let if_node = ASTNode::If {
condition: Box::new(ASTNode::Literal {
value: LiteralValue::Bool(true),
span: Span::unknown(),
}),
then_body: vec![],
else_body: None,
span: Span::unknown(),
};
let facts = try_extract_skeleton_facts_from_stmt(&if_node)
.expect("Ok")
.expect("Some");
assert_eq!(facts.kind, SkeletonKind::If2);
}
#[test]
fn skeleton_facts_if_with_else_is_if2() {
let if_node = ASTNode::If {
condition: Box::new(ASTNode::Literal {
value: LiteralValue::Bool(true),
span: Span::unknown(),
}),
then_body: vec![],
else_body: Some(vec![]),
span: Span::unknown(),
};
let facts = try_extract_skeleton_facts_from_stmt(&if_node)
.expect("Ok")
.expect("Some");
assert_eq!(facts.kind, SkeletonKind::If2);
}
#[test]
fn skeleton_facts_match_is_branchn() {
let match_node = ASTNode::MatchExpr {
scrutinee: Box::new(ASTNode::Literal {
value: LiteralValue::Integer(1),
span: Span::unknown(),
}),
arms: vec![(
LiteralValue::Integer(1),
ASTNode::Literal {
value: LiteralValue::Integer(1),
span: Span::unknown(),
},
)],
else_expr: Box::new(ASTNode::Literal {
value: LiteralValue::Integer(0),
span: Span::unknown(),
}),
span: Span::unknown(),
};
let facts = try_extract_skeleton_facts_from_stmt(&match_node)
.expect("Ok")
.expect("Some");
assert_eq!(facts.kind, SkeletonKind::BranchN);
}
#[test]
fn skeleton_facts_straight_line_is_none() {
let assign = ASTNode::Assignment {