Skip to content

Commit fbb62d0

Browse files
committed
Adopt typed throws where possible
1 parent bef8acf commit fbb62d0

26 files changed

+121
-117
lines changed

Source/SwiftLintBuiltInRules/Rules/RuleConfigurations/DeploymentTargetConfiguration.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ struct DeploymentTargetConfiguration: SeverityBasedRuleConfiguration {
4747
self.patch = patch
4848
}
4949

50-
init(platform: Platform, value: Any) throws {
50+
init(platform: Platform, value: Any) throws(Issue) {
5151
let (major, minor, patch) = try Self.parseVersion(string: String(describing: value))
5252
self.init(platform: platform, major: major, minor: minor, patch: patch)
5353
}
@@ -56,18 +56,18 @@ struct DeploymentTargetConfiguration: SeverityBasedRuleConfiguration {
5656
platform.configurationKey
5757
}
5858

59-
private static func parseVersion(string: String) throws -> (Int, Int, Int) {
60-
func parseNumber(_ string: String) throws -> Int {
59+
private static func parseVersion(string: String) throws(Issue) -> (Int, Int, Int) {
60+
func parseNumber(_ string: String) throws(Issue) -> Int {
6161
guard let number = Int(string) else {
62-
throw Issue.invalidConfiguration(ruleID: Parent.identifier)
62+
throw .invalidConfiguration(ruleID: Parent.identifier)
6363
}
6464
return number
6565
}
6666

6767
let parts = string.components(separatedBy: ".")
6868
switch parts.count {
6969
case 0:
70-
throw Issue.invalidConfiguration(ruleID: Parent.identifier)
70+
throw .invalidConfiguration(ruleID: Parent.identifier)
7171
case 1:
7272
return (try parseNumber(parts[0]), 0, 0)
7373
case 2:
@@ -122,9 +122,9 @@ struct DeploymentTargetConfiguration: SeverityBasedRuleConfiguration {
122122
}
123123

124124
// swiftlint:disable:next cyclomatic_complexity
125-
mutating func apply(configuration: Any) throws {
125+
mutating func apply(configuration: Any) throws(Issue) {
126126
guard let configuration = configuration as? [String: Any] else {
127-
throw Issue.invalidConfiguration(ruleID: Parent.identifier)
127+
throw .invalidConfiguration(ruleID: Parent.identifier)
128128
}
129129
for (key, value) in configuration {
130130
if key == "severity", let value = value as? String {
@@ -148,14 +148,14 @@ struct DeploymentTargetConfiguration: SeverityBasedRuleConfiguration {
148148
try apply(value: value, to: \.tvOSDeploymentTarget, from: configuration)
149149
case tvOSAppExtensionDeploymentTarget.platform.configurationKey:
150150
tvOSAppExtensionDeploymentTarget = try Version(platform: .tvOSApplicationExtension, value: value)
151-
default: throw Issue.invalidConfiguration(ruleID: Parent.identifier)
151+
default: throw .invalidConfiguration(ruleID: Parent.identifier)
152152
}
153153
}
154154
}
155155

156156
private mutating func apply(value: Any,
157157
to target: WritableKeyPath<Self, Version>,
158-
from configuration: [String: Any]) throws {
158+
from configuration: [String: Any]) throws(Issue) {
159159
let platform = self[keyPath: target].platform
160160
self[keyPath: target] = try Version(platform: platform, value: value)
161161
if let counterpart = platform.appExtensionCounterpart,

Source/SwiftLintBuiltInRules/Rules/RuleConfigurations/ExpiringTodoConfiguration.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ struct ExpiringTodoConfiguration: RuleConfiguration {
1111
fileprivate(set) var opening: String
1212
fileprivate(set) var closing: String
1313

14-
init(fromAny value: Any, context ruleID: String) throws {
14+
init(fromAny value: Any, context ruleID: String) throws(Issue) {
1515
guard let dateDelimiters = value as? [String: String],
1616
let openingDelimiter = dateDelimiters["opening"],
1717
let closingDelimiter = dateDelimiters["closing"] else {
18-
throw Issue.invalidConfiguration(ruleID: ruleID)
18+
throw .invalidConfiguration(ruleID: ruleID)
1919
}
2020
self.init(opening: openingDelimiter, closing: closingDelimiter)
2121
}

Source/SwiftLintBuiltInRules/Rules/RuleConfigurations/FileHeaderConfiguration.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ struct FileHeaderConfiguration: SeverityBasedRuleConfiguration {
2626

2727
private static let defaultRegex = regex("\\bCopyright\\b", options: [.caseInsensitive])
2828

29-
mutating func apply(configuration: Any) throws {
29+
mutating func apply(configuration: Any) throws(Issue) {
3030
guard let configuration = configuration as? [String: String] else {
31-
throw Issue.invalidConfiguration(ruleID: Parent.identifier)
31+
throw .invalidConfiguration(ruleID: Parent.identifier)
3232
}
3333

3434
// Cache the created regexes if possible.

Source/SwiftLintBuiltInRules/Rules/RuleConfigurations/MissingDocsConfiguration.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ struct MissingDocsConfiguration: RuleConfiguration {
3131
$evaluateEffectiveAccessControlLevel.key => .flag(evaluateEffectiveAccessControlLevel)
3232
}
3333

34-
mutating func apply(configuration: Any) throws {
34+
mutating func apply(configuration: Any) throws(Issue) {
3535
guard let dict = configuration as? [String: Any] else {
36-
throw Issue.invalidConfiguration(ruleID: Parent.identifier)
36+
throw .invalidConfiguration(ruleID: Parent.identifier)
3737
}
3838

3939
if let shouldExcludeExtensions = dict[$excludesExtensions.key] as? Bool {
@@ -57,7 +57,7 @@ struct MissingDocsConfiguration: RuleConfiguration {
5757
}
5858
}
5959

60-
private func parameters(from dict: [String: Any]) throws -> [RuleParameter<AccessControlLevel>]? {
60+
private func parameters(from dict: [String: Any]) throws(Issue) -> [RuleParameter<AccessControlLevel>]? {
6161
var parameters: [RuleParameter<AccessControlLevel>] = []
6262

6363
for (key, value) in dict {
@@ -67,9 +67,9 @@ struct MissingDocsConfiguration: RuleConfiguration {
6767

6868
if let array = [String].array(of: value) {
6969
let rules: [RuleParameter<AccessControlLevel>] = try array
70-
.map { val -> RuleParameter<AccessControlLevel> in
70+
.map { val throws(Issue) -> RuleParameter<AccessControlLevel> in
7171
guard let acl = AccessControlLevel(description: val) else {
72-
throw Issue.invalidConfiguration(ruleID: Parent.identifier)
72+
throw .invalidConfiguration(ruleID: Parent.identifier)
7373
}
7474
return RuleParameter<AccessControlLevel>(severity: severity, value: acl)
7575
}
@@ -83,7 +83,7 @@ struct MissingDocsConfiguration: RuleConfiguration {
8383
}
8484

8585
guard parameters.count == parameters.map(\.value).unique.count else {
86-
throw Issue.invalidConfiguration(ruleID: Parent.identifier)
86+
throw .invalidConfiguration(ruleID: Parent.identifier)
8787
}
8888

8989
return parameters.isNotEmpty ? parameters : nil

Source/SwiftLintBuiltInRules/Rules/RuleConfigurations/ModifierOrderConfiguration.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ struct ModifierOrderConfiguration: SeverityBasedRuleConfiguration {
2424
}
2525

2626
extension SwiftDeclarationAttributeKind.ModifierGroup: AcceptableByConfigurationElement {
27-
public init(fromAny value: Any, context ruleID: String) throws {
27+
public init(fromAny value: Any, context ruleID: String) throws(Issue) {
2828
if let value = value as? String, let newSelf = Self(rawValue: value), newSelf != .atPrefixed {
2929
self = newSelf
3030
} else {
31-
throw Issue.invalidConfiguration(ruleID: ruleID)
31+
throw .invalidConfiguration(ruleID: ruleID)
3232
}
3333
}
3434

Source/SwiftLintBuiltInRules/Rules/RuleConfigurations/MultilineParametersConfiguration.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ struct MultilineParametersConfiguration: SeverityBasedRuleConfiguration {
1111
@ConfigurationElement(key: "max_number_of_single_line_parameters")
1212
private(set) var maxNumberOfSingleLineParameters: Int?
1313

14-
func validate() throws {
14+
func validate() throws(Issue) {
1515
guard let maxNumberOfSingleLineParameters else {
1616
return
1717
}

Source/SwiftLintBuiltInRules/Rules/RuleConfigurations/NameConfiguration.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ struct NameConfiguration<Parent: Rule>: RuleConfiguration, InlinableOptionType {
4949
self.validatesStartWithLowercase = validatesStartWithLowercase
5050
}
5151

52-
mutating func apply(configuration: Any) throws {
52+
mutating func apply(configuration: Any) throws(Issue) {
5353
guard let configurationDict = configuration as? [String: Any] else {
54-
throw Issue.invalidConfiguration(ruleID: Parent.identifier)
54+
throw .invalidConfiguration(ruleID: Parent.identifier)
5555
}
5656

5757
if let minLengthConfiguration = configurationDict[$minLength.key] {

Source/SwiftLintBuiltInRules/Rules/RuleConfigurations/NumberSeparatorConfiguration.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ struct NumberSeparatorConfiguration: SeverityBasedRuleConfiguration {
1212
.symbol("\(min) ..< \(max)")
1313
}
1414

15-
init(fromAny value: Any, context ruleID: String) throws {
15+
init(fromAny value: Any, context ruleID: String) throws(Issue) {
1616
guard let values = value as? [String: Any],
1717
let min = values["min"] as? Double,
1818
let max = values["max"] as? Double else {
19-
throw Issue.invalidConfiguration(ruleID: ruleID)
19+
throw .invalidConfiguration(ruleID: ruleID)
2020
}
2121
self.min = min
2222
self.max = max

Source/SwiftLintBuiltInRules/Rules/RuleConfigurations/RequiredEnumCaseConfiguration.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ struct RequiredEnumCaseConfiguration: RuleConfiguration {
3030
}
3131
}
3232

33-
mutating func apply(configuration: Any) throws {
33+
mutating func apply(configuration: Any) throws(Issue) {
3434
guard let config = configuration as? [String: [String: String]] else {
35-
throw Issue.invalidConfiguration(ruleID: Parent.identifier)
35+
throw .invalidConfiguration(ruleID: Parent.identifier)
3636
}
3737

3838
register(protocols: config)

Source/SwiftLintBuiltInRules/Rules/RuleConfigurations/UnusedImportConfiguration.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ struct TransitiveModuleConfiguration<Parent: Rule>: Equatable, AcceptableByConfi
88
/// The set of modules that can be transitively imported by `importedModule`.
99
let transitivelyImportedModules: [String]
1010

11-
init(fromAny configuration: Any, context _: String) throws {
11+
init(fromAny configuration: Any, context _: String) throws(Issue) {
1212
guard let configurationDict = configuration as? [String: Any],
1313
Set(configurationDict.keys) == ["module", "allowed_transitive_imports"],
1414
let importedModule = configurationDict["module"] as? String,
1515
let transitivelyImportedModules = configurationDict["allowed_transitive_imports"] as? [String]
1616
else {
17-
throw Issue.invalidConfiguration(ruleID: Parent.identifier)
17+
throw .invalidConfiguration(ruleID: Parent.identifier)
1818
}
1919
self.importedModule = importedModule
2020
self.transitivelyImportedModules = transitivelyImportedModules

Source/SwiftLintCore/Extensions/NSRegularExpression+SwiftLint.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ public struct RegularExpression: Hashable, Comparable, ExpressibleByStringLitera
3333
/// - Returns: A `RegularExpression` instance.
3434
public static func from(pattern: String,
3535
options: NSRegularExpression.Options? = nil,
36-
for ruleID: String) throws -> Self {
36+
for ruleID: String) throws(Issue) -> Self {
3737
do {
3838
return try Self(pattern: pattern, options: options)
3939
} catch {
40-
throw Issue.invalidRegexPattern(ruleID: ruleID, pattern: pattern)
40+
throw .invalidRegexPattern(ruleID: ruleID, pattern: pattern)
4141
}
4242
}
4343
}

Source/SwiftLintCore/Models/ChildOptionSeverityConfiguration.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ public struct ChildOptionSeverityConfiguration<Parent: Rule>: RuleConfiguration,
2222
ViolationSeverity(rawValue: optionSeverity.rawValue)
2323
}
2424

25-
public mutating func apply(configuration: Any) throws {
25+
public mutating func apply(configuration: Any) throws(Issue) {
2626
guard let configString = configuration as? String,
2727
let optionSeverity = ChildOptionSeverity(rawValue: configString.lowercased()) else {
28-
throw Issue.invalidConfiguration(ruleID: Parent.identifier)
28+
throw .invalidConfiguration(ruleID: Parent.identifier)
2929
}
3030
self.optionSeverity = optionSeverity
3131
}

Source/SwiftLintCore/Models/RuleConfigurationDescription.swift

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ public protocol AcceptableByConfigurationElement {
317317
/// - Parameters:
318318
/// - value: Value from a configuration.
319319
/// - ruleID: The rule's identifier in which context the configuration parsing runs.
320-
init(fromAny value: Any, context ruleID: String) throws
320+
init(fromAny value: Any, context ruleID: String) throws(Issue)
321321

322322
/// Make the object an option.
323323
///
@@ -337,7 +337,7 @@ public protocol AcceptableByConfigurationElement {
337337
/// - Parameters:
338338
/// - value: New underlying data for the object.
339339
/// - ruleID: The rule's identifier in which context the configuration parsing runs.
340-
mutating func apply(_ value: Any, ruleID: String) throws
340+
mutating func apply(_ value: Any, ruleID: String) throws(Issue)
341341
}
342342

343343
/// Default implementations which are shortcuts applicable for most of the types conforming to the protocol.
@@ -346,7 +346,7 @@ public extension AcceptableByConfigurationElement {
346346
RuleConfigurationDescription(options: [key => asOption()])
347347
}
348348

349-
mutating func apply(_ value: Any, ruleID: String) throws {
349+
mutating func apply(_ value: Any, ruleID: String) throws(Issue) {
350350
self = try Self(fromAny: value, context: ruleID)
351351
}
352352
}
@@ -537,7 +537,7 @@ extension Optional: AcceptableByConfigurationElement where Wrapped: AcceptableBy
537537
self?.asOption() ?? .empty
538538
}
539539

540-
public init(fromAny value: Any, context ruleID: String) throws {
540+
public init(fromAny value: Any, context ruleID: String) throws(Issue) {
541541
self = try Wrapped(fromAny: value, context: ruleID)
542542
}
543543
}
@@ -549,9 +549,9 @@ struct Symbol: Equatable, AcceptableByConfigurationElement {
549549
.symbol(value)
550550
}
551551

552-
init(fromAny value: Any, context ruleID: String) throws {
552+
init(fromAny value: Any, context ruleID: String) throws(Issue) {
553553
guard let value = value as? String else {
554-
throw Issue.invalidConfiguration(ruleID: ruleID)
554+
throw .invalidConfiguration(ruleID: ruleID)
555555
}
556556
self.value = value
557557
}
@@ -562,9 +562,9 @@ extension Bool: AcceptableByConfigurationElement {
562562
.flag(self)
563563
}
564564

565-
public init(fromAny value: Any, context ruleID: String) throws {
565+
public init(fromAny value: Any, context ruleID: String) throws(Issue) {
566566
guard let value = value as? Self else {
567-
throw Issue.invalidConfiguration(ruleID: ruleID)
567+
throw .invalidConfiguration(ruleID: ruleID)
568568
}
569569
self = value
570570
}
@@ -575,9 +575,9 @@ extension String: AcceptableByConfigurationElement {
575575
.string(self)
576576
}
577577

578-
public init(fromAny value: Any, context ruleID: String) throws {
578+
public init(fromAny value: Any, context ruleID: String) throws(Issue) {
579579
guard let value = value as? Self else {
580-
throw Issue.invalidConfiguration(ruleID: ruleID)
580+
throw .invalidConfiguration(ruleID: ruleID)
581581
}
582582
self = value
583583
}
@@ -588,9 +588,11 @@ extension Array: AcceptableByConfigurationElement where Element: AcceptableByCon
588588
.list(map { $0.asOption() })
589589
}
590590

591-
public init(fromAny value: Any, context ruleID: String) throws {
591+
public init(fromAny value: Any, context ruleID: String) throws(Issue) {
592592
let values = value as? [Any] ?? [value]
593-
self = try values.map { try Element(fromAny: $0, context: ruleID) }
593+
self = try values.map { value throws(Issue) in
594+
try Element(fromAny: value, context: ruleID)
595+
}
594596
}
595597
}
596598

@@ -599,7 +601,7 @@ extension Set: AcceptableByConfigurationElement where Element: AcceptableByConfi
599601
sorted().asOption()
600602
}
601603

602-
public init(fromAny value: Any, context ruleID: String) throws {
604+
public init(fromAny value: Any, context ruleID: String) throws(Issue) {
603605
self = Set(try [Element].init(fromAny: value, context: ruleID))
604606
}
605607
}
@@ -609,9 +611,9 @@ extension Int: AcceptableByConfigurationElement {
609611
.integer(self)
610612
}
611613

612-
public init(fromAny value: Any, context ruleID: String) throws {
614+
public init(fromAny value: Any, context ruleID: String) throws(Issue) {
613615
guard let value = value as? Self else {
614-
throw Issue.invalidConfiguration(ruleID: ruleID)
616+
throw .invalidConfiguration(ruleID: ruleID)
615617
}
616618
self = value
617619
}
@@ -622,9 +624,9 @@ extension Double: AcceptableByConfigurationElement {
622624
.float(self)
623625
}
624626

625-
public init(fromAny value: Any, context ruleID: String) throws {
627+
public init(fromAny value: Any, context ruleID: String) throws(Issue) {
626628
guard let value = value as? Self else {
627-
throw Issue.invalidConfiguration(ruleID: ruleID)
629+
throw .invalidConfiguration(ruleID: ruleID)
628630
}
629631
self = value
630632
}
@@ -635,11 +637,11 @@ extension RegularExpression: AcceptableByConfigurationElement {
635637
.string(pattern)
636638
}
637639

638-
public init(fromAny value: Any, context ruleID: String) throws {
640+
public init(fromAny value: Any, context ruleID: String) throws(Issue) {
639641
guard let value = value as? String else {
640-
throw Issue.invalidConfiguration(ruleID: ruleID)
642+
throw .invalidConfiguration(ruleID: ruleID)
641643
}
642-
self = try Self(pattern: value)
644+
self = try .from(pattern: value, for: ruleID)
643645
}
644646
}
645647

@@ -657,12 +659,12 @@ public extension AcceptableByConfigurationElement where Self: RuleConfiguration
657659
return RuleConfigurationDescription(options: [key => asOption()])
658660
}
659661

660-
mutating func apply(_ value: Any, ruleID _: String) throws {
662+
mutating func apply(_ value: Any, ruleID _: String) throws(Issue) {
661663
try apply(configuration: value)
662664
}
663665

664-
init(fromAny _: Any, context _: String) throws {
665-
throw Issue.genericError("Do not call this initializer")
666+
init(fromAny _: Any, context _: String) throws(Issue) {
667+
throw .genericError("Do not call this initializer")
666668
}
667669
}
668670

Source/SwiftLintCore/Models/RuleList.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,14 @@ public struct RuleList {
4040

4141
// MARK: - Internal
4242

43-
package func allRulesWrapped(configurationDict: [String: Any] = [:]) throws -> [ConfigurationRuleWrapper] {
43+
package func allRulesWrapped(configurationDict: [String: Any] = [:])
44+
throws(RuleListError) -> [ConfigurationRuleWrapper] {
4445
var rules = [String: ConfigurationRuleWrapper]()
4546

4647
// Add rules where configuration exists
4748
for (key, configuration) in configurationDict {
4849
guard let identifier = identifier(for: key), let ruleType = list[identifier] else { continue }
49-
guard rules[identifier] == nil else { throw RuleListError.duplicatedConfigurations(rule: ruleType) }
50+
guard rules[identifier] == nil else { throw .duplicatedConfigurations(rule: ruleType) }
5051
do {
5152
let configuredRule = try ruleType.init(configuration: configuration)
5253
let isConfigured = (configuration as? [String: Any])?.isEmpty == false

0 commit comments

Comments
 (0)