Infer name of parent rule in configurations (#6363)

This commit is contained in:
Danny Mösch
2025-12-01 20:15:00 +01:00
committed by GitHub
parent 31cdc24101
commit 2e87be0398
84 changed files with 75 additions and 199 deletions
@@ -3,7 +3,7 @@ import SwiftSyntaxBuilder
@SwiftSyntaxRule(explicitRewriter: true)
struct UnneededOverrideRule: Rule {
var configuration = UnneededOverrideRuleConfiguration()
var configuration = UnneededOverrideConfiguration()
static let description = RuleDescription(
identifier: "unneeded_override",
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct AttributesConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = AttributesRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "attributes_with_arguments_always_on_line_above")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct BlanketDisableCommandConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = BlanketDisableCommandRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "allowed_rules")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct CollectionAlignmentConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = CollectionAlignmentRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "align_colons")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct ColonConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = ColonRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "flexible_right_spacing")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct ComputedAccessorsOrderConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = ComputedAccessorsOrderRule
@AcceptableByConfigurationElement
enum Order: String {
case getSet = "get_set"
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct ConditionalReturnsOnNewlineConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = ConditionalReturnsOnNewlineRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "if_only")
@@ -3,8 +3,6 @@ import SwiftLintCore
@AutoConfigParser
struct CyclomaticComplexityConfiguration: RuleConfiguration {
typealias Parent = CyclomaticComplexityRule
@ConfigurationElement(inline: true)
private(set) var length = SeverityLevelsConfiguration<Parent>(warning: 10, error: 20)
@ConfigurationElement(key: "ignores_case_statements")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct DiscouragedDirectInitConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = DiscouragedDirectInitRule
@ConfigurationElement(key: "severity")
var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct EmptyCountConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = EmptyCountRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.error)
@ConfigurationElement(key: "only_after_dot")
@@ -2,7 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct ExpiringTodoConfiguration: RuleConfiguration {
typealias Parent = ExpiringTodoRule
typealias Severity = SeverityConfiguration<Parent>
struct DelimiterConfiguration: Equatable, AcceptableByConfigurationElement {
@@ -1,7 +1,5 @@
@AutoConfigParser
struct ExplicitInitConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = ExplicitInitRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "include_bare_init")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct ExplicitTypeInterfaceConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = ExplicitTypeInterfaceRule
@AcceptableByConfigurationElement
enum VariableKind: String, CaseIterable {
case instance
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct FileLengthConfiguration: RuleConfiguration {
typealias Parent = FileLengthRule
@ConfigurationElement(inline: true)
private(set) var severityConfiguration = SeverityLevelsConfiguration<Parent>(warning: 400, error: 1000)
@ConfigurationElement(key: "ignore_comment_only_lines")
@@ -4,8 +4,6 @@ import SwiftLintCore
@AutoConfigParser
struct FileNameConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = FileNameRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "excluded")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct FileNameNoSpaceConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = FileNameNoSpaceRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>.warning
@ConfigurationElement(key: "excluded")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct FileTypesOrderConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = FileTypesOrderRule
@AcceptableByConfigurationElement
enum FileType: String {
case supportingType = "supporting_type"
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct ForWhereConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = ForWhereRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "allow_for_as_filter")
@@ -4,8 +4,6 @@ import SwiftLintCore
struct FunctionDefaultParameterAtEndConfiguration: SeverityBasedRuleConfiguration {
// swiftlint:disable:previous type_name
typealias Parent = FunctionDefaultParameterAtEndRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "ignore_first_isolation_inheritance_parameter")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct FunctionNameWhitespaceConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = FunctionNameWhitespaceRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "generic_spacing")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct FunctionParameterCountConfiguration: RuleConfiguration {
typealias Parent = FunctionParameterCountRule
@ConfigurationElement(inline: true)
private(set) var severityConfiguration = SeverityLevelsConfiguration<Parent>(warning: 5, error: 8)
@ConfigurationElement(key: "ignores_default_parameters")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct IdentifierNameConfiguration: RuleConfiguration {
typealias Parent = IdentifierNameRule
private static let defaultOperators = ["/", "=", "-", "+", "!", "*", "|", "^", "~", "?", ".", "%", "<", ">", "&"]
@ConfigurationElement(inline: true)
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct ImplicitOptionalInitializationConfiguration: SeverityBasedRuleConfiguration { // swiftlint:disable:this type_name
typealias Parent = ImplicitOptionalInitializationRule
@AcceptableByConfigurationElement
enum Style: String {
case always
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct ImplicitReturnConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = ImplicitReturnRule
@AcceptableByConfigurationElement
enum ReturnKind: String, CaseIterable, Comparable {
case closure
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct ImplicitlyUnwrappedOptionalConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = ImplicitlyUnwrappedOptionalRule
@AcceptableByConfigurationElement
enum ImplicitlyUnwrappedOptionalModeConfiguration: String { // swiftlint:disable:this type_name
case all = "all"
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct InclusiveLanguageConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = InclusiveLanguageRule
private static let defaultTerms: Set<String> = [
"whitelist",
"blacklist",
@@ -4,8 +4,6 @@ import SwiftLintCore
struct IncompatibleConcurrencyAnnotationConfiguration: SeverityBasedRuleConfiguration {
// swiftlint:disable:previous type_name
typealias Parent = IncompatibleConcurrencyAnnotationRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "global_actors", postprocessor: { $0.insert("MainActor") })
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct IndentationWidthConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = IndentationWidthRule
private static let defaultIndentationWidth = 4
@ConfigurationElement(key: "severity")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct LegacyObjcTypeConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = LegacyObjcTypeRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>.warning
@ConfigurationElement(key: "allowed_types")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct LineLengthConfiguration: RuleConfiguration {
typealias Parent = LineLengthRule
@ConfigurationElement(inline: true)
private(set) var length = SeverityLevelsConfiguration<Parent>(warning: 120, error: 200)
@ConfigurationElement(key: "ignores_urls")
@@ -3,8 +3,6 @@ import SwiftLintCore
@AutoConfigParser
struct ModifierOrderConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = ModifierOrderRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "preferred_modifier_order")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct MultilineArgumentsConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = MultilineArgumentsRule
@AcceptableByConfigurationElement
enum FirstArgumentLocation: String {
case anyLine = "any_line"
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct MultilineCallArgumentsConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = MultilineCallArgumentsRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "allows_single_line")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct MultilineParametersConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = MultilineParametersRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "allows_single_line")
@@ -2,7 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct NestingConfiguration: RuleConfiguration {
typealias Parent = NestingRule
typealias Severity = SeverityLevelsConfiguration<Parent>
@ConfigurationElement(key: "type_level")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct NoEmptyBlockConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = NoEmptyBlockRule
@AcceptableByConfigurationElement
enum CodeBlockType: String, CaseIterable {
case functionBodies = "function_bodies"
@@ -1,7 +1,5 @@
@AutoConfigParser
struct NoMagicNumbersConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = NoMagicNumbersRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(
@@ -3,7 +3,6 @@ import SwiftLintCore
@AutoConfigParser
struct NonOptionalStringDataConversionConfiguration: SeverityBasedRuleConfiguration {
// swiftlint:disable:previous type_name
typealias Parent = NonOptionalStringDataConversionRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser // swiftlint:disable:next type_name
struct NonOverridableClassDeclarationConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = NonOverridableClassDeclarationRule
@AcceptableByConfigurationElement
enum FinalClassModifier: String {
case finalClass = "final class"
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct NumberSeparatorConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = NumberSeparatorRule
struct ExcludeRange: AcceptableByConfigurationElement, Equatable {
private let min: Double
private let max: Double
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct OpeningBraceConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = OpeningBraceRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "ignore_multiline_type_headers")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct OperatorUsageWhitespaceConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = OperatorUsageWhitespaceRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "lines_look_around")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct OverriddenSuperCallConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = OverriddenSuperCallRule
private static let defaultIncluded = [
// NSObject
"awakeFromNib()",
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct PreferKeyPathConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = PreferKeyPathRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "restrict_to_standard_functions")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct PrefixedTopLevelConstantConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = PrefixedTopLevelConstantRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "only_private")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct PrivateOutletConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = PrivateOutletRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "allow_private_set")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct PrivateOverFilePrivateConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = PrivateOverFilePrivateRule
@ConfigurationElement(key: "severity")
var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "validate_extensions")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct ProhibitedSuperConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = ProhibitedSuperRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "excluded")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct RedundantDiscardableLetConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = RedundantDiscardableLetRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "ignore_swiftui_view_bodies")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct RedundantSendableConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = RedundantSendableRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "global_actors")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct RedundantTypeAnnotationConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = RedundantTypeAnnotationRule
@ConfigurationElement(key: "severity")
var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "ignore_attributes")
@@ -1,7 +1,5 @@
@AutoConfigParser
struct RedundantVoidReturnConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = RedundantVoidReturnRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "include_closures")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct SelfBindingConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = SelfBindingRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "bind_identifier")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct ShorthandArgumentConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = ShorthandArgumentRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "allow_until_line_after_opening_brace")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct SortedImportsConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = SortedImportsRule
@AcceptableByConfigurationElement
enum Grouping: String {
/// Sorts import lines based on any import attributes (e.g. `@testable`, `@_exported`, etc.), followed by a case
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct StatementPositionConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = StatementPositionRule
@AcceptableByConfigurationElement
enum StatementModeConfiguration: String {
case `default` = "default"
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct SwitchCaseAlignmentConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = SwitchCaseAlignmentRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "indented_cases")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct TestCaseAccessibilityConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = TestCaseAccessibilityRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "allowed_prefixes")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct TodoConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = TodoRule
@AcceptableByConfigurationElement
enum TodoKeyword: String, CaseIterable {
case todo = "TODO"
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct TrailingClosureConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = TrailingClosureRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "only_single_muted_parameter")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct TrailingCommaConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = TrailingCommaRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "mandatory_comma")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct TrailingWhitespaceConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = TrailingWhitespaceRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "ignores_empty_lines")
@@ -16,8 +16,6 @@ enum TypeBodyLengthCheckType: String, CaseIterable, Comparable {
@AutoConfigParser
struct TypeBodyLengthConfiguration: SeverityLevelsBasedRuleConfiguration {
typealias Parent = TypeBodyLengthRule
@ConfigurationElement(inline: true)
private(set) var severityConfiguration = SeverityLevelsConfiguration<Parent>(warning: 250, error: 350)
@ConfigurationElement(key: "excluded_types")
@@ -22,8 +22,6 @@ enum TypeContent: String {
@AutoConfigParser
struct TypeContentsOrderConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = TypeContentsOrderRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "order")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct TypeNameConfiguration: RuleConfiguration {
typealias Parent = TypeNameRule
@ConfigurationElement(inline: true)
private(set) var nameConfiguration = NameConfiguration<Parent>(minLengthWarning: 3,
minLengthError: 0,
@@ -1,9 +1,7 @@
import SwiftLintCore
@AutoConfigParser
struct UnneededOverrideRuleConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = UnneededOverrideRule
struct UnneededOverrideConfiguration: SeverityBasedRuleConfiguration {
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "affect_initializers")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct UnusedDeclarationConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = UnusedDeclarationRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>.error
@ConfigurationElement(key: "include_public_and_open")
@@ -29,8 +29,6 @@ struct TransitiveModuleConfiguration<Parent: Rule>: Equatable, AcceptableByConfi
@AutoConfigParser
struct UnusedImportConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = UnusedImportRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>.warning
@ConfigurationElement(key: "require_explicit_imports")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct UnusedOptionalBindingConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = UnusedOptionalBindingRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "ignore_optional_try")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser // swiftlint:disable:next type_name
struct VerticalWhitespaceBetweenCasesConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = VerticalWhitespaceBetweenCasesRule
@AcceptableByConfigurationElement
enum SeparationStyle: String {
case always
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser // swiftlint:disable:next type_name
struct VerticalWhitespaceClosingBracesConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = VerticalWhitespaceClosingBracesRule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.warning)
@ConfigurationElement(key: "only_enforce_before_trivial_lines")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct VerticalWhitespaceConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = VerticalWhitespaceRule
static let defaultDescriptionReason = "Limit vertical whitespace to a single empty line"
@ConfigurationElement(key: "severity")
@@ -2,8 +2,6 @@ import SwiftLintCore
@AutoConfigParser
struct XCTSpecificMatcherConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = XCTSpecificMatcherRule
@AcceptableByConfigurationElement
enum Matcher: String, CaseIterable {
case oneArgumentAsserts = "one-argument-asserts"
+2 -2
View File
@@ -2,7 +2,7 @@
/// automatically based on the defined `@ConfigurationElement`s.
@attached(
member,
names: named(apply)
names: named(apply), named(Parent)
)
public macro AutoConfigParser() = #externalMacro(
module: "SwiftLintCoreMacros",
@@ -13,7 +13,7 @@ public macro AutoConfigParser() = #externalMacro(
@available(*, deprecated, renamed: "AutoConfigParser")
@attached(
member,
names: named(apply)
names: named(apply), named(Parent)
)
public macro AutoApply() = #externalMacro(
module: "SwiftLintCoreMacros",
@@ -15,6 +15,12 @@ enum AutoConfigParser: MemberMacro {
context.diagnose(SwiftLintCoreMacroError.notStruct.diagnose(at: declaration))
return []
}
let name = configuration.name.text
guard name.hasSuffix("Configuration"), !name.hasSuffix("RuleConfiguration") else {
context.diagnose(SwiftLintCoreMacroError.invalidConfigurationName.diagnose(at: configuration.name))
return []
}
let ruleName = String(name.dropLast("Configuration".count)) + "Rule"
var annotatedVarDecls = configuration.memberBlock.members
.compactMap {
if let varDecl = $0.decl.as(VariableDeclSyntax.self),
@@ -48,8 +54,8 @@ enum AutoConfigParser: MemberMacro {
context.diagnose(SwiftLintCoreMacroError.severityBasedWithoutProperty.diagnose(at: configuration.name))
}
}
return [
DeclSyntax(try FunctionDeclSyntax("mutating func apply(configuration: Any) throws(Issue)") {
let applyMethod = DeclSyntax(
try FunctionDeclSyntax("mutating func apply(configuration: Any) throws(Issue)") {
for option in nonInlinedOptions {
"""
if $\(raw: option).key.isEmpty {
@@ -89,8 +95,12 @@ enum AutoConfigParser: MemberMacro {
"""
try validate()
"""
}),
]
}
)
if configuration.genericParameterClause?.parameters.contains(where: { $0.name.text == "Parent" }) == true {
return [applyMethod]
}
return [DeclSyntax("typealias Parent = \(raw: ruleName)")] + [applyMethod]
}
}
@@ -3,6 +3,7 @@ import SwiftSyntax
enum SwiftLintCoreMacroError: String, DiagnosticMessage {
case notStruct = "Attribute can only be applied to structs"
case invalidConfigurationName = "Configuration type name must end with 'Configuration', but not 'RuleConfiguration'"
case severityBasedWithoutProperty = """
Severity-based configuration without a 'severityConfiguration' property is invalid
"""
@@ -225,8 +225,6 @@ private extension SwiftLintDev.Rules.Template {
@AutoConfigParser
struct \(name)Configuration: SeverityBasedRuleConfiguration {
typealias Parent = \(name)Rule
@ConfigurationElement(key: "severity")
private(set) var severityConfiguration = SeverityConfiguration<Parent>(.\(severity))
}
@@ -3,7 +3,7 @@ import TestHelpers
import XCTest
final class ChildOptionSeverityConfigurationTests: SwiftLintTestCase {
typealias TesteeType = ChildOptionSeverityConfiguration<RuleMock>
typealias TesteeType = ChildOptionSeverityConfiguration<MockRule>
func testSeverity() {
XCTAssertNil(TesteeType.off.severity)
@@ -3,7 +3,7 @@ import TestHelpers
import XCTest
final class NameConfigurationTests: SwiftLintTestCase {
typealias TesteeType = NameConfiguration<RuleMock>
typealias TesteeType = NameConfiguration<MockRule>
func testNameConfigurationSetsCorrectly() {
let config: [String: any Sendable] = [
@@ -53,7 +53,7 @@ final class NameConfigurationTests: SwiftLintTestCase {
minLengthError: 0,
maxLengthWarning: 0,
maxLengthError: 0)
checkError(Issue.invalidConfiguration(ruleID: RuleMock.identifier)) {
checkError(Issue.invalidConfiguration(ruleID: MockRule.identifier)) {
try nameConfig.apply(configuration: config)
}
}
@@ -4,12 +4,12 @@ import XCTest
final class RegexConfigurationTests: SwiftLintTestCase {
func testShouldValidateIsTrueByDefault() {
let config = RegexConfiguration<RuleMock>(identifier: "example")
let config = RegexConfiguration<MockRule>(identifier: "example")
XCTAssertTrue(config.shouldValidate(filePath: "App/file.swift"))
}
func testShouldValidateWithSingleExluded() throws {
var config = RegexConfiguration<RuleMock>(identifier: "example")
var config = RegexConfiguration<MockRule>(identifier: "example")
try config.apply(configuration: [
"regex": "try!",
"excluded": "Tests/.*\\.swift",
@@ -20,7 +20,7 @@ final class RegexConfigurationTests: SwiftLintTestCase {
}
func testShouldValidateWithArrayExluded() throws {
var config = RegexConfiguration<RuleMock>(identifier: "example")
var config = RegexConfiguration<MockRule>(identifier: "example")
try config.apply(configuration: [
"regex": "try!",
"excluded": [
@@ -35,7 +35,7 @@ final class RegexConfigurationTests: SwiftLintTestCase {
}
func testShouldValidateWithSingleIncluded() throws {
var config = RegexConfiguration<RuleMock>(identifier: "example")
var config = RegexConfiguration<MockRule>(identifier: "example")
try config.apply(configuration: [
"regex": "try!",
"included": "App/.*\\.swift",
@@ -47,7 +47,7 @@ final class RegexConfigurationTests: SwiftLintTestCase {
}
func testShouldValidateWithArrayIncluded() throws {
var config = RegexConfiguration<RuleMock>(identifier: "example")
var config = RegexConfiguration<MockRule>(identifier: "example")
try config.apply(configuration: [
"regex": "try!",
"included": [
@@ -62,7 +62,7 @@ final class RegexConfigurationTests: SwiftLintTestCase {
}
func testShouldValidateWithIncludedAndExcluded() throws {
var config = RegexConfiguration<RuleMock>(identifier: "example")
var config = RegexConfiguration<MockRule>(identifier: "example")
try config.apply(configuration: [
"regex": "try!",
"included": [
@@ -7,9 +7,7 @@ import XCTest
// swiftlint:disable:next type_body_length
final class RuleConfigurationDescriptionTests: SwiftLintTestCase {
@AutoConfigParser
private struct TestConfiguration: RuleConfiguration {
typealias Parent = RuleMock // swiftlint:disable:this nesting
private struct MockConfiguration: RuleConfiguration {
@ConfigurationElement(key: "flag")
var flag = true
@ConfigurationElement(key: "string")
@@ -47,7 +45,7 @@ final class RuleConfigurationDescriptionTests: SwiftLintTestCase {
// swiftlint:disable:next function_body_length
func testDescriptionFromConfiguration() throws {
var configuration = TestConfiguration()
var configuration = MockConfiguration()
try configuration.apply(configuration: Void()) // Configure to set keys.
let description = RuleConfigurationDescription.from(configuration: configuration)
@@ -223,8 +221,8 @@ final class RuleConfigurationDescriptionTests: SwiftLintTestCase {
}
func testPrefersParameterDescription() {
struct Config: RuleConfiguration {
typealias Parent = RuleMock // swiftlint:disable:this nesting
struct MockConfiguration: RuleConfiguration {
typealias Parent = MockRule // swiftlint:disable:this nesting
var parameterDescription: RuleConfigurationDescription? {
"visible" => .flag(true)
@@ -238,7 +236,7 @@ final class RuleConfigurationDescriptionTests: SwiftLintTestCase {
func isEqualTo(_: some RuleConfiguration) -> Bool { false }
}
let description = RuleConfigurationDescription.from(configuration: Config())
let description = RuleConfigurationDescription.from(configuration: MockConfiguration())
XCTAssertEqual(description.oneLiner(), "visible: true")
XCTAssertEqual(description.markdown(), """
<table>
@@ -470,7 +468,7 @@ final class RuleConfigurationDescriptionTests: SwiftLintTestCase {
}
func testUpdate() throws {
var configuration = TestConfiguration()
var configuration = MockConfiguration()
try configuration.apply(configuration: [
"flag": false,
@@ -504,7 +502,7 @@ final class RuleConfigurationDescriptionTests: SwiftLintTestCase {
func testDeprecationWarning() async throws {
let console = try await Issue.captureConsole {
var configuration = TestConfiguration()
var configuration = MockConfiguration()
try configuration.apply(configuration: ["set": [6, 7]])
}
XCTAssertEqual(
@@ -515,7 +513,7 @@ final class RuleConfigurationDescriptionTests: SwiftLintTestCase {
func testNoDeprecationWarningIfNoDeprecatedPropertySet() async throws {
let console = try await Issue.captureConsole {
var configuration = TestConfiguration()
var configuration = MockConfiguration()
try configuration.apply(configuration: ["flag": false])
}
XCTAssertTrue(console.isEmpty)
@@ -523,7 +521,7 @@ final class RuleConfigurationDescriptionTests: SwiftLintTestCase {
func testInvalidKeys() async throws {
let console = try await Issue.captureConsole {
var configuration = TestConfiguration()
var configuration = MockConfiguration()
try configuration.apply(configuration: [
"severity": "error",
"warning": 3,
@@ -533,7 +531,7 @@ final class RuleConfigurationDescriptionTests: SwiftLintTestCase {
}
XCTAssertEqual(
console,
"warning: Configuration for 'RuleMock' rule contains the invalid key(s) 'unknown', 'unsupported'."
"warning: Configuration for 'MockRule' rule contains the invalid key(s) 'unknown', 'unsupported'."
)
}
@@ -52,8 +52,8 @@ final class RuleConfigurationTests: SwiftLintTestCase {
func testSeverityConfigurationFromString() {
let config = "Warning"
let comp = SeverityConfiguration<RuleMock>(.warning)
var severityConfig = SeverityConfiguration<RuleMock>(.error)
let comp = SeverityConfiguration<MockRule>(.warning)
var severityConfig = SeverityConfiguration<MockRule>(.error)
do {
try severityConfig.apply(configuration: config)
XCTAssertEqual(severityConfig, comp)
@@ -64,8 +64,8 @@ final class RuleConfigurationTests: SwiftLintTestCase {
func testSeverityConfigurationFromDictionary() {
let config = ["severity": "warning"]
let comp = SeverityConfiguration<RuleMock>(.warning)
var severityConfig = SeverityConfiguration<RuleMock>(.error)
let comp = SeverityConfiguration<MockRule>(.warning)
var severityConfig = SeverityConfiguration<MockRule>(.error)
do {
try severityConfig.apply(configuration: config)
XCTAssertEqual(severityConfig, comp)
@@ -76,22 +76,22 @@ final class RuleConfigurationTests: SwiftLintTestCase {
func testSeverityConfigurationThrowsNothingApplied() {
let config = 17
var severityConfig = SeverityConfiguration<RuleMock>(.error)
checkError(Issue.nothingApplied(ruleID: RuleMock.identifier)) {
var severityConfig = SeverityConfiguration<MockRule>(.error)
checkError(Issue.nothingApplied(ruleID: MockRule.identifier)) {
try severityConfig.apply(configuration: config)
}
}
func testSeverityConfigurationThrowsInvalidConfiguration() {
let config = "foo"
var severityConfig = SeverityConfiguration<RuleMock>(.warning)
checkError(Issue.invalidConfiguration(ruleID: RuleMock.identifier)) {
var severityConfig = SeverityConfiguration<MockRule>(.warning)
checkError(Issue.invalidConfiguration(ruleID: MockRule.identifier)) {
try severityConfig.apply(configuration: config)
}
}
func testSeverityLevelConfigParams() {
let severityConfig = SeverityLevelsConfiguration<RuleMock>(warning: 17, error: 7)
let severityConfig = SeverityLevelsConfiguration<MockRule>(warning: 17, error: 7)
XCTAssertEqual(
severityConfig.params,
[RuleParameter(severity: .error, value: 7), RuleParameter(severity: .warning, value: 17)]
@@ -99,32 +99,32 @@ final class RuleConfigurationTests: SwiftLintTestCase {
}
func testSeverityLevelConfigPartialParams() {
let severityConfig = SeverityLevelsConfiguration<RuleMock>(warning: 17, error: nil)
let severityConfig = SeverityLevelsConfiguration<MockRule>(warning: 17, error: nil)
XCTAssertEqual(severityConfig.params, [RuleParameter(severity: .warning, value: 17)])
}
func testSeverityLevelConfigApplyNilErrorValue() throws {
var severityConfig = SeverityLevelsConfiguration<RuleMock>(warning: 17, error: 20)
var severityConfig = SeverityLevelsConfiguration<MockRule>(warning: 17, error: 20)
try severityConfig.apply(configuration: ["error": nil, "warning": 18])
XCTAssertEqual(severityConfig.params, [RuleParameter(severity: .warning, value: 18)])
}
func testSeverityLevelConfigApplyMissingErrorValue() throws {
var severityConfig = SeverityLevelsConfiguration<RuleMock>(warning: 17, error: 20)
var severityConfig = SeverityLevelsConfiguration<MockRule>(warning: 17, error: 20)
try severityConfig.apply(configuration: ["warning": 18])
XCTAssertEqual(severityConfig.params, [RuleParameter(severity: .warning, value: 18)])
}
func testRegexConfigurationThrows() {
let config = 17
var regexConfig = RegexConfiguration<RuleMock>(identifier: "")
checkError(Issue.invalidConfiguration(ruleID: RuleMock.identifier)) {
var regexConfig = RegexConfiguration<MockRule>(identifier: "")
checkError(Issue.invalidConfiguration(ruleID: MockRule.identifier)) {
try regexConfig.apply(configuration: config)
}
}
func testRegexRuleDescription() {
var regexConfig = RegexConfiguration<RuleMock>(identifier: "regex")
var regexConfig = RegexConfiguration<MockRule>(identifier: "regex")
XCTAssertEqual(regexConfig.description, RuleDescription(identifier: "regex",
name: "regex",
description: "", kind: .style))
+20 -10
View File
@@ -34,12 +34,14 @@ final class AutoConfigParserTests: XCTestCase {
assertMacroExpansion(
"""
@AutoConfigParser
struct S {
struct MyConfiguration {
}
""",
expandedSource:
"""
struct S {
struct MyConfiguration {
typealias Parent = MyRule
mutating func apply(configuration: Any) throws(Issue) {
guard let configuration = configuration as? [String: Any] else {
@@ -62,7 +64,7 @@ final class AutoConfigParserTests: XCTestCase {
assertMacroExpansion(
"""
@AutoConfigParser
struct S {
struct MyConfiguration {
@ConfigurationElement
var eA = 1
@ConfigurationElement(key: "name")
@@ -71,12 +73,14 @@ final class AutoConfigParserTests: XCTestCase {
""",
expandedSource:
"""
struct S {
struct MyConfiguration {
@ConfigurationElement
var eA = 1
@ConfigurationElement(key: "name")
var eB = 2
typealias Parent = MyRule
mutating func apply(configuration: Any) throws(Issue) {
if $eA.key.isEmpty {
$eA.key = "e_a"
@@ -110,7 +114,7 @@ final class AutoConfigParserTests: XCTestCase {
assertMacroExpansion(
"""
@AutoConfigParser
struct S {
struct MyConfiguration {
@ConfigurationElement(key: "eD")
var eA = 1
@ConfigurationElement(inline: true)
@@ -121,7 +125,7 @@ final class AutoConfigParserTests: XCTestCase {
""",
expandedSource:
"""
struct S {
struct MyConfiguration {
@ConfigurationElement(key: "eD")
var eA = 1
@ConfigurationElement(inline: true)
@@ -129,6 +133,8 @@ final class AutoConfigParserTests: XCTestCase {
@ConfigurationElement(inline: false)
var eC = 3
typealias Parent = MyRule
mutating func apply(configuration: Any) throws(Issue) {
if $eA.key.isEmpty {
$eA.key = "e_a"
@@ -166,12 +172,14 @@ final class AutoConfigParserTests: XCTestCase {
assertMacroExpansion(
"""
@AutoConfigParser
struct S: SeverityBasedRuleConfiguration {
struct MyConfiguration: SeverityBasedRuleConfiguration {
}
""",
expandedSource:
"""
struct S: SeverityBasedRuleConfiguration {
struct MyConfiguration: SeverityBasedRuleConfiguration {
typealias Parent = MyRule
mutating func apply(configuration: Any) throws(Issue) {
guard let configuration = configuration as? [String: Any] else {
@@ -201,7 +209,7 @@ final class AutoConfigParserTests: XCTestCase {
assertMacroExpansion(
"""
@AutoConfigParser
struct S: SeverityBasedRuleConfiguration {
struct MyConfiguration: SeverityBasedRuleConfiguration {
@ConfigurationElement
var severityConfiguration = .warning
@ConfigurationElement
@@ -210,12 +218,14 @@ final class AutoConfigParserTests: XCTestCase {
""",
expandedSource:
"""
struct S: SeverityBasedRuleConfiguration {
struct MyConfiguration: SeverityBasedRuleConfiguration {
@ConfigurationElement
var severityConfiguration = .warning
@ConfigurationElement
var foo = 2
typealias Parent = MyRule
mutating func apply(configuration: Any) throws(Issue) {
if $severityConfiguration.key.isEmpty {
$severityConfiguration.key = "severity_configuration"
@@ -1,12 +1,12 @@
import SwiftLintCore
public struct RuleMock: Rule {
public struct MockRule: Rule {
var configurationDescription: some Documentable { RuleConfigurationOption.noOptions }
public var configuration = SeverityConfiguration<Self>(.warning)
public static let description = RuleDescription(
identifier: "RuleMock",
identifier: "MockRule",
name: "",
description: "",
kind: .style