11import Foundation
22import SourceKittenFramework
3+ import SwiftLintCore
34
45// swiftlint:disable file_length
56
@@ -95,6 +96,32 @@ private extension Rule {
9596 compilerArguments: [ String ] ) -> LintResult {
9697 let ruleID = Self . identifier
9798
99+ // Wrap entire lint process including shouldRun check in rule context
100+ return CurrentRule . $identifier. withValue ( ruleID) {
101+ guard shouldRun ( onFile: file) else {
102+ return LintResult ( violations: [ ] , ruleTime: nil , deprecatedToValidIDPairs: [ ] )
103+ }
104+
105+ return performLint (
106+ file: file,
107+ regions: regions,
108+ benchmark: benchmark,
109+ storage: storage,
110+ superfluousDisableCommandRule: superfluousDisableCommandRule,
111+ compilerArguments: compilerArguments
112+ )
113+ }
114+ }
115+
116+ // swiftlint:disable:next function_parameter_count
117+ private func performLint( file: SwiftLintFile ,
118+ regions: [ Region ] ,
119+ benchmark: Bool ,
120+ storage: RuleStorage ,
121+ superfluousDisableCommandRule: SuperfluousDisableCommandRule ? ,
122+ compilerArguments: [ String ] ) -> LintResult {
123+ let ruleID = Self . identifier
124+
98125 let violations : [ StyleViolation ]
99126 let ruleTime : ( String , Double ) ?
100127 if benchmark {
@@ -116,11 +143,11 @@ private extension Rule {
116143 }
117144
118145 let customRulesIDs : [ String ] = {
119- guard let customRules = self as? CustomRules else {
120- return [ ]
121- }
122- return customRules. customRuleIdentifiers
123- } ( )
146+ guard let customRules = self as? CustomRules else {
147+ return [ ]
148+ }
149+ return customRules. customRuleIdentifiers
150+ } ( )
124151 let ruleIDs = Self . description. allIdentifiers +
125152 customRulesIDs +
126153 ( superfluousDisableCommandRule. map ( { type ( of: $0) } ) ? . description. allIdentifiers ?? [ ] ) +
@@ -247,7 +274,11 @@ public struct Linter {
247274 /// - returns: A linter capable of checking for violations after running each rule's collection step.
248275 public func collect( into storage: RuleStorage ) -> CollectedLinter {
249276 DispatchQueue . concurrentPerform ( iterations: rules. count) { idx in
250- rules [ idx] . collectInfo ( for: file, into: storage, compilerArguments: compilerArguments)
277+ let rule = rules [ idx]
278+ let ruleID = type ( of: rule) . identifier
279+ CurrentRule . $identifier. withValue ( ruleID) {
280+ rule. collectInfo ( for: file, into: storage, compilerArguments: compilerArguments)
281+ }
251282 }
252283 return CollectedLinter ( from: self )
253284 }
@@ -306,15 +337,11 @@ public struct CollectedLinter {
306337 let superfluousDisableCommandRule = rules. first ( where: {
307338 $0 is SuperfluousDisableCommandRule
308339 } ) as? SuperfluousDisableCommandRule
309- let validationResults : [ LintResult ] = rules. parallelCompactMap {
310- guard $0. shouldRun ( onFile: file) else {
311- return nil
312- }
313-
314- return $0. lint ( file: file, regions: regions, benchmark: benchmark,
315- storage: storage,
316- superfluousDisableCommandRule: superfluousDisableCommandRule,
317- compilerArguments: compilerArguments)
340+ let validationResults : [ LintResult ] = rules. parallelMap {
341+ $0. lint ( file: file, regions: regions, benchmark: benchmark,
342+ storage: storage,
343+ superfluousDisableCommandRule: superfluousDisableCommandRule,
344+ compilerArguments: compilerArguments)
318345 }
319346 let undefinedSuperfluousCommandViolations = self . undefinedSuperfluousCommandViolations (
320347 regions: regions, configuration: configuration,
@@ -381,17 +408,20 @@ public struct CollectedLinter {
381408 }
382409
383410 var corrections = [ String: Int] ( )
384- for rule in rules where rule. shouldRun ( onFile: file) {
385- guard let rule = rule as? any CorrectableRule else {
386- continue
411+ for rule in rules. compactMap ( { $0 as? any CorrectableRule } ) {
412+ // Set rule context before checking shouldRun to allow file property access
413+ let ruleCorrections = CurrentRule . $identifier. withValue ( type ( of: rule) . identifier) { ( ) -> Int ? in
414+ guard rule. shouldRun ( onFile: file) else {
415+ return nil
416+ }
417+ return rule. correct ( file: file, using: storage, compilerArguments: compilerArguments)
387418 }
388- let corrected = rule. correct ( file: file, using: storage, compilerArguments: compilerArguments)
389- if corrected != 0 {
419+ if let corrected = ruleCorrections, corrected != 0 {
390420 corrections [ type ( of: rule) . description. identifier] = corrected
391421 if !file. isVirtual {
392422 file. invalidateCache ( )
393423 }
394- }
424+ }
395425 }
396426 return corrections
397427 }
0 commit comments