diff --git a/Source/SwiftLintFramework/Rules/MissingDocsRule.swift b/Source/SwiftLintFramework/Rules/MissingDocsRule.swift index d38881a85..55d1c0479 100644 --- a/Source/SwiftLintFramework/Rules/MissingDocsRule.swift +++ b/Source/SwiftLintFramework/Rules/MissingDocsRule.swift @@ -9,19 +9,22 @@ import SourceKittenFramework import SwiftXPC -private func missingDocOffsets(dictionary: XPCDictionary) -> [Int] { - let substructureOffsets = (dictionary["key.substructure"] as? XPCArray)? - .flatMap { $0 as? XPCDictionary } - .flatMap(missingDocOffsets) ?? [] - let docAttribute = "source.decl.attribute.__raw_doc_comment" - guard let _ = (dictionary["key.kind"] as? String).flatMap(SwiftDeclarationKind.init), - offset = dictionary["key.offset"] as? Int64, - accessibility = dictionary["key.accessibility"] as? String - where accessibility == "source.lang.swift.accessibility.public" && - String(dictionary["key.attributes"]).rangeOfString(docAttribute) == nil else { +extension File { + private func missingDocOffsets(dictionary: XPCDictionary) -> [Int] { + let substructureOffsets = (dictionary["key.substructure"] as? XPCArray)? + .flatMap { $0 as? XPCDictionary } + .flatMap(missingDocOffsets) ?? [] + guard let _ = (dictionary["key.kind"] as? String).flatMap(SwiftDeclarationKind.init), + offset = dictionary["key.offset"] as? Int64, + accessibility = dictionary["key.accessibility"] as? String + where accessibility == "source.lang.swift.accessibility.public" else { return substructureOffsets + } + if getDocumentationCommentBody(dictionary, syntaxMap: syntaxMap) != nil { + return substructureOffsets + } + return substructureOffsets + [Int(offset)] } - return substructureOffsets + [Int(offset)] } public struct MissingDocsRule: Rule { @@ -34,19 +37,21 @@ public struct MissingDocsRule: Rule { nonTriggeringExamples: [ "/// docs\npublic func a() {}\n", "/** docs */\npublic func a() {}\n", - "// regular comment\nfunc a() {}\n", - "/* regular comment */\nfunc a() {}\n", "func a() {}\n", "internal func a() {}\n", - "private func a() {}\n" + "private func a() {}\n", + "// regular comment\nfunc a() {}\n", + "/* regular comment */\nfunc a() {}\n" ], triggeringExamples: [ - "public func a() {}\n" + "public func a() {}\n", + "// regular comment\npublic func a() {}\n", + "/* regular comment */\npublic func a() {}\n" ] ) public func validateFile(file: File) -> [StyleViolation] { - return missingDocOffsets(Structure(file: file).dictionary).map { + return file.missingDocOffsets(Structure(file: file).dictionary).map { StyleViolation(ruleDescription: self.dynamicType.description, location: Location(file: file, byteOffset: $0)) } diff --git a/Source/SwiftLintFrameworkTests/StringRuleTests.swift b/Source/SwiftLintFrameworkTests/StringRuleTests.swift index 95e6cc9dc..e59421b6a 100644 --- a/Source/SwiftLintFrameworkTests/StringRuleTests.swift +++ b/Source/SwiftLintFrameworkTests/StringRuleTests.swift @@ -103,7 +103,7 @@ class StringRuleTests: XCTestCase { } func testMissingDocs() { - verifyRule(MissingDocsRule.description, commentDoesntViolate: false) + verifyRule(MissingDocsRule.description) } func testTrailingSemicolon() {