@@ -992,6 +992,16 @@ pub fn add_serialized_output(result: &mut serde_json::Value, value: Value) {
992
992
993
993
/// Returns (process-exit-code, Option<json-output>)
994
994
pub fn invoke_command ( invoked_by : & str , args : & [ String ] ) -> ( i32 , Option < serde_json:: Value > ) {
995
+ invoke_command_with_analysis_db ( invoked_by, args, None )
996
+ }
997
+
998
+ /// Returns (process-exit-code, Option<json-output>)
999
+ /// Optionally accepts a shared analysis database for contract dependency resolution
1000
+ pub fn invoke_command_with_analysis_db (
1001
+ invoked_by : & str ,
1002
+ args : & [ String ] ,
1003
+ shared_analysis_db : Option < & mut AnalysisDatabase > ,
1004
+ ) -> ( i32 , Option < serde_json:: Value > ) {
995
1005
if args. is_empty ( ) {
996
1006
print_usage ( invoked_by) ;
997
1007
return ( 1 , None ) ;
@@ -1649,13 +1659,46 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1649
1659
} else {
1650
1660
None
1651
1661
} ;
1652
- let ( _, _, analysis_result_and_cost) =
1662
+ let ( _, _, analysis_result_and_cost) = if let Some ( shared_analysis_db) =
1663
+ shared_analysis_db
1664
+ {
1665
+ // Use shared analysis database for contract dependency resolution
1653
1666
in_block ( header_db, marf_kv, |header_db, mut marf| {
1654
1667
let analysis_result =
1655
1668
run_analysis ( & contract_identifier, & mut ast, & header_db, & mut marf, true ) ;
1656
1669
match analysis_result {
1657
1670
Err ( e) => ( header_db, marf, Err ( e) ) ,
1658
- Ok ( analysis) => {
1671
+ Ok ( contract_analysis) => {
1672
+ let result_and_cost = with_env_costs (
1673
+ mainnet,
1674
+ & header_db,
1675
+ & mut marf,
1676
+ coverage. as_mut ( ) ,
1677
+ |vm_env| {
1678
+ // Use the shared analysis database for contract initialization
1679
+ vm_env. initialize_versioned_contract_with_db (
1680
+ contract_identifier,
1681
+ ClarityVersion :: Clarity2 ,
1682
+ & contract_content,
1683
+ None ,
1684
+ ASTRules :: PrecheckSize ,
1685
+ shared_analysis_db,
1686
+ )
1687
+ } ,
1688
+ ) ;
1689
+ let ( result, cost) = result_and_cost;
1690
+ ( header_db, marf, Ok ( ( contract_analysis, ( result, cost) ) ) )
1691
+ }
1692
+ }
1693
+ } )
1694
+ } else {
1695
+ // Original behavior without shared analysis database
1696
+ in_block ( header_db, marf_kv, |header_db, mut marf| {
1697
+ let analysis_result =
1698
+ run_analysis ( & contract_identifier, & mut ast, & header_db, & mut marf, true ) ;
1699
+ match analysis_result {
1700
+ Err ( e) => ( header_db, marf, Err ( e) ) ,
1701
+ Ok ( contract_analysis) => {
1659
1702
let result_and_cost = with_env_costs (
1660
1703
mainnet,
1661
1704
& header_db,
@@ -1672,10 +1715,11 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1672
1715
} ,
1673
1716
) ;
1674
1717
let ( result, cost) = result_and_cost;
1675
- ( header_db, marf, Ok ( ( analysis , ( result, cost) ) ) )
1718
+ ( header_db, marf, Ok ( ( contract_analysis , ( result, cost) ) ) )
1676
1719
}
1677
1720
}
1678
- } ) ;
1721
+ } )
1722
+ } ;
1679
1723
1680
1724
match analysis_result_and_cost {
1681
1725
Ok ( ( contract_analysis, ( Ok ( ( _x, asset_map, events) ) , cost) ) ) => {
@@ -2028,15 +2072,21 @@ mod test {
2028
2072
assert_eq ! ( exit, 0 ) ;
2029
2073
assert ! ( !result[ "message" ] . as_str( ) . unwrap( ) . is_empty( ) ) ;
2030
2074
2075
+ // Create a shared analysis database for contract dependency resolution
2076
+ let mut store = MemoryBackingStore :: new ( ) ;
2077
+ let mut analysis_db = store. as_analysis_db ( ) ;
2078
+ analysis_db. begin ( ) ;
2079
+
2031
2080
eprintln ! ( "launch tokens" ) ;
2032
- let invoked = invoke_command (
2081
+ let invoked = invoke_command_with_analysis_db (
2033
2082
"test" ,
2034
2083
& [
2035
2084
"launch" . to_string ( ) ,
2036
2085
"S1G2081040G2081040G2081040G208105NK8PE5.tokens" . to_string ( ) ,
2037
2086
cargo_workspace_as_string ( "sample/contracts/tokens.clar" ) ,
2038
2087
db_name. clone ( ) ,
2039
2088
] ,
2089
+ Some ( & mut analysis_db) ,
2040
2090
) ;
2041
2091
2042
2092
let exit = invoked. 0 ;
@@ -2117,7 +2167,7 @@ mod test {
2117
2167
assert ! ( result[ "assets" ] == json!( null) ) ;
2118
2168
2119
2169
eprintln ! ( "launch names with costs and assets" ) ;
2120
- let invoked = invoke_command (
2170
+ let invoked = invoke_command_with_analysis_db (
2121
2171
"test" ,
2122
2172
& [
2123
2173
"launch" . to_string ( ) ,
@@ -2127,6 +2177,7 @@ mod test {
2127
2177
"--assets" . to_string ( ) ,
2128
2178
db_name. clone ( ) ,
2129
2179
] ,
2180
+ Some ( & mut analysis_db) ,
2130
2181
) ;
2131
2182
2132
2183
let exit = invoked. 0 ;
0 commit comments