From dec5d17aa6efecb68911afa9a8b37ea98baf790c Mon Sep 17 00:00:00 2001 From: Timothy Zakian Date: Thu, 30 May 2024 13:51:21 -0700 Subject: [PATCH] fixup! [CLI] Add clever error support to Sui CLI --- crates/sui-package-resolver/src/lib.rs | 1 - crates/sui/src/clever_error_rendering.rs | 33 +++++++++++++---- ...ing__tests__parse_abort_status_string.snap | 35 +++++++++++++++++++ .../tests/snapshots/cli_tests__body_fn.snap | 8 ++--- .../build_tests/disassemble_module/args.exp | 2 ++ .../move-command-line-common/src/display.rs | 4 +-- 6 files changed, 70 insertions(+), 13 deletions(-) create mode 100644 crates/sui/src/snapshots/sui__clever_error_rendering__tests__parse_abort_status_string.snap diff --git a/crates/sui-package-resolver/src/lib.rs b/crates/sui-package-resolver/src/lib.rs index b7920368abffe..c2cb4017d6dc3 100644 --- a/crates/sui-package-resolver/src/lib.rs +++ b/crates/sui-package-resolver/src/lib.rs @@ -11,7 +11,6 @@ use move_command_line_common::display::RenderResult; use move_command_line_common::{display::try_render_constant, error_bitset::ErrorBitset}; use move_core_types::annotated_value::MoveEnumLayout; use move_core_types::language_storage::ModuleId; -use std::collections::btree_map::Entry; use std::collections::BTreeSet; use std::num::NonZeroUsize; use std::sync::{Arc, Mutex}; diff --git a/crates/sui/src/clever_error_rendering.rs b/crates/sui/src/clever_error_rendering.rs index 41a117bd5ee36..833df2b815039 100644 --- a/crates/sui/src/clever_error_rendering.rs +++ b/crates/sui/src/clever_error_rendering.rs @@ -114,12 +114,12 @@ fn parse_abort_status_string( let re = Regex::new(r"MoveAbort.*address:\s*(.*?),.*Identifier...(.*?)\\.*instruction:\s+(\d+),.*function_name:\s*Some...(\w+?)\\.*},\s*(\d+).*in command\s*(\d+)").unwrap(); let captures = re.captures(s).unwrap(); - let address = AccountAddress::from_hex(captures.get(1).unwrap().as_str())?; - let module_name = Identifier::new(captures.get(2).unwrap().as_str())?; - let instruction = captures.get(3).unwrap().as_str().parse::()?; - let function_name = Identifier::new(captures.get(4).unwrap().as_str())?; - let abort_code = captures.get(5).unwrap().as_str().parse::()?; - let command_index = captures.get(6).unwrap().as_str().parse::()?; + let address = AccountAddress::from_hex(&captures[1])?; + let module_name = Identifier::new(&captures[2])?; + let instruction = captures[3].parse::()?; + let function_name = Identifier::new(&captures[4])?; + let abort_code = captures[5].parse::()?; + let command_index = captures[6].parse::()?; Ok(( address, module_name, @@ -129,3 +129,24 @@ fn parse_abort_status_string( command_index, )) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parse_abort_status_string() { + let corpus = vec![ + r#"Failure { error: "MoveAbort(MoveLocation { module: ModuleId { address: 60197a0c146e31dd12689e890208767fe2fefb2f726710b4a9fa0b857f7a2c20, name: Identifier(\"clever_errors\") }, function: 0, instruction: 1, function_name: Some(\"aborter\") }, 0) in command 0" }"#, + r#"Failure { error: "MoveAbort(MoveLocation { module: ModuleId { address: 60197a0c146e31dd12689e890208767fe2fefb2f726710b4a9fa0b857f7a2c20, name: Identifier(\"clever_errors\") }, function: 1, instruction: 1, function_name: Some(\"aborter_line_no\") }, 9223372105574252543) in command 0" }"#, + r#"Failure { error: "MoveAbort(MoveLocation { module: ModuleId { address: 60197a0c146e31dd12689e890208767fe2fefb2f726710b4a9fa0b857f7a2c20, name: Identifier(\"clever_errors\") }, function: 2, instruction: 1, function_name: Some(\"clever_aborter\") }, 9223372118459154433) in command 0" }"#, + r#"Failure { error: "MoveAbort(MoveLocation { module: ModuleId { address: 60197a0c146e31dd12689e890208767fe2fefb2f726710b4a9fa0b857f7a2c20, name: Identifier(\"clever_errors\") }, function: 3, instruction: 1, function_name: Some(\"clever_aborter_not_a_string\") }, 9223372135639154691) in command 0" }"#, + ]; + let parsed: Vec<_> = corpus.into_iter().map(|c| { + let (address, module_name, function_name, instruction, abort_code, command_index) = + parse_abort_status_string(c).unwrap(); + format!("original abort message: {}\n address: {}\n module_name: {}\n function_name: {}\n instruction: {}\n abort_code: {}\n command_index: {}", c, address, module_name, function_name, instruction, abort_code, command_index) + }).collect(); + insta::assert_snapshot!(parsed.join("\n------\n")); + } +} diff --git a/crates/sui/src/snapshots/sui__clever_error_rendering__tests__parse_abort_status_string.snap b/crates/sui/src/snapshots/sui__clever_error_rendering__tests__parse_abort_status_string.snap new file mode 100644 index 0000000000000..0485a115bb4ef --- /dev/null +++ b/crates/sui/src/snapshots/sui__clever_error_rendering__tests__parse_abort_status_string.snap @@ -0,0 +1,35 @@ +--- +source: crates/sui/src/clever_error_rendering.rs +expression: "parsed.join(\"\\n------\\n\")" +--- +original abort message: Failure { error: "MoveAbort(MoveLocation { module: ModuleId { address: 60197a0c146e31dd12689e890208767fe2fefb2f726710b4a9fa0b857f7a2c20, name: Identifier(\"clever_errors\") }, function: 0, instruction: 1, function_name: Some(\"aborter\") }, 0) in command 0" } + address: 60197a0c146e31dd12689e890208767fe2fefb2f726710b4a9fa0b857f7a2c20 + module_name: clever_errors + function_name: aborter + instruction: 1 + abort_code: 0 + command_index: 0 +------ +original abort message: Failure { error: "MoveAbort(MoveLocation { module: ModuleId { address: 60197a0c146e31dd12689e890208767fe2fefb2f726710b4a9fa0b857f7a2c20, name: Identifier(\"clever_errors\") }, function: 1, instruction: 1, function_name: Some(\"aborter_line_no\") }, 9223372105574252543) in command 0" } + address: 60197a0c146e31dd12689e890208767fe2fefb2f726710b4a9fa0b857f7a2c20 + module_name: clever_errors + function_name: aborter_line_no + instruction: 1 + abort_code: 9223372105574252543 + command_index: 0 +------ +original abort message: Failure { error: "MoveAbort(MoveLocation { module: ModuleId { address: 60197a0c146e31dd12689e890208767fe2fefb2f726710b4a9fa0b857f7a2c20, name: Identifier(\"clever_errors\") }, function: 2, instruction: 1, function_name: Some(\"clever_aborter\") }, 9223372118459154433) in command 0" } + address: 60197a0c146e31dd12689e890208767fe2fefb2f726710b4a9fa0b857f7a2c20 + module_name: clever_errors + function_name: clever_aborter + instruction: 1 + abort_code: 9223372118459154433 + command_index: 0 +------ +original abort message: Failure { error: "MoveAbort(MoveLocation { module: ModuleId { address: 60197a0c146e31dd12689e890208767fe2fefb2f726710b4a9fa0b857f7a2c20, name: Identifier(\"clever_errors\") }, function: 3, instruction: 1, function_name: Some(\"clever_aborter_not_a_string\") }, 9223372135639154691) in command 0" } + address: 60197a0c146e31dd12689e890208767fe2fefb2f726710b4a9fa0b857f7a2c20 + module_name: clever_errors + function_name: clever_aborter_not_a_string + instruction: 1 + abort_code: 9223372135639154691 + command_index: 0 diff --git a/crates/sui/tests/snapshots/cli_tests__body_fn.snap b/crates/sui/tests/snapshots/cli_tests__body_fn.snap index cfb230fee1b80..3eba4b17b5551 100644 --- a/crates/sui/tests/snapshots/cli_tests__body_fn.snap +++ b/crates/sui/tests/snapshots/cli_tests__body_fn.snap @@ -4,18 +4,18 @@ expression: "format!(\"Non-clever-abort\\n---\\n{}\\n---\\nLine-only-abort\\n--- --- Non-clever-abort --- -Error executing transaction: 1st command aborted within function '0xc9d9682e45a4291cf2c7d86486f604fe19451bb367cc9fa4f2149eb5f1efac8a::clever_errors::aborter' at instruction 1 with code 0 +Error executing transaction: 1st command aborted within function '0x60197a0c146e31dd12689e890208767fe2fefb2f726710b4a9fa0b857f7a2c20::clever_errors::aborter' at instruction 1 with code 0 --- Line-only-abort --- -Error executing transaction: 1st command aborted within function '0xc9d9682e45a4291cf2c7d86486f604fe19451bb367cc9fa4f2149eb5f1efac8a::clever_errors::aborter_line_no' at line 15 +Error executing transaction: 1st command aborted within function '0x60197a0c146e31dd12689e890208767fe2fefb2f726710b4a9fa0b857f7a2c20::clever_errors::aborter_line_no' at line 15 --- Clever-error-utf8 --- -Error executing transaction: 1st command aborted within function '0xc9d9682e45a4291cf2c7d86486f604fe19451bb367cc9fa4f2149eb5f1efac8a::clever_errors::clever_aborter' at line 19. Aborted with 'ENotFound' -- 'Element not found in vector 💥 🚀 🌠' +Error executing transaction: 1st command aborted within function '0x60197a0c146e31dd12689e890208767fe2fefb2f726710b4a9fa0b857f7a2c20::clever_errors::clever_aborter' at line 19. Aborted with 'ENotFound' -- 'Element not found in vector 💥 🚀 🌠' --- Clever-error-non-utf8 --- -Error executing transaction: 1st command aborted within function '0xc9d9682e45a4291cf2c7d86486f604fe19451bb367cc9fa4f2149eb5f1efac8a::clever_errors::clever_aborter_not_a_string' at line 23. Aborted with 'ENotAString' -- 'BAEAAAAAAAAAAgAAAAAAAAADAAAAAAAAAAQAAAAAAAAA' +Error executing transaction: 1st command aborted within function '0x60197a0c146e31dd12689e890208767fe2fefb2f726710b4a9fa0b857f7a2c20::clever_errors::clever_aborter_not_a_string' at line 23. Aborted with 'ENotAString' -- 'BAEAAAAAAAAAAgAAAAAAAAADAAAAAAAAAAQAAAAAAAAA' --- diff --git a/external-crates/move/crates/move-cli/tests/build_tests/disassemble_module/args.exp b/external-crates/move/crates/move-cli/tests/build_tests/disassemble_module/args.exp index e0ab1c9b34dfb..236f9bd53fcdc 100644 --- a/external-crates/move/crates/move-cli/tests/build_tests/disassemble_module/args.exp +++ b/external-crates/move/crates/move-cli/tests/build_tests/disassemble_module/args.exp @@ -22,11 +22,13 @@ public af(): u32 { B0: 0: LdConst[1](u32: 0) 1: Ret + } public sf(): vector { B0: 0: LdConst[2](vector: "Thi..) 1: Ret + } public nf(): vector { B0: diff --git a/external-crates/move/crates/move-command-line-common/src/display.rs b/external-crates/move/crates/move-command-line-common/src/display.rs index e6d1f6afe6759..f55ecde4638b9 100644 --- a/external-crates/move/crates/move-command-line-common/src/display.rs +++ b/external-crates/move/crates/move-command-line-common/src/display.rs @@ -54,8 +54,8 @@ pub fn try_render_constant(constant: &Constant) -> RenderResult { SignatureToken::Signer | SignatureToken::Vector(_) - | SignatureToken::Struct(_) - | SignatureToken::StructInstantiation(_) + | SignatureToken::Datatype(_) + | SignatureToken::DatatypeInstantiation(_) | SignatureToken::Reference(_) | SignatureToken::MutableReference(_) | SignatureToken::TypeParameter(_) => RenderResult::NotRendered,