@@ -8,6 +8,7 @@ use revive_dt_compiler::{Compiler, CompilerInput, SolidityCompiler};
88use revive_dt_config:: Arguments ;
99use revive_dt_format:: { input:: Input , metadata:: Metadata , mode:: SolcMode } ;
1010use revive_dt_node_interaction:: EthereumNode ;
11+ use revive_dt_report:: reporter:: { CompilationTask , Report , Span } ;
1112use revive_solc_json_interface:: SolcStandardJsonOutput ;
1213
1314use crate :: Platform ;
@@ -19,6 +20,7 @@ type Contracts<T> = HashMap<
1920
2021pub struct State < ' a , T : Platform > {
2122 config : & ' a Arguments ,
23+ span : Span ,
2224 contracts : Contracts < T > ,
2325 deployed_contracts : HashMap < String , Address > ,
2426}
@@ -27,37 +29,65 @@ impl<'a, T> State<'a, T>
2729where
2830 T : Platform ,
2931{
30- pub fn new ( config : & ' a Arguments ) -> Self {
32+ pub fn new ( config : & ' a Arguments , span : Span ) -> Self {
3133 Self {
3234 config,
35+ span,
3336 contracts : Default :: default ( ) ,
3437 deployed_contracts : Default :: default ( ) ,
3538 }
3639 }
3740
41+ /// Returns a copy of the current span.
42+ fn span ( & self ) -> Span {
43+ self . span
44+ }
45+
3846 pub fn build_contracts ( & mut self , mode : & SolcMode , metadata : & Metadata ) -> anyhow:: Result < ( ) > {
47+ let mut span = self . span ( ) ;
48+ span. next_metadata (
49+ metadata
50+ . file_path
51+ . as_ref ( )
52+ . expect ( "metadata should have been read from a file" )
53+ . clone ( ) ,
54+ ) ;
55+
3956 let Some ( version) = mode. last_patch_version ( & self . config . solc ) else {
40- anyhow:: bail!( "unsupported solc version: {:?}" , mode. solc_version) ;
57+ anyhow:: bail!( "unsupported solc version: {:?}" , & mode. solc_version) ;
4158 } ;
4259
43- let sources = metadata. contract_sources ( ) ?;
44- let base_path = metadata. directory ( ) ?. display ( ) . to_string ( ) ;
60+ let mut compiler = Compiler :: < T :: Compiler > :: new ( )
61+ . base_path ( metadata. directory ( ) ?. display ( ) . to_string ( ) )
62+ . solc_optimizer ( mode. solc_optimize ( ) ) ;
4563
46- let mut compiler = Compiler :: < T :: Compiler > :: new ( ) . base_path ( base_path. clone ( ) ) ;
47- for ( file, _contract) in sources. values ( ) {
64+ for ( file, _contract) in metadata. contract_sources ( ) ?. values ( ) {
4865 log:: debug!( "contract source {}" , file. display( ) ) ;
4966 compiler = compiler. with_source ( file) ?;
5067 }
5168
52- let compiler_path = T :: Compiler :: get_compiler_executable ( self . config , version ) ? ;
53-
54- let output = compiler
55- . solc_optimizer ( mode. solc_optimize ( ) )
56- . try_build ( compiler_path ) ? ;
57-
58- self . contracts . insert ( output . input , output . output ) ;
69+ let mut task = CompilationTask {
70+ json_input : compiler . input ( ) ,
71+ json_output : None ,
72+ mode : mode . clone ( ) ,
73+ compiler_version : format ! ( "{}" , & version ) ,
74+ error : None ,
75+ } ;
5976
60- Ok ( ( ) )
77+ let compiler_path = T :: Compiler :: get_compiler_executable ( self . config , version) ?;
78+ match compiler. try_build ( compiler_path) {
79+ Ok ( output) => {
80+ task. json_output = Some ( output. output . clone ( ) ) ;
81+ task. error = output. error ;
82+ self . contracts . insert ( output. input , output. output ) ;
83+ Report :: compilation ( span, T :: config_id ( ) , task) ;
84+ Ok ( ( ) )
85+ }
86+ Err ( error) => {
87+ task. error = Some ( error. to_string ( ) ) ;
88+ Err ( error)
89+ }
90+ }
6191 }
6292
6393 pub fn execute_input (
@@ -102,12 +132,12 @@ where
102132 }
103133 }
104134
105- pub fn execute ( & mut self ) -> anyhow:: Result < ( ) > {
135+ pub fn execute ( & mut self , span : Span ) -> anyhow:: Result < ( ) > {
106136 for mode in self . metadata . solc_modes ( ) {
107- let mut leader_state = State :: < L > :: new ( self . config ) ;
137+ let mut leader_state = State :: < L > :: new ( self . config , span ) ;
108138 leader_state. build_contracts ( & mode, self . metadata ) ?;
109139
110- let mut follower_state = State :: < F > :: new ( self . config ) ;
140+ let mut follower_state = State :: < F > :: new ( self . config , span ) ;
111141 follower_state. build_contracts ( & mode, self . metadata ) ?;
112142
113143 for case in & self . metadata . cases {
0 commit comments