11// SPDX-License-Identifier: GPL-3.0-or-later
22
3+ use super :: clang;
34use super :: formats:: { JsonCompilationDatabase , SerializationError , SerializationFormat } ;
45use super :: { WriterCreationError , WriterError } ;
5- use crate :: semantic:: clang:: { DuplicateEntryFilter , Entry } ;
66use crate :: { config, semantic} ;
77use std:: { fs, io, path} ;
88
@@ -19,24 +19,26 @@ pub(super) trait IteratorWriter<T> {
1919}
2020
2121/// The type represents a converter that formats `semantic::Command` instances into `Entry` objects.
22- pub ( super ) struct ConverterClangOutputWriter < T : IteratorWriter < Entry > > {
23- converter : semantic :: clang:: CommandConverter ,
22+ pub ( super ) struct ConverterClangOutputWriter < T : IteratorWriter < clang :: Entry > > {
23+ converter : clang:: CommandConverter ,
2424 writer : T ,
2525}
2626
27- impl < T : IteratorWriter < Entry > > ConverterClangOutputWriter < T > {
27+ impl < T : IteratorWriter < clang :: Entry > > ConverterClangOutputWriter < T > {
2828 pub ( super ) fn new (
2929 writer : T ,
3030 format : & config:: Format ,
31- ) -> Result < Self , semantic :: clang:: FormatConfigurationError > {
31+ ) -> Result < Self , clang:: FormatConfigurationError > {
3232 Ok ( Self {
33- converter : semantic :: clang:: CommandConverter :: new ( format. clone ( ) ) ?,
33+ converter : clang:: CommandConverter :: new ( format. clone ( ) ) ?,
3434 writer,
3535 } )
3636 }
3737}
3838
39- impl < T : IteratorWriter < Entry > > IteratorWriter < semantic:: Command > for ConverterClangOutputWriter < T > {
39+ impl < T : IteratorWriter < clang:: Entry > > IteratorWriter < semantic:: Command >
40+ for ConverterClangOutputWriter < T >
41+ {
4042 fn write ( self , semantics : impl Iterator < Item = semantic:: Command > ) -> Result < ( ) , WriterError > {
4143 let entries = semantics. flat_map ( |semantic| self . converter . to_entries ( & semantic) ) ;
4244 self . writer . write ( entries)
@@ -52,12 +54,12 @@ impl<T: IteratorWriter<Entry>> IteratorWriter<semantic::Command> for ConverterCl
5254///
5355/// # Note
5456/// Reading errors will be ignored, and a warning will be logged.
55- pub ( super ) struct AppendClangOutputWriter < T : IteratorWriter < Entry > > {
57+ pub ( super ) struct AppendClangOutputWriter < T : IteratorWriter < clang :: Entry > > {
5658 writer : T ,
5759 path : Option < path:: PathBuf > ,
5860}
5961
60- impl < T : IteratorWriter < Entry > > AppendClangOutputWriter < T > {
62+ impl < T : IteratorWriter < clang :: Entry > > AppendClangOutputWriter < T > {
6163 pub ( super ) fn new ( writer : T , input_path : & path:: Path , append : bool ) -> Self {
6264 let path = if input_path. exists ( ) {
6365 Some ( input_path. to_path_buf ( ) )
@@ -76,7 +78,7 @@ impl<T: IteratorWriter<Entry>> AppendClangOutputWriter<T> {
7678 /// because the logic is not bound to the instance.
7779 fn read_from_compilation_db (
7880 source : & path:: Path ,
79- ) -> Result < impl Iterator < Item = Entry > , SerializationError > {
81+ ) -> Result < impl Iterator < Item = clang :: Entry > , SerializationError > {
8082 let file = fs:: File :: open ( source) . map ( io:: BufReader :: new) ?;
8183
8284 let entries = JsonCompilationDatabase :: read_and_ignore ( file, |error| {
@@ -86,8 +88,8 @@ impl<T: IteratorWriter<Entry>> AppendClangOutputWriter<T> {
8688 }
8789}
8890
89- impl < T : IteratorWriter < Entry > > IteratorWriter < Entry > for AppendClangOutputWriter < T > {
90- fn write ( self , entries : impl Iterator < Item = Entry > ) -> Result < ( ) , WriterError > {
91+ impl < T : IteratorWriter < clang :: Entry > > IteratorWriter < clang :: Entry > for AppendClangOutputWriter < T > {
92+ fn write ( self , entries : impl Iterator < Item = clang :: Entry > ) -> Result < ( ) , WriterError > {
9193 if let Some ( path) = & self . path {
9294 let entries_from_db = Self :: read_from_compilation_db ( path)
9395 . map_err ( |err| WriterError :: Io ( path. clone ( ) , err) ) ?;
@@ -103,13 +105,13 @@ impl<T: IteratorWriter<Entry>> IteratorWriter<Entry> for AppendClangOutputWriter
103105///
104106/// The file is first written to a temporary file and then renamed to the final file name.
105107/// This ensures that the output file is not left in an inconsistent state in case of errors.
106- pub ( super ) struct AtomicClangOutputWriter < T : IteratorWriter < Entry > > {
108+ pub ( super ) struct AtomicClangOutputWriter < T : IteratorWriter < clang :: Entry > > {
107109 writer : T ,
108110 temp_path : path:: PathBuf ,
109111 final_path : path:: PathBuf ,
110112}
111113
112- impl < T : IteratorWriter < Entry > > AtomicClangOutputWriter < T > {
114+ impl < T : IteratorWriter < clang :: Entry > > AtomicClangOutputWriter < T > {
113115 pub ( super ) fn new ( writer : T , temp_path : & path:: Path , final_path : & path:: Path ) -> Self {
114116 Self {
115117 writer,
@@ -119,8 +121,8 @@ impl<T: IteratorWriter<Entry>> AtomicClangOutputWriter<T> {
119121 }
120122}
121123
122- impl < T : IteratorWriter < Entry > > IteratorWriter < Entry > for AtomicClangOutputWriter < T > {
123- fn write ( self , entries : impl Iterator < Item = Entry > ) -> Result < ( ) , WriterError > {
124+ impl < T : IteratorWriter < clang :: Entry > > IteratorWriter < clang :: Entry > for AtomicClangOutputWriter < T > {
125+ fn write ( self , entries : impl Iterator < Item = clang :: Entry > ) -> Result < ( ) , WriterError > {
124126 self . writer . write ( entries) ?;
125127
126128 fs:: rename ( & self . temp_path , & self . final_path )
@@ -134,25 +136,25 @@ impl<T: IteratorWriter<Entry>> IteratorWriter<Entry> for AtomicClangOutputWriter
134136///
135137/// # Features
136138/// - Filters duplicates based on the provided configuration.
137- pub ( super ) struct UniqueOutputWriter < T : IteratorWriter < Entry > > {
139+ pub ( super ) struct UniqueOutputWriter < T : IteratorWriter < clang :: Entry > > {
138140 writer : T ,
139- filter : DuplicateEntryFilter ,
141+ filter : clang :: DuplicateEntryFilter ,
140142}
141143
142- impl < T : IteratorWriter < Entry > > UniqueOutputWriter < T > {
144+ impl < T : IteratorWriter < clang :: Entry > > UniqueOutputWriter < T > {
143145 pub ( super ) fn create (
144146 writer : T ,
145147 config : & config:: DuplicateFilter ,
146148 ) -> Result < Self , WriterCreationError > {
147- let filter = DuplicateEntryFilter :: try_from ( config. clone ( ) )
149+ let filter = clang :: DuplicateEntryFilter :: try_from ( config. clone ( ) )
148150 . map_err ( |err| WriterCreationError :: Configuration ( err. to_string ( ) ) ) ?;
149151
150152 Ok ( Self { writer, filter } )
151153 }
152154}
153155
154- impl < T : IteratorWriter < Entry > > IteratorWriter < Entry > for UniqueOutputWriter < T > {
155- fn write ( self , entries : impl Iterator < Item = Entry > ) -> Result < ( ) , WriterError > {
156+ impl < T : IteratorWriter < clang :: Entry > > IteratorWriter < clang :: Entry > for UniqueOutputWriter < T > {
157+ fn write ( self , entries : impl Iterator < Item = clang :: Entry > ) -> Result < ( ) , WriterError > {
156158 let mut filter = self . filter . clone ( ) ;
157159 let filtered_entries = entries. filter ( move |entry| filter. unique ( entry) ) ;
158160
@@ -183,8 +185,8 @@ impl ClangOutputWriter {
183185 }
184186}
185187
186- impl IteratorWriter < Entry > for ClangOutputWriter {
187- fn write ( self , entries : impl Iterator < Item = Entry > ) -> Result < ( ) , WriterError > {
188+ impl IteratorWriter < clang :: Entry > for ClangOutputWriter {
189+ fn write ( self , entries : impl Iterator < Item = clang :: Entry > ) -> Result < ( ) , WriterError > {
188190 JsonCompilationDatabase :: write ( self . output , entries)
189191 . map_err ( |err| WriterError :: Io ( self . path , err) )
190192 }
@@ -198,8 +200,8 @@ mod tests {
198200
199201 struct MockWriter ;
200202
201- impl IteratorWriter < Entry > for MockWriter {
202- fn write ( self , _: impl Iterator < Item = Entry > ) -> Result < ( ) , WriterError > {
203+ impl IteratorWriter < clang :: Entry > for MockWriter {
204+ fn write ( self , _: impl Iterator < Item = clang :: Entry > ) -> Result < ( ) , WriterError > {
203205 Ok ( ( ) )
204206 }
205207 }
@@ -261,8 +263,18 @@ mod tests {
261263 let result_path = dir. path ( ) . join ( "result_file.json" ) ;
262264
263265 let entries_to_write = vec ! [
264- Entry :: from_arguments_str( "file1.cpp" , vec![ "clang" , "-c" ] , "/path/to/dir" , None ) ,
265- Entry :: from_arguments_str( "file2.cpp" , vec![ "clang" , "-c" ] , "/path/to/dir" , None ) ,
266+ clang:: Entry :: from_arguments_str(
267+ "file1.cpp" ,
268+ vec![ "clang" , "-c" ] ,
269+ "/path/to/dir" ,
270+ None ,
271+ ) ,
272+ clang:: Entry :: from_arguments_str(
273+ "file2.cpp" ,
274+ vec![ "clang" , "-c" ] ,
275+ "/path/to/dir" ,
276+ None ,
277+ ) ,
266278 ] ;
267279
268280 let writer = ClangOutputWriter :: create ( & result_path) . unwrap ( ) ;
@@ -284,15 +296,35 @@ mod tests {
284296
285297 // Create the original file with some entries
286298 let original_entries = vec ! [
287- Entry :: from_arguments_str( "file3.cpp" , vec![ "clang" , "-c" ] , "/path/to/dir" , None ) ,
288- Entry :: from_arguments_str( "file4.cpp" , vec![ "clang" , "-c" ] , "/path/to/dir" , None ) ,
299+ clang:: Entry :: from_arguments_str(
300+ "file3.cpp" ,
301+ vec![ "clang" , "-c" ] ,
302+ "/path/to/dir" ,
303+ None ,
304+ ) ,
305+ clang:: Entry :: from_arguments_str(
306+ "file4.cpp" ,
307+ vec![ "clang" , "-c" ] ,
308+ "/path/to/dir" ,
309+ None ,
310+ ) ,
289311 ] ;
290312 let writer = ClangOutputWriter :: create ( & input_path) . unwrap ( ) ;
291313 writer. write ( original_entries. into_iter ( ) ) . unwrap ( ) ;
292314
293315 let new_entries = vec ! [
294- Entry :: from_arguments_str( "file1.cpp" , vec![ "clang" , "-c" ] , "/path/to/dir" , None ) ,
295- Entry :: from_arguments_str( "file2.cpp" , vec![ "clang" , "-c" ] , "/path/to/dir" , None ) ,
316+ clang:: Entry :: from_arguments_str(
317+ "file1.cpp" ,
318+ vec![ "clang" , "-c" ] ,
319+ "/path/to/dir" ,
320+ None ,
321+ ) ,
322+ clang:: Entry :: from_arguments_str(
323+ "file2.cpp" ,
324+ vec![ "clang" , "-c" ] ,
325+ "/path/to/dir" ,
326+ None ,
327+ ) ,
296328 ] ;
297329
298330 let writer = ClangOutputWriter :: create ( & result_path) . unwrap ( ) ;
0 commit comments