Implement a new compare_properties implementation of the heading comparison.
This commit is contained in:
		
							parent
							
								
									166e59b922
								
							
						
					
					
						commit
						65615c64d2
					
				| @ -230,6 +230,45 @@ pub(crate) fn compare_property_boolean<'b, 's, 'x, R, RG: Fn(R) -> bool>( | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub(crate) fn compare_property_single_ast_node< | ||||
|     'b, | ||||
|     's, | ||||
|     'x: 'b + 's, | ||||
|     R, | ||||
|     RV: std::fmt::Debug, | ||||
|     RG: Fn(R) -> Option<RV>, | ||||
| >( | ||||
|     source: &'s str, | ||||
|     emacs: &'b Token<'s>, | ||||
|     rust_node: R, | ||||
|     emacs_field: &'x str, | ||||
|     rust_value_getter: RG, | ||||
| ) -> Result<ComparePropertiesResult<'b, 's>, Box<dyn std::error::Error>> | ||||
| where | ||||
|     AstNode<'b, 's>: From<RV>, | ||||
| { | ||||
|     let value = get_property(emacs, emacs_field)?; | ||||
|     let rust_value = rust_value_getter(rust_node); | ||||
|     match (value, rust_value) { | ||||
|         (None, None) => {} | ||||
|         (None, rv @ Some(_)) | (Some(_), rv @ None) => { | ||||
|             let this_status = DiffStatus::Bad; | ||||
|             let message = Some(format!( | ||||
|                 "{} mismatch (emacs != rust) {:?} != {:?}", | ||||
|                 emacs_field, value, rv | ||||
|             )); | ||||
|             return Ok(ComparePropertiesResult::SelfChange(this_status, message)); | ||||
|         } | ||||
|         (Some(ev), Some(rv)) => { | ||||
|             let child_status: Vec<DiffEntry<'b, 's>> = | ||||
|                 vec![compare_ast_node(source, ev, rv.into())?]; | ||||
|             let diff_scope = artificial_diff_scope(emacs_field, child_status)?; | ||||
|             return Ok(ComparePropertiesResult::DiffEntry(diff_scope)); | ||||
|         } | ||||
|     } | ||||
|     Ok(ComparePropertiesResult::NoChange) | ||||
| } | ||||
| 
 | ||||
| pub(crate) fn compare_property_list_of_ast_nodes< | ||||
|     'b, | ||||
|     's, | ||||
|  | ||||
| @ -12,6 +12,7 @@ use super::compare_field::compare_property_list_of_ast_nodes; | ||||
| use super::compare_field::compare_property_list_of_quoted_string; | ||||
| use super::compare_field::compare_property_numeric; | ||||
| use super::compare_field::compare_property_quoted_string; | ||||
| use super::compare_field::compare_property_single_ast_node; | ||||
| use super::compare_field::compare_property_unquoted_atom; | ||||
| use super::elisp_fact::ElispFact; | ||||
| use super::elisp_fact::GetElispFact; | ||||
| @ -621,6 +622,86 @@ fn new_compare_heading<'b, 's>( | ||||
|             EmacsField::Required(":level"), | ||||
|             |r| Some(r.level), | ||||
|             compare_property_numeric | ||||
|         ), | ||||
|         ( | ||||
|             EmacsField::Required(":tags"), | ||||
|             |r| if r.tags.is_empty() { | ||||
|                 None | ||||
|             } else { | ||||
|                 Some(r.tags.iter()) | ||||
|             }, | ||||
|             compare_property_list_of_quoted_string | ||||
|         ), | ||||
|         ( | ||||
|             EmacsField::Required(":todo-keyword"), | ||||
|             |r| r.todo_keyword.as_ref().map(|(_, text)| text), | ||||
|             compare_property_quoted_string | ||||
|         ), | ||||
|         ( | ||||
|             EmacsField::Required(":todo-type"), | ||||
|             |r| r | ||||
|                 .todo_keyword | ||||
|                 .as_ref() | ||||
|                 .map(|(todo_type, _)| todo_type) | ||||
|                 .map(|todo_type| match todo_type { | ||||
|                     TodoKeywordType::Todo => "todo", | ||||
|                     TodoKeywordType::Done => "done", | ||||
|                 }), | ||||
|             compare_property_unquoted_atom | ||||
|         ), | ||||
|         ( | ||||
|             EmacsField::Required(":title"), | ||||
|             |r| if r.title.is_empty() { | ||||
|                 None | ||||
|             } else { | ||||
|                 Some(r.title.iter()) | ||||
|             }, | ||||
|             compare_property_list_of_ast_nodes | ||||
|         ), | ||||
|         ( | ||||
|             EmacsField::Required(":priority"), | ||||
|             |r| r.priority_cookie, | ||||
|             compare_property_numeric | ||||
|         ), | ||||
|         ( | ||||
|             EmacsField::Required(":archivedp"), | ||||
|             |r| r.is_archived, | ||||
|             compare_property_boolean | ||||
|         ), | ||||
|         ( | ||||
|             EmacsField::Required(":commentedp"), | ||||
|             |r| r.is_comment, | ||||
|             compare_property_boolean | ||||
|         ), | ||||
|         ( | ||||
|             EmacsField::Required(":raw-value"), | ||||
|             |r| Some(r.get_raw_value()), | ||||
|             compare_property_quoted_string | ||||
|         ), | ||||
|         ( | ||||
|             EmacsField::Required(":footnote-section-p"), | ||||
|             |r| r.is_footnote_section, | ||||
|             compare_property_boolean | ||||
|         ), | ||||
|         ( | ||||
|             EmacsField::Required(":scheduled"), | ||||
|             |r| r.scheduled.as_ref(), | ||||
|             compare_property_single_ast_node | ||||
|         ), | ||||
|         ( | ||||
|             EmacsField::Required(":deadline"), | ||||
|             |r| r.deadline.as_ref(), | ||||
|             compare_property_single_ast_node | ||||
|         ), | ||||
|         ( | ||||
|             EmacsField::Required(":closed"), | ||||
|             |r| r.closed.as_ref(), | ||||
|             compare_property_single_ast_node | ||||
|         ), | ||||
|         ( | ||||
|             EmacsField::Required(":pre-blank"), | ||||
|             compare_identity, | ||||
|             compare_noop | ||||
|         ) | ||||
|     ) { | ||||
|         match diff { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Tom Alexander
						Tom Alexander