Merge pull request #351 from aiken-lang/acceptance-test-054-pattern-match-on-list
Add new acceptance test scenario: 056
This commit is contained in:
		
						commit
						ec6baf3a6a
					
				| 
						 | 
					@ -764,12 +764,12 @@ impl<'a> CodeGenerator<'a> {
 | 
				
			||||||
                    current_index,
 | 
					                    current_index,
 | 
				
			||||||
                    ..
 | 
					                    ..
 | 
				
			||||||
                } => {
 | 
					                } => {
 | 
				
			||||||
                    let current_clause_index =
 | 
					                    let (current_clause_index, has_tail) =
 | 
				
			||||||
                        if let Pattern::List { elements, .. } = &clause.pattern[0] {
 | 
					                        if let Pattern::List { elements, tail, .. } = &clause.pattern[0] {
 | 
				
			||||||
                            elements.len()
 | 
					                            (elements.len(), tail.is_some())
 | 
				
			||||||
                        } else if let Pattern::Assign { pattern, .. } = &clause.pattern[0] {
 | 
					                        } else if let Pattern::Assign { pattern, .. } = &clause.pattern[0] {
 | 
				
			||||||
                            if let Pattern::List { elements, .. } = pattern.as_ref() {
 | 
					                            if let Pattern::List { elements, tail, .. } = pattern.as_ref() {
 | 
				
			||||||
                                elements.len()
 | 
					                                (elements.len(), tail.is_some())
 | 
				
			||||||
                            } else {
 | 
					                            } else {
 | 
				
			||||||
                                unreachable!("{:#?}", pattern)
 | 
					                                unreachable!("{:#?}", pattern)
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
| 
						 | 
					@ -820,7 +820,9 @@ impl<'a> CodeGenerator<'a> {
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    };
 | 
					                    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if current_clause_index as i64 == prev_index {
 | 
					                    let minus_tail = if has_tail { 1 } else { 0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if current_clause_index as i64 - minus_tail == prev_index {
 | 
				
			||||||
                        ir_stack.push(Air::WrapClause { scope });
 | 
					                        ir_stack.push(Air::WrapClause { scope });
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        ir_stack.push(Air::ListClause {
 | 
					                        ir_stack.push(Air::ListClause {
 | 
				
			||||||
| 
						 | 
					@ -1121,7 +1123,9 @@ impl<'a> CodeGenerator<'a> {
 | 
				
			||||||
                        Pattern::Var { name, .. } => {
 | 
					                        Pattern::Var { name, .. } => {
 | 
				
			||||||
                            tail_name = name.clone();
 | 
					                            tail_name = name.clone();
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        Pattern::Discard { .. } => {}
 | 
					                        Pattern::Discard { .. } => {
 | 
				
			||||||
 | 
					                            tail_name = "_".to_string();
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
                        _ => unreachable!("Patterns in tail of list should not allow this"),
 | 
					                        _ => unreachable!("Patterns in tail of list should not allow this"),
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
| 
						 | 
					@ -1149,11 +1153,17 @@ impl<'a> CodeGenerator<'a> {
 | 
				
			||||||
                        format!("__tail_{}", elements.len() - 2)
 | 
					                        format!("__tail_{}", elements.len() - 2)
 | 
				
			||||||
                    };
 | 
					                    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    let tail = if &tail_name == "_" {
 | 
				
			||||||
 | 
					                        None
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        Some((tail_var, tail_name))
 | 
				
			||||||
 | 
					                    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    pattern_vec.push(Air::ListExpose {
 | 
					                    pattern_vec.push(Air::ListExpose {
 | 
				
			||||||
                        scope,
 | 
					                        scope,
 | 
				
			||||||
                        tipo: tipo.clone().into(),
 | 
					                        tipo: tipo.clone().into(),
 | 
				
			||||||
                        tail_head_names,
 | 
					                        tail_head_names,
 | 
				
			||||||
                        tail: Some((tail_var, tail_name)),
 | 
					                        tail,
 | 
				
			||||||
                    });
 | 
					                    });
 | 
				
			||||||
                } else if !elements.is_empty() {
 | 
					                } else if !elements.is_empty() {
 | 
				
			||||||
                    pattern_vec.push(Air::ListExpose {
 | 
					                    pattern_vec.push(Air::ListExpose {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,5 @@
 | 
				
			||||||
 | 
					# This file was generated by Aiken
 | 
				
			||||||
 | 
					# You typically do not need to edit this file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					requirements = []
 | 
				
			||||||
 | 
					packages = []
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					name = "aiken-lang/acceptance_test_056"
 | 
				
			||||||
 | 
					version = "0.0.0"
 | 
				
			||||||
 | 
					dependencies = []
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,24 @@
 | 
				
			||||||
 | 
					// Could possibly be forbidden by the parser instead if we have no intent to support that.
 | 
				
			||||||
 | 
					pub fn choice(self: List<Option<a>>) -> Option<a> {
 | 
				
			||||||
 | 
					  when self is {
 | 
				
			||||||
 | 
					    [] -> None
 | 
				
			||||||
 | 
					    [Some(_) as result, ..] -> result
 | 
				
			||||||
 | 
					    [None, ..others] -> choice(others)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test choice_1() {
 | 
				
			||||||
 | 
					  choice([Some(14), Some(42)]) == Some(14)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test choice_2() {
 | 
				
			||||||
 | 
					  choice([]) == None
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test choice_3() {
 | 
				
			||||||
 | 
					  choice([None]) == None
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test choice_4() {
 | 
				
			||||||
 | 
					  choice([None, Some(42)]) == Some(42)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,23 @@
 | 
				
			||||||
 | 
					pub fn choice(self: List<Option<a>>) -> Option<a> {
 | 
				
			||||||
 | 
					  when self is {
 | 
				
			||||||
 | 
					    [] -> None
 | 
				
			||||||
 | 
					    [Some(x), ..] -> Some(x)
 | 
				
			||||||
 | 
					    [None, ..others] -> choice(others)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test choice_1() {
 | 
				
			||||||
 | 
					  choice([Some(14), Some(42)]) == Some(14)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test choice_2() {
 | 
				
			||||||
 | 
					  choice([]) == None
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test choice_3() {
 | 
				
			||||||
 | 
					  choice([None]) == None
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test choice_4() {
 | 
				
			||||||
 | 
					  choice([None, Some(42)]) == Some(42)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,23 @@
 | 
				
			||||||
 | 
					pub fn choice(self: List<Option<a>>) -> Option<a> {
 | 
				
			||||||
 | 
					  when self is {
 | 
				
			||||||
 | 
					    [] -> None
 | 
				
			||||||
 | 
					    [None, ..others] -> choice(others)
 | 
				
			||||||
 | 
					    [result, ..] -> result
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test choice_1() {
 | 
				
			||||||
 | 
					  choice([Some(14), Some(42)]) == Some(14)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test choice_2() {
 | 
				
			||||||
 | 
					  choice([]) == None
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test choice_3() {
 | 
				
			||||||
 | 
					  choice([None]) == None
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test choice_4() {
 | 
				
			||||||
 | 
					  choice([None, Some(42)]) == Some(42)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue