fix: list items in when were not being added to scope
fix: tuple clause must preserve previous clause properties state
This commit is contained in:
		
							parent
							
								
									8f0cf289b4
								
							
						
					
					
						commit
						cdf8bd6548
					
				| 
						 | 
					@ -825,6 +825,8 @@ impl<'a> CodeGenerator<'a> {
 | 
				
			||||||
                clause_then_stack = clause_guard_stack;
 | 
					                clause_then_stack = clause_guard_stack;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            let prev_clause_properties = clause_properties.clone();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // deal with clause pattern and then itself
 | 
					            // deal with clause pattern and then itself
 | 
				
			||||||
            self.when_pattern(
 | 
					            self.when_pattern(
 | 
				
			||||||
                &clause.pattern,
 | 
					                &clause.pattern,
 | 
				
			||||||
| 
						 | 
					@ -950,18 +952,14 @@ impl<'a> CodeGenerator<'a> {
 | 
				
			||||||
                    defined_tuple_indices,
 | 
					                    defined_tuple_indices,
 | 
				
			||||||
                    ..
 | 
					                    ..
 | 
				
			||||||
                } => {
 | 
					                } => {
 | 
				
			||||||
                    let prev_defined_tuple_indices = defined_tuple_indices.clone();
 | 
					                    let ClauseProperties::TupleClause {  defined_tuple_indices: prev_defined_tuple_indices, .. } = prev_clause_properties
 | 
				
			||||||
                    let subject_name = original_subject_name.clone();
 | 
					                    else {
 | 
				
			||||||
 | 
					                        unreachable!()
 | 
				
			||||||
                    let current_defined_tuple_indices = match clause_properties {
 | 
					 | 
				
			||||||
                        ClauseProperties::TupleClause {
 | 
					 | 
				
			||||||
                            defined_tuple_indices,
 | 
					 | 
				
			||||||
                            ..
 | 
					 | 
				
			||||||
                        } => defined_tuple_indices.clone(),
 | 
					 | 
				
			||||||
                        _ => unreachable!(),
 | 
					 | 
				
			||||||
                    };
 | 
					                    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    let indices_to_define = current_defined_tuple_indices
 | 
					                    let subject_name = original_subject_name.clone();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    let indices_to_define = defined_tuple_indices
 | 
				
			||||||
                        .difference(&prev_defined_tuple_indices)
 | 
					                        .difference(&prev_defined_tuple_indices)
 | 
				
			||||||
                        .cloned()
 | 
					                        .cloned()
 | 
				
			||||||
                        .collect();
 | 
					                        .collect();
 | 
				
			||||||
| 
						 | 
					@ -1196,32 +1194,25 @@ impl<'a> CodeGenerator<'a> {
 | 
				
			||||||
                    })
 | 
					                    })
 | 
				
			||||||
                    .collect_vec();
 | 
					                    .collect_vec();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if tail.is_some() && !tail_head_names.is_empty() {
 | 
					                let tail_var = if elements.len() == 1 || elements.is_empty() {
 | 
				
			||||||
                    let tail_var = if elements.len() == 1 {
 | 
					 | 
				
			||||||
                    clause_properties.original_subject_name().clone()
 | 
					                    clause_properties.original_subject_name().clone()
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    format!("__tail_{}", elements.len() - 2)
 | 
					                    format!("__tail_{}", elements.len() - 2)
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    let tail = if &tail_name == "_" {
 | 
					                let tail = if &tail_name == "_" || tail_name.is_empty() {
 | 
				
			||||||
                    None
 | 
					                    None
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    Some((tail_var, tail_name))
 | 
					                    Some((tail_var, tail_name))
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if tail.is_some() || !tail_head_names.is_empty() {
 | 
				
			||||||
                    pattern_stack.list_expose(
 | 
					                    pattern_stack.list_expose(
 | 
				
			||||||
                        tipo.clone().into(),
 | 
					                        tipo.clone().into(),
 | 
				
			||||||
                        tail_head_names,
 | 
					                        tail_head_names,
 | 
				
			||||||
                        tail,
 | 
					                        tail,
 | 
				
			||||||
                        nested_pattern,
 | 
					                        nested_pattern,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                } else if !tail_head_names.is_empty() {
 | 
					 | 
				
			||||||
                    pattern_stack.list_expose(
 | 
					 | 
				
			||||||
                        tipo.clone().into(),
 | 
					 | 
				
			||||||
                        tail_head_names,
 | 
					 | 
				
			||||||
                        None,
 | 
					 | 
				
			||||||
                        nested_pattern,
 | 
					 | 
				
			||||||
                    );
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                pattern_stack.merge_child(value_stack);
 | 
					                pattern_stack.merge_child(value_stack);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue