From 52e0d305aa3c7c6cf8378c1aae96394c0e9e106e Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Mon, 2 Oct 2023 13:05:29 -0400 Subject: [PATCH] Remove compare_element and compare_object. --- src/compare/diff.rs | 238 +++++++------------------------------------- 1 file changed, 37 insertions(+), 201 deletions(-) diff --git a/src/compare/diff.rs b/src/compare/diff.rs index 91a4054..46d223a 100644 --- a/src/compare/diff.rs +++ b/src/compare/diff.rs @@ -28,7 +28,6 @@ use crate::types::Document; use crate::types::DocumentElement; use crate::types::Drawer; use crate::types::DynamicBlock; -use crate::types::Element; use crate::types::Entity; use crate::types::ExampleBlock; use crate::types::ExportBlock; @@ -48,7 +47,6 @@ use crate::types::LatexEnvironment; use crate::types::LatexFragment; use crate::types::LineBreak; use crate::types::NodeProperty; -use crate::types::Object; use crate::types::OrgMacro; use crate::types::Paragraph; use crate::types::PlainLink; @@ -306,7 +304,7 @@ fn compare_ast_node<'b, 's>( rust: AstNode<'b, 's>, ) -> Result, Box> { let compare_result: Result, Box> = match rust { - AstNode::Document(node) => compare_document(emacs, node), + AstNode::Document(node) => _compare_document(source, emacs, node), AstNode::Heading(node) => compare_heading(source, emacs, node), AstNode::Section(node) => compare_section(source, emacs, node), AstNode::Paragraph(node) => compare_paragraph(source, emacs, node), @@ -367,7 +365,7 @@ fn compare_ast_node<'b, 's>( let mut compare_result = match compare_result.unwrap_or_else(|e| { DiffResult { status: DiffStatus::Bad, - name: "error!".into(), + name: rust.get_elisp_fact().get_elisp_name(), message: Some(e.to_string()), children: Vec::new(), rust_source: rust.get_standard_properties().get_source(), @@ -396,145 +394,22 @@ fn compare_ast_node<'b, 's>( Ok(compare_result.into()) } -fn compare_element<'b, 's>( - source: &'s str, - emacs: &'b Token<'s>, - rust: &'b Element<'s>, -) -> Result, Box> { - let compare_result = match rust { - Element::Paragraph(obj) => compare_paragraph(source, emacs, obj), - Element::PlainList(obj) => compare_plain_list(source, emacs, obj), - Element::GreaterBlock(obj) => compare_greater_block(source, emacs, obj), - Element::DynamicBlock(obj) => compare_dynamic_block(source, emacs, obj), - Element::FootnoteDefinition(obj) => compare_footnote_definition(source, emacs, obj), - Element::Comment(obj) => compare_comment(source, emacs, obj), - Element::Drawer(obj) => compare_drawer(source, emacs, obj), - Element::PropertyDrawer(obj) => compare_property_drawer(source, emacs, obj), - Element::Table(obj) => compare_table(source, emacs, obj), - Element::VerseBlock(obj) => compare_verse_block(source, emacs, obj), - Element::CommentBlock(obj) => compare_comment_block(source, emacs, obj), - Element::ExampleBlock(obj) => compare_example_block(source, emacs, obj), - Element::ExportBlock(obj) => compare_export_block(source, emacs, obj), - Element::SrcBlock(obj) => compare_src_block(source, emacs, obj), - Element::Clock(obj) => compare_clock(source, emacs, obj), - Element::DiarySexp(obj) => compare_diary_sexp(source, emacs, obj), - Element::Planning(obj) => compare_planning(source, emacs, obj), - Element::FixedWidthArea(obj) => compare_fixed_width_area(source, emacs, obj), - Element::HorizontalRule(obj) => compare_horizontal_rule(source, emacs, obj), - Element::Keyword(obj) => compare_keyword(source, emacs, obj), - Element::BabelCall(obj) => compare_babel_call(source, emacs, obj), - Element::LatexEnvironment(obj) => compare_latex_environment(source, emacs, obj), - }; - - let mut compare_result = match compare_result.unwrap_or_else(|e| { - DiffResult { - status: DiffStatus::Bad, - name: "error!".into(), - message: Some(e.to_string()), - children: Vec::new(), - rust_source: rust.get_standard_properties().get_source(), - emacs_token: emacs, - } - .into() - }) { - DiffEntry::DiffResult(inner) => inner, - DiffEntry::DiffLayer(_) => { - unreachable!("Layers are only interior to DiffResults of AST nodes.") - } - }; - - match compare_standard_properties(source, emacs, rust) { - Err(err) => { - compare_result.status = DiffStatus::Bad; - compare_result.message = Some(err.to_string()) - } - Ok(_) => {} - } - - Ok(compare_result.into()) -} - -fn compare_object<'b, 's>( - source: &'s str, - emacs: &'b Token<'s>, - rust: &'b Object<'s>, -) -> Result, Box> { - let compare_result = match rust { - Object::Bold(obj) => compare_bold(source, emacs, obj), - Object::Italic(obj) => compare_italic(source, emacs, obj), - Object::Underline(obj) => compare_underline(source, emacs, obj), - Object::Verbatim(obj) => compare_verbatim(source, emacs, obj), - Object::Code(obj) => compare_code(source, emacs, obj), - Object::StrikeThrough(obj) => compare_strike_through(source, emacs, obj), - Object::PlainText(obj) => compare_plain_text(source, emacs, obj), - Object::RegularLink(obj) => compare_regular_link(source, emacs, obj), - Object::RadioLink(obj) => compare_radio_link(source, emacs, obj), - Object::RadioTarget(obj) => compare_radio_target(source, emacs, obj), - Object::PlainLink(obj) => compare_plain_link(source, emacs, obj), - Object::AngleLink(obj) => compare_angle_link(source, emacs, obj), - Object::OrgMacro(obj) => compare_org_macro(source, emacs, obj), - Object::Entity(obj) => compare_entity(source, emacs, obj), - Object::LatexFragment(obj) => compare_latex_fragment(source, emacs, obj), - Object::ExportSnippet(obj) => compare_export_snippet(source, emacs, obj), - Object::FootnoteReference(obj) => compare_footnote_reference(source, emacs, obj), - Object::Citation(obj) => compare_citation(source, emacs, obj), - Object::CitationReference(obj) => compare_citation_reference(source, emacs, obj), - Object::InlineBabelCall(obj) => compare_inline_babel_call(source, emacs, obj), - Object::InlineSourceBlock(obj) => compare_inline_source_block(source, emacs, obj), - Object::LineBreak(obj) => compare_line_break(source, emacs, obj), - Object::Target(obj) => compare_target(source, emacs, obj), - Object::StatisticsCookie(obj) => compare_statistics_cookie(source, emacs, obj), - Object::Subscript(obj) => compare_subscript(source, emacs, obj), - Object::Superscript(obj) => compare_superscript(source, emacs, obj), - Object::Timestamp(obj) => compare_timestamp(source, emacs, obj), - }; - let mut compare_result = match compare_result.unwrap_or_else(|e| { - DiffResult { - status: DiffStatus::Bad, - name: rust.get_elisp_fact().get_elisp_name(), - message: Some(e.to_string()), - children: Vec::new(), - rust_source: rust.get_standard_properties().get_source(), - emacs_token: emacs, - } - .into() - }) { - DiffEntry::DiffResult(inner) => inner, - DiffEntry::DiffLayer(_) => { - unreachable!("Layers are only interior to DiffResults of AST nodes.") - } - }; - - // PlainText is a special case because upstream Org-Mode uses relative values for the bounds in plaintext rather than absolute so the below checks do not account for that. - if let Object::PlainText(_) = rust { - } else { - match compare_standard_properties(source, emacs, rust) { - Err(err) => { - compare_result.status = DiffStatus::Bad; - compare_result.message = Some(err.to_string()) - } - Ok(_) => {} - } - } - - Ok(compare_result.into()) -} - pub fn compare_document<'b, 's>( emacs: &'b Token<'s>, rust: &'b Document<'s>, +) -> Result, Box> { + compare_ast_node(rust.source, emacs, rust.into()) +} + +fn _compare_document<'b, 's>( + source: &'s str, + emacs: &'b Token<'s>, + rust: &'b Document<'s>, ) -> Result, Box> { let children = emacs.as_list()?; let mut child_status = Vec::new(); let mut this_status = DiffStatus::Good; let mut message = None; - match compare_standard_properties(rust.source, emacs, rust) { - Err(err) => { - this_status = DiffStatus::Bad; - message = Some(err.to_string()) - } - Ok(_) => {} - } // Compare :path // :path is a quoted string to the absolute path of the document. @@ -595,12 +470,13 @@ pub fn compare_document<'b, 's>( if i != 0 { return Err("Section cannot be after the first child of document.".into()); } - child_status.push(compare_section( + child_status.push(compare_ast_node( rust.source, token, rust.zeroth_section .as_ref() - .ok_or("No corresponding zeroth-section")?, + .ok_or("No corresponding zeroth-section")? + .into(), )?); } else if first_cell == "headline" { let corresponding_heading = rust @@ -608,7 +484,11 @@ pub fn compare_document<'b, 's>( .iter() .nth(i - rust.zeroth_section.as_ref().map(|_| 1).unwrap_or(0)) .ok_or("Should have a corresponding heading.")?; - child_status.push(compare_heading(rust.source, token, corresponding_heading)?); + child_status.push(compare_ast_node( + rust.source, + token, + corresponding_heading.into(), + )?); } else { return Err(format!( "Document should only contain sections and headlines, found: {}", @@ -639,16 +519,8 @@ fn compare_section<'b, 's>( let mut child_status = Vec::new(); let mut message = None; - match compare_standard_properties(source, emacs, rust) { - Err(err) => { - this_status = DiffStatus::Bad; - message = Some(err.to_string()) - } - Ok(_) => {} - } - for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) { - child_status.push(compare_element(source, emacs_child, rust_child)?); + child_status.push(compare_ast_node(source, emacs_child, rust_child.into())?); } Ok(DiffResult { @@ -672,14 +544,6 @@ fn compare_heading<'b, 's>( let mut this_status = DiffStatus::Good; let mut message = None; - match compare_standard_properties(source, emacs, rust) { - Err(err) => { - this_status = DiffStatus::Bad; - message = Some(err.to_string()) - } - Ok(_) => {} - } - // Compare level let level = get_property(emacs, ":level")? .ok_or("Level should not be nil")? @@ -756,7 +620,9 @@ fn compare_heading<'b, 's>( .as_list()? .iter() .zip(rust.title.iter()) - .map(|(emacs_child, rust_child)| compare_object(source, emacs_child, rust_child)) + .map(|(emacs_child, rust_child)| { + compare_ast_node(source, emacs_child, rust_child.into()) + }) .collect::, _>>()?; child_status.push(artificial_diff_scope("title", title_status)?); } @@ -845,10 +711,10 @@ fn compare_heading<'b, 's>( .zip(rust.children.iter()) .map(|(emacs_child, rust_child)| match rust_child { DocumentElement::Heading(rust_heading) => { - compare_heading(source, emacs_child, rust_heading) + compare_ast_node(source, emacs_child, rust_heading.into()) } DocumentElement::Section(rust_section) => { - compare_section(source, emacs_child, rust_section) + compare_ast_node(source, emacs_child, rust_section.into()) } }) .collect::, _>>()?; @@ -902,7 +768,7 @@ fn compare_paragraph<'b, 's>( let message = None; for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) { - child_status.push(compare_object(source, emacs_child, rust_child)?); + child_status.push(compare_ast_node(source, emacs_child, rust_child.into())?); } Ok(DiffResult { @@ -944,7 +810,7 @@ fn compare_plain_list<'b, 's>( } for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) { - child_status.push(compare_plain_list_item(source, emacs_child, rust_child)?); + child_status.push(compare_ast_node(source, emacs_child, rust_child.into())?); } Ok(DiffResult { @@ -967,14 +833,6 @@ fn compare_plain_list_item<'b, 's>( let mut child_status = Vec::new(); let mut this_status = DiffStatus::Good; let mut message = None; - // This is not called from compare_element so we have to duplicate all the common checks here. - match compare_standard_properties(source, emacs, rust) { - Err(err) => { - this_status = DiffStatus::Bad; - message = Some(err.to_string()) - } - Ok(_) => {} - } // Compare tag let tag = get_property(emacs, ":tag")?; @@ -989,7 +847,9 @@ fn compare_plain_list_item<'b, 's>( .as_list()? .iter() .zip(rust.tag.iter()) - .map(|(emacs_child, rust_child)| compare_object(source, emacs_child, rust_child)) + .map(|(emacs_child, rust_child)| { + compare_ast_node(source, emacs_child, rust_child.into()) + }) .collect::, _>>()?; child_status.push(artificial_diff_scope("tag", tag_status)?); } @@ -1000,7 +860,7 @@ fn compare_plain_list_item<'b, 's>( .iter() .skip(2) .zip(rust.children.iter()) - .map(|(emacs_child, rust_child)| compare_element(source, emacs_child, rust_child)) + .map(|(emacs_child, rust_child)| compare_ast_node(source, emacs_child, rust_child.into())) .collect::, _>>()?; child_status.push(artificial_diff_scope("contents", contents_status)?); @@ -1096,7 +956,7 @@ fn compare_greater_block<'b, 's>( // Center and quote block has no additional properties for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) { - child_status.push(compare_element(source, emacs_child, rust_child)?); + child_status.push(compare_ast_node(source, emacs_child, rust_child.into())?); } Ok(DiffResult { @@ -1122,7 +982,7 @@ fn compare_dynamic_block<'b, 's>( // TODO: Compare :block-name :arguments for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) { - child_status.push(compare_element(source, emacs_child, rust_child)?); + child_status.push(compare_ast_node(source, emacs_child, rust_child.into())?); } Ok(DiffResult { @@ -1148,7 +1008,7 @@ fn compare_footnote_definition<'b, 's>( // TODO: Compare :label :pre-blank for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) { - child_status.push(compare_element(source, emacs_child, rust_child)?); + child_status.push(compare_ast_node(source, emacs_child, rust_child.into())?); } Ok(DiffResult { @@ -1195,7 +1055,7 @@ fn compare_drawer<'b, 's>( // TODO: Compare :drawer-name for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) { - child_status.push(compare_element(source, emacs_child, rust_child)?); + child_status.push(compare_ast_node(source, emacs_child, rust_child.into())?); } Ok(DiffResult { @@ -1220,7 +1080,7 @@ fn compare_property_drawer<'b, 's>( let message = None; for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) { - child_status.push(compare_node_property(source, emacs_child, rust_child)?); + child_status.push(compare_ast_node(source, emacs_child, rust_child.into())?); } Ok(DiffResult { @@ -1242,14 +1102,6 @@ fn compare_node_property<'b, 's>( let child_status = Vec::new(); let mut this_status = DiffStatus::Good; let mut message = None; - // This is not called from compare_element so we must duplicate all the tests here. - match compare_standard_properties(source, emacs, rust) { - Err(err) => { - this_status = DiffStatus::Bad; - message = Some(err.to_string()) - } - Ok(_) => {} - } // TODO: Compare :key :value @@ -1315,7 +1167,7 @@ fn compare_table<'b, 's>( // TODO: Compare :type :value for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) { - child_status.push(compare_table_row(source, emacs_child, rust_child)?); + child_status.push(compare_ast_node(source, emacs_child, rust_child.into())?); } Ok(DiffResult { @@ -1338,21 +1190,13 @@ fn compare_table_row<'b, 's>( let mut child_status = Vec::new(); let mut this_status = DiffStatus::Good; let mut message = None; - // This is not called from compare_element so we must duplicate all the tests here. - match compare_standard_properties(source, emacs, rust) { - Err(err) => { - this_status = DiffStatus::Bad; - message = Some(err.to_string()) - } - Ok(_) => {} - } // TODO: Compare :type // // :type is an unquoted atom of either standard or rule for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) { - child_status.push(compare_table_cell(source, emacs_child, rust_child)?); + child_status.push(compare_ast_node(source, emacs_child, rust_child.into())?); } Ok(DiffResult { @@ -1375,14 +1219,6 @@ fn compare_table_cell<'b, 's>( let child_status = Vec::new(); let mut this_status = DiffStatus::Good; let mut message = None; - // This is not called from compare_object so we must duplicate all the tests here. - match compare_standard_properties(source, emacs, rust) { - Err(err) => { - this_status = DiffStatus::Bad; - message = Some(err.to_string()) - } - Ok(_) => {} - } for (_emacs_child, _rust_child) in children.iter().skip(2).zip(rust.children.iter()) {}