diff --git a/.swiftlint.yml b/.swiftlint.yml index 8e4501424..1f035f4f9 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -88,6 +88,9 @@ file_name: - GeneratedTests.swift - TestHelpers.swift +function_body_length: 60 +type_body_length: 400 + custom_rules: rule_id: included: Source/SwiftLintFramework/Rules/.+/\w+\.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index 31717ebee..59d0c0199 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,10 @@ [JP Simard](https://github.com/jpsim) [#4582](https://github.com/realm/SwiftLint/issues/4582) +* Fix line count calculation for multiline string literals. + [JP Simard](https://github.com/jpsim) + [#4585](https://github.com/realm/SwiftLint/issues/4585) + ## 0.50.0: Artisanal Clothes Pegs #### Breaking diff --git a/Source/SwiftLintFramework/Extensions/SwiftLintFile+BodyLineCount.swift b/Source/SwiftLintFramework/Extensions/SwiftLintFile+BodyLineCount.swift index 4dd00742a..ad270a832 100644 --- a/Source/SwiftLintFramework/Extensions/SwiftLintFile+BodyLineCount.swift +++ b/Source/SwiftLintFramework/Extensions/SwiftLintFile+BodyLineCount.swift @@ -43,7 +43,12 @@ extension SwiftLintFile { return syntaxTree .tokens(viewMode: .sourceAccurate) .reduce(into: []) { linesWithTokens, token in - if let line = locationConverter.location(for: token.positionAfterSkippingLeadingTrivia).line { + if case .stringSegment = token.tokenKind { + let sourceRange = token.withoutTrivia().sourceRange(converter: locationConverter) + let startLine = sourceRange.start.line! + let endLine = sourceRange.end.line! + linesWithTokens.formUnion(startLine...endLine) + } else if let line = locationConverter.location(for: token.positionAfterSkippingLeadingTrivia).line { linesWithTokens.insert(line) } } diff --git a/Source/SwiftLintFramework/Rules/Style/FileTypesOrderRule.swift b/Source/SwiftLintFramework/Rules/Style/FileTypesOrderRule.swift index 781132097..f7b84d3e0 100644 --- a/Source/SwiftLintFramework/Rules/Style/FileTypesOrderRule.swift +++ b/Source/SwiftLintFramework/Rules/Style/FileTypesOrderRule.swift @@ -17,7 +17,6 @@ struct FileTypesOrderRule: ConfigurationProviderRule, OptInRule { triggeringExamples: FileTypesOrderRuleExamples.triggeringExamples ) - // swiftlint:disable:next function_body_length func validate(file: SwiftLintFile) -> [StyleViolation] { guard let mainTypeSubstructure = mainTypeSubstructure(in: file), let mainTypeSubstuctureOffset = mainTypeSubstructure.offset else { return [] } diff --git a/Source/SwiftLintFramework/Rules/Style/IdentifierNameRule.swift b/Source/SwiftLintFramework/Rules/Style/IdentifierNameRule.swift index 33bf164db..96f4dd7d7 100644 --- a/Source/SwiftLintFramework/Rules/Style/IdentifierNameRule.swift +++ b/Source/SwiftLintFramework/Rules/Style/IdentifierNameRule.swift @@ -24,7 +24,6 @@ struct IdentifierNameRule: ASTRule, ConfigurationProviderRule { deprecatedAliases: ["variable_name"] ) - // swiftlint:disable:next function_body_length func validate( file: SwiftLintFile, kind: SwiftDeclarationKind, diff --git a/Source/SwiftLintFramework/Rules/Style/TypeContentsOrderRule.swift b/Source/SwiftLintFramework/Rules/Style/TypeContentsOrderRule.swift index 045692c93..1b83361c5 100644 --- a/Source/SwiftLintFramework/Rules/Style/TypeContentsOrderRule.swift +++ b/Source/SwiftLintFramework/Rules/Style/TypeContentsOrderRule.swift @@ -76,7 +76,7 @@ struct TypeContentsOrderRule: ConfigurationProviderRule, OptInRule { } } - // swiftlint:disable:next cyclomatic_complexity function_body_length + // swiftlint:disable:next cyclomatic_complexity private func typeContent(for typeContentStructure: SourceKittenDictionary) -> TypeContent? { guard let typeContentKind = typeContentStructure.declarationKind else { return nil } diff --git a/Tests/SwiftLintFrameworkTests/ColonRuleTests.swift b/Tests/SwiftLintFrameworkTests/ColonRuleTests.swift index eb73910e9..8f002c7b4 100644 --- a/Tests/SwiftLintFrameworkTests/ColonRuleTests.swift +++ b/Tests/SwiftLintFrameworkTests/ColonRuleTests.swift @@ -2,7 +2,6 @@ import XCTest class ColonRuleTests: XCTestCase { - // swiftlint:disable:next function_body_length func testColonWithFlexibleRightSpace() { // Verify Colon rule with test values for when flexible_right_spacing // is true. @@ -69,7 +68,6 @@ class ColonRuleTests: XCTestCase { verifyRule(description, ruleConfiguration: ["flexible_right_spacing": true]) } - // swiftlint:disable:next function_body_length func testColonWithoutApplyToDictionaries() { let nonTriggeringExamples = ColonRule.description.nonTriggeringExamples + [ Example("let abc = [Void:Void]()\n"), diff --git a/Tests/SwiftLintFrameworkTests/CommandTests.swift b/Tests/SwiftLintFrameworkTests/CommandTests.swift index 68a00c731..19745d69d 100644 --- a/Tests/SwiftLintFrameworkTests/CommandTests.swift +++ b/Tests/SwiftLintFrameworkTests/CommandTests.swift @@ -3,8 +3,6 @@ import SourceKittenFramework @testable import SwiftLintFramework import XCTest -// swiftlint:disable type_body_length - Disable the rule and self-test commenting a command - private extension Command { init?(string: String) { let nsString = string.bridge() diff --git a/Tests/SwiftLintFrameworkTests/ConfigurationTests.swift b/Tests/SwiftLintFrameworkTests/ConfigurationTests.swift index 5560341ac..d318876c3 100644 --- a/Tests/SwiftLintFrameworkTests/ConfigurationTests.swift +++ b/Tests/SwiftLintFrameworkTests/ConfigurationTests.swift @@ -3,7 +3,7 @@ import SourceKittenFramework @testable import SwiftLintFramework import XCTest -// swiftlint:disable file_length type_body_length +// swiftlint:disable file_length private let optInRules = primaryRuleList.list.filter({ $0.1.init() is OptInRule }).map({ $0.0 }) diff --git a/Tests/SwiftLintFrameworkTests/FileTypesOrderRuleTests.swift b/Tests/SwiftLintFrameworkTests/FileTypesOrderRuleTests.swift index 230f78fdb..0884f1de1 100644 --- a/Tests/SwiftLintFrameworkTests/FileTypesOrderRuleTests.swift +++ b/Tests/SwiftLintFrameworkTests/FileTypesOrderRuleTests.swift @@ -2,6 +2,7 @@ import XCTest class FileTypesOrderRuleTests: XCTestCase { + // swiftlint:disable:next function_body_length func testFileTypesOrderReversedOrder() { // Test with reversed `order` entries let nonTriggeringExamples = [ diff --git a/Tests/SwiftLintFrameworkTests/ModifierOrderTests.swift b/Tests/SwiftLintFrameworkTests/ModifierOrderTests.swift index 7148d4643..c9c0cb894 100644 --- a/Tests/SwiftLintFrameworkTests/ModifierOrderTests.swift +++ b/Tests/SwiftLintFrameworkTests/ModifierOrderTests.swift @@ -66,6 +66,7 @@ class ModifierOrderTests: XCTestCase { "override"]]) } + // swiftlint:disable:next function_body_length func testAtPrefixedGroup() { let descriptionOverride = ModifierOrderRule.description .with(nonTriggeringExamples: [ @@ -215,6 +216,7 @@ class ModifierOrderTests: XCTestCase { ruleConfiguration: ["preferred_modifier_order": ["final", "override", "acl"]]) } + // swiftlint:disable:next function_body_length func testCorrectionsAreAppliedCorrectly() { let descriptionOverride = ModifierOrderRule.description .with(nonTriggeringExamples: [], triggeringExamples: []) @@ -281,6 +283,7 @@ class ModifierOrderTests: XCTestCase { ruleConfiguration: ["preferred_modifier_order": ["final", "override", "acl", "typeMethods"]]) } + // swiftlint:disable:next function_body_length func testCorrectionsAreNotAppliedToIrrelevantModifier() { let descriptionOverride = ModifierOrderRule.description .with(nonTriggeringExamples: [], triggeringExamples: []) diff --git a/Tests/SwiftLintFrameworkTests/RuleConfigurationTests.swift b/Tests/SwiftLintFrameworkTests/RuleConfigurationTests.swift index acec6f4fe..e41e5f195 100644 --- a/Tests/SwiftLintFrameworkTests/RuleConfigurationTests.swift +++ b/Tests/SwiftLintFrameworkTests/RuleConfigurationTests.swift @@ -2,8 +2,6 @@ import SourceKittenFramework @testable import SwiftLintFramework import XCTest -// swiftlint:disable type_body_length - class RuleConfigurationTests: XCTestCase { func testNameConfigurationSetsCorrectly() { let config = [ "min_length": ["warning": 17, "error": 7], diff --git a/Tests/SwiftLintTestHelpers/TestHelpers.swift b/Tests/SwiftLintTestHelpers/TestHelpers.swift index b536b5146..fa6ee703f 100644 --- a/Tests/SwiftLintTestHelpers/TestHelpers.swift +++ b/Tests/SwiftLintTestHelpers/TestHelpers.swift @@ -451,7 +451,6 @@ public extension XCTestCase { } } - // swiftlint:disable:next function_body_length private func verifyExamples(triggers: [Example], nonTriggers: [Example], configuration config: Configuration, requiresFileOnDisk: Bool, file callSiteFile: StaticString = #file,