@@ -189,6 +189,7 @@ def _apply(
189189 self ,
190190 context : CodemodExecutionContext ,
191191 rules : list [str ],
192+ hardening : bool ,
192193 ) -> None | TokenUsage :
193194 if self .provider and (
194195 not (provider := context .providers .get_provider (self .provider ))
@@ -226,21 +227,26 @@ def _apply(
226227 logger .debug ("No files matched for %s" , self .id )
227228 return None
228229
229- # Do each result independently
230- if results :
230+ # Do each result independently and outputs the diffs
231+ if not hardening :
231232 # gather positional arguments for the map
232- resultset_arguments = []
233+ resultset_arguments : list [ ResultSet | None ] = []
233234 path_arguments = []
234- for result in results .results_for_rules (rules ):
235- # this need to be the same type of ResultSet as results
236- singleton = results .__class__ ()
237- singleton .add_result (result )
238- result_locations = self .get_files_to_analyze (context , singleton )
239- # We do an execution for each location in the result
240- # So we duplicate the resultset argument for each location
241- for loc in result_locations :
242- resultset_arguments .append (singleton )
243- path_arguments .append (loc )
235+ if results :
236+ for result in results .results_for_rules (rules ):
237+ # this need to be the same type of ResultSet as results
238+ singleton = results .__class__ ()
239+ singleton .add_result (result )
240+ result_locations = self .get_files_to_analyze (context , singleton )
241+ # We do an execution for each location in the result
242+ # So we duplicate the resultset argument for each location
243+ for loc in result_locations :
244+ resultset_arguments .append (singleton )
245+ path_arguments .append (loc )
246+ # An exception for find-and-fix codemods
247+ else :
248+ resultset_arguments = [None ]
249+ path_arguments = files_to_analyze
244250
245251 contexts : list = []
246252 with ThreadPoolExecutor () as executor :
@@ -251,13 +257,13 @@ def _apply(
251257 path , context , resultset , rules
252258 ),
253259 path_arguments ,
254- resultset_arguments ,
260+ resultset_arguments or [ None ] ,
255261 )
256262 )
257263 executor .shutdown (wait = True )
258264
259265 context .process_results (self .id , contexts )
260- # for find and fix codemods
266+ # Hardens all findings per file at once and writes the fixed code into the file
261267 else :
262268 process_file = functools .partial (
263269 self ._process_file , context = context , results = results , rules = rules
@@ -276,7 +282,9 @@ def _apply(
276282 context .process_results (self .id , contexts )
277283 return None
278284
279- def apply (self , context : CodemodExecutionContext ) -> None | TokenUsage :
285+ def apply (
286+ self , context : CodemodExecutionContext , hardening : bool = False
287+ ) -> None | TokenUsage :
280288 """
281289 Apply the codemod with the given codemod execution context
282290
@@ -292,7 +300,7 @@ def apply(self, context: CodemodExecutionContext) -> None | TokenUsage:
292300
293301 :param context: The codemod execution context
294302 """
295- return self ._apply (context , [self ._internal_name ])
303+ return self ._apply (context , [self ._internal_name ], hardening )
296304
297305 def _process_file (
298306 self ,
@@ -390,8 +398,10 @@ def __init__(
390398 if requested_rules :
391399 self .requested_rules .extend (requested_rules )
392400
393- def apply (self , context : CodemodExecutionContext ) -> None | TokenUsage :
394- return self ._apply (context , self .requested_rules )
401+ def apply (
402+ self , context : CodemodExecutionContext , hardening : bool = False
403+ ) -> None | TokenUsage :
404+ return self ._apply (context , self .requested_rules , hardening )
395405
396406 def get_files_to_analyze (
397407 self ,
0 commit comments