@@ -110,10 +110,20 @@ pub(crate) fn check_noqa(
110110 && !exemption. includes ( Rule :: UnusedNOQA )
111111 && !per_file_ignores. contains ( Rule :: UnusedNOQA )
112112 {
113- for line in noqa_directives. lines ( ) {
114- match & line. directive {
113+ let directives = noqa_directives
114+ . lines ( )
115+ . iter ( )
116+ . map ( |line| ( & line. directive , & line. matches , false ) )
117+ . chain (
118+ file_noqa_directives
119+ . lines ( )
120+ . iter ( )
121+ . map ( |line| ( & line. parsed_file_exemption , & line. matches , true ) ) ,
122+ ) ;
123+ for ( directive, matches, is_file_level) in directives {
124+ match directive {
115125 Directive :: All ( directive) => {
116- if line . matches . is_empty ( ) {
126+ if matches. is_empty ( ) {
117127 let edit = delete_comment ( directive. range ( ) , locator) ;
118128 let mut diagnostic =
119129 Diagnostic :: new ( UnusedNOQA { codes : None } , directive. range ( ) ) ;
@@ -139,15 +149,21 @@ pub(crate) fn check_noqa(
139149
140150 if !seen_codes. insert ( original_code) {
141151 duplicated_codes. push ( original_code) ;
142- } else if line. matches . iter ( ) . any ( |match_| * match_ == code)
143- || settings
152+ } else {
153+ let is_code_used = if is_file_level {
154+ diagnostics
155+ . iter ( )
156+ . any ( |diag| diag. kind . rule ( ) . noqa_code ( ) == code)
157+ } else {
158+ matches. iter ( ) . any ( |match_| * match_ == code)
159+ } || settings
144160 . external
145161 . iter ( )
146- . any ( |external| code. starts_with ( external) )
147- {
148- valid_codes . push ( original_code ) ;
149- } else {
150- if let Ok ( rule) = Rule :: from_code ( code) {
162+ . any ( |external| code. starts_with ( external) ) ;
163+
164+ if is_code_used {
165+ valid_codes . push ( original_code ) ;
166+ } else if let Ok ( rule) = Rule :: from_code ( code) {
151167 if settings. rules . enabled ( rule) {
152168 unmatched_codes. push ( original_code) ;
153169 } else {
@@ -171,8 +187,13 @@ pub(crate) fn check_noqa(
171187 let edit = if valid_codes. is_empty ( ) {
172188 delete_comment ( directive. range ( ) , locator)
173189 } else {
190+ let prefix = if is_file_level {
191+ "# ruff: noqa: "
192+ } else {
193+ "# noqa: "
194+ } ;
174195 Edit :: range_replacement (
175- format ! ( "# noqa: {}" , valid_codes. join( ", " ) ) ,
196+ format ! ( "{}{}" , prefix , valid_codes. join( ", " ) ) ,
176197 directive. range ( ) ,
177198 )
178199 } ;
0 commit comments