From a2a636d7498d2ed245cc7e91c6b41aecdeee7b9d Mon Sep 17 00:00:00 2001 From: JP Simard Date: Wed, 23 Nov 2016 15:30:29 -0800 Subject: [PATCH] fix MarkRule edge cases fixes #805 --- CHANGELOG.md | 5 +++- .../SwiftLintFramework/Rules/MarkRule.swift | 25 ++++++++++++++----- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef4fd4344..631cefbe3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,10 @@ ##### Bug Fixes -* None. +* Fix a few edge cases where malformed `MARK:` comments wouldn't trigger a + violation. + [JP Simard](https://github.com/jpsim) + [#805](https://github.com/realm/SwiftLint/issues/805) ## 0.13.0: MakeYourClothesCleanAgain diff --git a/Source/SwiftLintFramework/Rules/MarkRule.swift b/Source/SwiftLintFramework/Rules/MarkRule.swift index 52099894d..77a1afa60 100644 --- a/Source/SwiftLintFramework/Rules/MarkRule.swift +++ b/Source/SwiftLintFramework/Rules/MarkRule.swift @@ -19,22 +19,35 @@ public struct MarkRule: ConfigurationProviderRule { name: "Mark", description: "MARK comment should be in valid format.", nonTriggeringExamples: [ - "// MARK: good\n", - "// MARK: - good\n", - "// MARK: -\n" + "// MARK: good", + "// MARK: - good", + "// MARK: -" ], triggeringExamples: [ "//MARK: bad", + "// MARK:bad", "//MARK:bad", + "// MARK: bad", + "// MARK: bad", "// MARK: -bad", + "// MARK:- bad", "// MARK:-bad", - "//MARK:-bad" + "//MARK: - bad", + "//MARK:- bad", + "//MARK: -bad", + "//MARK:-bad", ] ) public func validateFile(file: File) -> [StyleViolation] { - let options = ["MARK:[^ ]", "[^ ]MARK: [^-]", "\\sMARK:[^ ]", "MARK:[ ][-][^\\s ]"] - let pattern = "(" + options.joinWithSeparator("|") + ")" + let nonSpace = "[^ ]" + let twoOrMoreSpace = " {2,}" + let nonSpaceOrTwoOrMoreSpace = "(\(nonSpace)|\(twoOrMoreSpace))" + let mark = "MARK:" + let badSpaceStart = "(\(nonSpaceOrTwoOrMoreSpace)?\(mark)\(nonSpaceOrTwoOrMoreSpace))" + let badSpaceEnd = "(\(nonSpaceOrTwoOrMoreSpace)\(mark)\(nonSpaceOrTwoOrMoreSpace)?)" + let badSpaceAfterHyphen = "(\(mark) -([^ \\n]|\(twoOrMoreSpace)))" + let pattern = [badSpaceStart, badSpaceEnd, badSpaceAfterHyphen].joinWithSeparator("|") return file.matchPattern(pattern, withSyntaxKinds: [.Comment]).flatMap { range in return StyleViolation(ruleDescription: self.dynamicType.description,