diff --git a/external-crates/move/Cargo.lock b/external-crates/move/Cargo.lock index 8fc7ec9946862..eae2d26a2708a 100644 --- a/external-crates/move/Cargo.lock +++ b/external-crates/move/Cargo.lock @@ -1585,6 +1585,7 @@ dependencies = [ "move-ir-types", "move-symbol-pool", "serde", + "serde_json", ] [[package]] diff --git a/external-crates/move/crates/move-bytecode-source-map/Cargo.toml b/external-crates/move/crates/move-bytecode-source-map/Cargo.toml index c42d4a8e01f8c..4233763f94b0d 100644 --- a/external-crates/move/crates/move-bytecode-source-map/Cargo.toml +++ b/external-crates/move/crates/move-bytecode-source-map/Cargo.toml @@ -17,6 +17,7 @@ move-command-line-common.workspace = true bcs.workspace = true serde.workspace = true +serde_json.workspace = true [features] default = [] diff --git a/external-crates/move/crates/move-bytecode-source-map/src/utils.rs b/external-crates/move/crates/move-bytecode-source-map/src/utils.rs index f73d1203451c3..191f57f2b6203 100644 --- a/external-crates/move/crates/move-bytecode-source-map/src/utils.rs +++ b/external-crates/move/crates/move-bytecode-source-map/src/utils.rs @@ -5,12 +5,19 @@ use crate::source_map::SourceMap; use anyhow::{format_err, Result}; use move_ir_types::location::Loc; -use std::{fs::File, io::Read, path::Path}; +use std::{ + fs::File, + io::{Read, Write}, + path::Path, +}; pub type Error = (Loc, String); pub type Errors = Vec; pub fn source_map_from_file(file_path: &Path) -> Result { + if file_path.extension().is_some_and(|ext| ext == "json") { + return deserialize_from_json(file_path); + } let mut bytes = Vec::new(); File::open(file_path) .ok() @@ -19,3 +26,31 @@ pub fn source_map_from_file(file_path: &Path) -> Result { bcs::from_bytes::(&bytes) .map_err(|_| format_err!("Error deserializing into source map")) } + +pub fn serialize_to_json(map: &SourceMap) -> Result> { + serde_json::to_vec(map).map_err(|e| format_err!("Error serializing to json: {}", e)) +} + +pub fn serialize_to_json_file(map: &SourceMap, file_path: &Path) -> Result<()> { + let json = serde_json::to_string_pretty(map) + .map_err(|e| format_err!("Error serializing to json: {}", e))?; + let mut f = + std::fs::File::create(file_path).map_err(|e| format_err!("Error creating file: {}", e))?; + f.write_all(json.as_bytes()) + .map_err(|e| format_err!("Error writing to file: {}", e))?; + Ok(()) +} + +pub fn deserialize_from_json(file_path: &Path) -> Result { + let mut file = File::open(file_path).map_err(|e| format_err!("Error opening file: {}", e))?; + let mut json = String::new(); + file.read_to_string(&mut json) + .map_err(|e| format_err!("Error reading file: {}", e))?; + serde_json::from_str(&json).map_err(|e| format_err!("Error deserializing from json: {}", e)) +} + +pub fn convert_to_json(file_path: &Path) -> Result<()> { + let map = source_map_from_file(file_path)?; + let json_file_path = file_path.with_extension("json"); + serialize_to_json_file(&map, &json_file_path) +} diff --git a/external-crates/move/crates/move-package/src/compilation/compiled_package.rs b/external-crates/move/crates/move-package/src/compilation/compiled_package.rs index 998b18ea0e346..ff03ab46dbf1a 100644 --- a/external-crates/move/crates/move-package/src/compilation/compiled_package.rs +++ b/external-crates/move/crates/move-package/src/compilation/compiled_package.rs @@ -15,7 +15,7 @@ use anyhow::{ensure, Result}; use colored::Colorize; use itertools::{Either, Itertools}; use move_binary_format::file_format::CompiledModule; -use move_bytecode_source_map::utils::source_map_from_file; +use move_bytecode_source_map::utils::{serialize_to_json, source_map_from_file}; use move_bytecode_utils::Modules; use move_command_line_common::files::{ extension_equals, find_filenames, try_exists, MOVE_COMPILED_EXTENSION, MOVE_EXTENSION, @@ -321,6 +321,13 @@ impl OnDiskCompiledPackage { .with_extension(SOURCE_MAP_EXTENSION), compiled_unit.unit.serialize_source_map().as_slice(), )?; + self.save_under( + CompiledPackageLayout::SourceMaps + .path() + .join(&file_path) + .with_extension("json"), + &serialize_to_json(&compiled_unit.unit.source_map)?, + )?; self.save_under( CompiledPackageLayout::Sources .path()