Move assert bounds for elements and objects (except PlainText) to the compare element/object functions.
This commit is contained in:
parent
b4c985071c
commit
dd8a8207ce
@ -315,9 +315,9 @@ fn compare_element<'s>(
|
|||||||
Element::BabelCall(obj) => compare_babel_call(source, emacs, obj),
|
Element::BabelCall(obj) => compare_babel_call(source, emacs, obj),
|
||||||
Element::LatexEnvironment(obj) => compare_latex_environment(source, emacs, obj),
|
Element::LatexEnvironment(obj) => compare_latex_environment(source, emacs, obj),
|
||||||
};
|
};
|
||||||
match compare_result {
|
|
||||||
Ok(_) => compare_result,
|
let mut compare_result = match compare_result.unwrap_or_else(|e| {
|
||||||
Err(ref e) => Ok(DiffResult {
|
DiffResult {
|
||||||
status: DiffStatus::Bad,
|
status: DiffStatus::Bad,
|
||||||
name: "error!".to_owned(),
|
name: "error!".to_owned(),
|
||||||
message: Some(e.to_string()),
|
message: Some(e.to_string()),
|
||||||
@ -325,8 +325,23 @@ fn compare_element<'s>(
|
|||||||
rust_source: rust.get_standard_properties().get_source(),
|
rust_source: rust.get_standard_properties().get_source(),
|
||||||
emacs_token: emacs,
|
emacs_token: emacs,
|
||||||
}
|
}
|
||||||
.into()),
|
.into()
|
||||||
|
}) {
|
||||||
|
DiffEntry::DiffResult(inner) => inner,
|
||||||
|
DiffEntry::DiffLayer(_) => {
|
||||||
|
unreachable!("Layers are only interior to DiffResults of AST nodes.")
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
match assert_bounds(source, emacs, rust.get_standard_properties()) {
|
||||||
|
Err(err) => {
|
||||||
|
compare_result.status = DiffStatus::Bad;
|
||||||
|
compare_result.message = Some(err.to_string())
|
||||||
|
}
|
||||||
|
Ok(_) => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ok(compare_result.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn compare_object<'s>(
|
fn compare_object<'s>(
|
||||||
@ -363,9 +378,8 @@ fn compare_object<'s>(
|
|||||||
Object::Superscript(obj) => compare_superscript(source, emacs, obj),
|
Object::Superscript(obj) => compare_superscript(source, emacs, obj),
|
||||||
Object::Timestamp(obj) => compare_timestamp(source, emacs, obj),
|
Object::Timestamp(obj) => compare_timestamp(source, emacs, obj),
|
||||||
};
|
};
|
||||||
match compare_result {
|
let mut compare_result = match compare_result.unwrap_or_else(|e| {
|
||||||
Ok(_) => compare_result,
|
DiffResult {
|
||||||
Err(ref e) => Ok(DiffResult {
|
|
||||||
status: DiffStatus::Bad,
|
status: DiffStatus::Bad,
|
||||||
name: "error!".to_owned(),
|
name: "error!".to_owned(),
|
||||||
message: Some(e.to_string()),
|
message: Some(e.to_string()),
|
||||||
@ -373,8 +387,27 @@ fn compare_object<'s>(
|
|||||||
rust_source: rust.get_standard_properties().get_source(),
|
rust_source: rust.get_standard_properties().get_source(),
|
||||||
emacs_token: emacs,
|
emacs_token: emacs,
|
||||||
}
|
}
|
||||||
.into()),
|
.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 assert_bounds(source, emacs, rust.get_standard_properties()) {
|
||||||
|
Err(err) => {
|
||||||
|
compare_result.status = DiffStatus::Bad;
|
||||||
|
compare_result.message = Some(err.to_string())
|
||||||
|
}
|
||||||
|
Ok(_) => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ok(compare_result.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn compare_document<'s>(
|
pub fn compare_document<'s>(
|
||||||
|
@ -13,7 +13,7 @@ fn is_slice_of(parent: &str, child: &str) -> bool {
|
|||||||
/// Get the byte offset into source that the rust object exists at.
|
/// Get the byte offset into source that the rust object exists at.
|
||||||
///
|
///
|
||||||
/// These offsets are zero-based unlike the elisp ones.
|
/// These offsets are zero-based unlike the elisp ones.
|
||||||
fn get_rust_byte_offsets<'s, S: StandardProperties<'s>>(
|
fn get_rust_byte_offsets<'s, S: StandardProperties<'s> + ?Sized>(
|
||||||
original_document: &'s str,
|
original_document: &'s str,
|
||||||
rust_ast_node: &'s S,
|
rust_ast_node: &'s S,
|
||||||
) -> (usize, usize) {
|
) -> (usize, usize) {
|
||||||
@ -46,7 +46,7 @@ pub(crate) fn assert_name<'s>(
|
|||||||
/// Assert that the character ranges defined by upstream org-mode's :standard-properties match the slices in Organic's StandardProperties.
|
/// Assert that the character ranges defined by upstream org-mode's :standard-properties match the slices in Organic's StandardProperties.
|
||||||
///
|
///
|
||||||
/// This does **not** handle plain text because plain text is a special case.
|
/// This does **not** handle plain text because plain text is a special case.
|
||||||
pub(crate) fn assert_bounds<'s, S: StandardProperties<'s>>(
|
pub(crate) fn assert_bounds<'s, S: StandardProperties<'s> + ?Sized>(
|
||||||
original_document: &'s str,
|
original_document: &'s str,
|
||||||
emacs: &'s Token<'s>,
|
emacs: &'s Token<'s>,
|
||||||
rust: &'s S,
|
rust: &'s S,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user