Skip to content

Commit

Permalink
realm#2353 - Make modifier_oder rule correctable
Browse files Browse the repository at this point in the history
  • Loading branch information
abdulowork committed Dec 20, 2018
1 parent b048521 commit 967adb8
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 2 deletions.
2 changes: 1 addition & 1 deletion Rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -10782,7 +10782,7 @@ public let b: Int

Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`modifier_order` | Disabled | No | style | No | 4.1.0
`modifier_order` | Disabled | Yes | style | No | 4.1.0

Modifier order should be consistent.

Expand Down
4 changes: 4 additions & 0 deletions Source/SwiftLintFramework/Extensions/File+SwiftLint.swift
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,10 @@ extension File {
return violatingRanges
}

internal func ruleEnabled(violatingRange: NSRange, for rule: Rule) -> NSRange? {
return ruleEnabled(violatingRanges: [violatingRange], for: rule).first
}

fileprivate func numberOfCommentAndWhitespaceOnlyLines(startLine: Int, endLine: Int) -> Int {
let commentKinds = SyntaxKind.commentKinds
return syntaxKindsByLines[startLine...endLine].filter { kinds in
Expand Down
68 changes: 67 additions & 1 deletion Source/SwiftLintFramework/Rules/Style/ModifierOrderRule.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import SourceKittenFramework

public struct ModifierOrderRule: ASTRule, OptInRule, ConfigurationProviderRule {
public struct ModifierOrderRule: ASTRule, OptInRule, ConfigurationProviderRule, CorrectableRule {
public var configuration = ModifierOrderConfiguration(
preferredModifierOrder: [
.override,
Expand Down Expand Up @@ -55,6 +55,72 @@ public struct ModifierOrderRule: ASTRule, OptInRule, ConfigurationProviderRule {
}
}

public func correct(file: File) -> [Correction] {
return correct(file: file, dictionary: file.structure.dictionary)
}

private func correct(file: File, dictionary: [String: SourceKitRepresentable]) -> [Correction] {
return dictionary.substructure.flatMap { subDict -> [Correction] in
var corrections = correct(file: file, dictionary: subDict)

if let kindString = subDict.kind,
let kind = KindType(rawValue: kindString) {
corrections += correct(file: file, kind: kind, dictionary: subDict)
}

return corrections
}
}

private func correct(file: File,
kind: SwiftDeclarationKind,
dictionary: [String: SourceKitRepresentable]) -> [Correction] {
guard let offset = dictionary.offset else { return [] }
let originalContents = file.contents.bridge()
let violatingRanges = violatingModifiers(dictionary: dictionary)
.compactMap { preferred, declared -> (NSRange, NSRange)? in
guard
let preferredRange = originalContents.byteRangeToNSRange(
start: preferred.offset,
length: preferred.length
).flatMap({ file.ruleEnabled(violatingRange: $0, for: self) }),
let declaredRange = originalContents.byteRangeToNSRange(
start: declared.offset,
length: declared.length
).flatMap({ file.ruleEnabled(violatingRange: $0, for: self) }) else {
return nil
}
return (preferredRange, declaredRange)
}

let corrections: [Correction]
if violatingRanges.isEmpty {
corrections = []
} else {
var correctedContents = originalContents

violatingRanges.reversed().forEach { preferredModifierRange, declaredModifierRange in
correctedContents = correctedContents.replacingCharacters(
in: declaredModifierRange,
with: originalContents.substring(with: preferredModifierRange)
).bridge()
}

file.write(correctedContents.bridge())

corrections = [
Correction(
ruleDescription: type(of: self).description,
location: Location(
file: file,
byteOffset: offset
)
)
]
}
return corrections
}

private func violatableModifiers(declaredModifiers: [ModifierDescription]) -> [ModifierDescription] {
let preferredModifierGroups = ([.atPrefixed] + configuration.preferredModifierOrder)
return declaredModifiers.filter { preferredModifierGroups.contains($0.group) }
Expand Down

0 comments on commit 967adb8

Please sign in to comment.