diff --git a/src/mir/builder/control_flow/plan/facts/skeleton_facts.rs b/src/mir/builder/control_flow/plan/facts/skeleton_facts.rs index ec0c1050..fd934d28 100644 --- a/src/mir/builder/control_flow/plan/facts/skeleton_facts.rs +++ b/src/mir/builder/control_flow/plan/facts/skeleton_facts.rs @@ -21,10 +21,7 @@ pub(in crate::mir::builder) fn try_extract_skeleton_facts_from_stmt( ) -> Result, 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 {