Skip to content

Commit

Permalink
Add new file_content_type for PreviewProvider subclasses
Browse files Browse the repository at this point in the history
Fixes #2860.
  • Loading branch information
Jeehut committed Feb 1, 2020
1 parent ed54fd6 commit f0797a5
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 29 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@
grouping it with initializers.
[Steven Magdy](https://github.com/StevenMagdy)

* Add case `preview_provider` to the order list of `file_types_order` to fix
an issue with false positives for `PreviewProvider` subclasses in SwiftUI.
[Cihat Gündüz](https://github.com/Jeehut)
[#2860](https://github.com/realm/SwiftLint/issues/2860)

#### Bug Fixes

* Fix `discarded_notification_center_observer` false positives when
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@ enum FileType: String {
case supportingType = "supporting_type"
case mainType = "main_type"
case `extension` = "extension"
case previewProvider = "preview_provider"
}

public struct FileTypesOrderConfiguration: RuleConfiguration, Equatable {
private(set) var severityConfiguration = SeverityConfiguration(.warning)
private(set) var order: [[FileType]] = [
[.supportingType],
[.mainType],
[.extension]
[.extension],
[.previewProvider]
]

public var consoleDescription: String {
Expand Down
19 changes: 17 additions & 2 deletions Source/SwiftLintFramework/Rules/Style/FileTypesOrderRule.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ public struct FileTypesOrderRule: ConfigurationProviderRule, OptInRule {
mainTypeSubstructure: mainTypeSubstructure
)

let previewProviderSubstructures = self.previewProviderSubstructures(in: file)

let mainTypeOffset: [FileTypeOffset] = [(.mainType, mainTypeSubstuctureOffset)]
let extensionOffsets: [FileTypeOffset] = extensionsSubstructures.compactMap { substructure in
guard let offset = substructure.offset else { return nil }
Expand All @@ -43,10 +45,14 @@ public struct FileTypesOrderRule: ConfigurationProviderRule, OptInRule {
return (.supportingType, offset)
}

let orderedFileTypeOffsets = (mainTypeOffset + extensionOffsets + supportingTypeOffsets).sorted { lhs, rhs in
return lhs.offset < rhs.offset
let previewProviderOffsets: [FileTypeOffset] = previewProviderSubstructures.compactMap { substructure in
guard let offset = substructure.offset else { return nil }
return (.previewProvider, offset)
}

let allOffsets = mainTypeOffset + extensionOffsets + supportingTypeOffsets + previewProviderOffsets
let orderedFileTypeOffsets = allOffsets.sorted { lhs, rhs in lhs.offset < rhs.offset }

var violations = [StyleViolation]()

var lastMatchingIndex = -1
Expand Down Expand Up @@ -106,12 +112,19 @@ public struct FileTypesOrderRule: ConfigurationProviderRule, OptInRule {
let dict = file.structureDictionary
return dict.substructure.filter { substructure in
guard let declarationKind = substructure.declarationKind else { return false }
guard !substructure.inheritedTypes.contains("PreviewProvider") else { return false }

return substructure.offset != mainTypeSubstructure.offset &&
supportingTypeKinds.contains(declarationKind)
}
}

private func previewProviderSubstructures(in file: SwiftLintFile) -> [SourceKittenDictionary] {
return file.structureDictionary.substructure.filter { substructure in
return substructure.inheritedTypes.contains("PreviewProvider")
}
}

private func mainTypeSubstructure(in file: SwiftLintFile) -> SourceKittenDictionary? {
let dict = file.structureDictionary

Expand All @@ -133,6 +146,8 @@ public struct FileTypesOrderRule: ConfigurationProviderRule, OptInRule {

let priorityKindSubstructures = dict.substructure.filter { substructure in
guard let kind = substructure.declarationKind else { return false }
guard !substructure.inheritedTypes.contains("PreviewProvider") else { return false }

return priorityKinds.contains(kind)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,18 +60,10 @@ internal struct FileTypesOrderRuleExamples {
// Life-Cycle Methods
override func viewDidLoad() {
super.viewDidLoad()
view1.setNeedsLayout()
view1.layoutIfNeeded()
hasLayoutedView1 = true
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
view2.setNeedsLayout()
view2.layoutIfNeeded()
hasLayoutedView2 = true
}
// IBActions
Expand Down Expand Up @@ -115,10 +107,6 @@ internal struct FileTypesOrderRuleExamples {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return UITableViewCell()
}
}
"""
]
Expand All @@ -130,6 +118,17 @@ internal struct FileTypesOrderRuleExamples {
extension Foo {}
extension Bar {
}
""",
"""
struct ContentView: View {
var body: some View {
Text("Hello, World!")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View { ContentView() }
}
"""
]

Expand All @@ -148,10 +147,6 @@ internal struct FileTypesOrderRuleExamples {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return UITableViewCell()
}
}
class TestViewController: UIViewController {}
Expand Down Expand Up @@ -180,10 +175,6 @@ internal struct FileTypesOrderRuleExamples {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return UITableViewCell()
}
}
class TestViewController: UIViewController {}
Expand All @@ -193,11 +184,14 @@ internal struct FileTypesOrderRuleExamples {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return UITableViewCell()
}
}
""",
"""
// Preview Provider
↓struct ContentView_Previews: PreviewProvider {}
// Main Type
struct ContentView: View {}
"""
]
}
15 changes: 13 additions & 2 deletions Tests/SwiftLintFrameworkTests/FileTypesOrderRuleTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,17 @@ class FileTypesOrderRuleTests: XCTestCase {
protocol TestViewControllerDelegate {
func didPressTrackedButton()
}
""",
"""
↓struct ContentView: View {
var body: some View {
Text("Hello, World!")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View { ContentView() }
}
"""
]

Expand All @@ -59,7 +70,7 @@ class FileTypesOrderRuleTests: XCTestCase {
verifyRule(
reversedOrderDescription,
ruleConfiguration: [
"order": ["extension", "main_type", "supporting_type"]
"order": ["preview_provider", "extension", "main_type", "supporting_type"]
]
)
}
Expand Down Expand Up @@ -125,7 +136,7 @@ class FileTypesOrderRuleTests: XCTestCase {
verifyRule(
groupedOrderDescription,
ruleConfiguration: [
"order": ["main_type", ["extension", "supporting_type"]]
"order": ["main_type", ["extension", "supporting_type"], "preview_provider"]
]
)
}
Expand Down

0 comments on commit f0797a5

Please # to comment.