Compare commits

...

1 Commits

Author SHA1 Message Date
Marcelo Fabri a999c78155 Migrate `ibinspectable_in_extension` to SwiftSyntax 2022-10-04 01:06:23 -07:00
1 changed files with 37 additions and 25 deletions

View File

@ -1,6 +1,6 @@
import SourceKittenFramework import SwiftSyntax
public struct IBInspectableInExtensionRule: ConfigurationProviderRule, OptInRule { public struct IBInspectableInExtensionRule: ConfigurationProviderRule, SwiftSyntaxRule {
public var configuration = SeverityConfiguration(.warning) public var configuration = SeverityConfiguration(.warning)
public init() {} public init() {}
@ -20,33 +20,45 @@ public struct IBInspectableInExtensionRule: ConfigurationProviderRule, OptInRule
triggeringExamples: [ triggeringExamples: [
Example(""" Example("""
extension Foo { extension Foo {
@IBInspectable private var x: Int @IBInspectable private var x: Int
} }
""") """)
] ]
) )
public func validate(file: SwiftLintFile) -> [StyleViolation] { public func makeVisitor(file: SwiftLintFile) -> ViolationsSyntaxVisitor? {
let collector = NamespaceCollector(dictionary: file.structureDictionary) Visitor(viewMode: .sourceAccurate)
let elements = collector.findAllElements(of: [.extension]) }
}
return elements
.flatMap { element in private extension IBInspectableInExtensionRule {
return element.dictionary.substructure.compactMap { element -> ByteCount? in final class Visitor: SyntaxVisitor, ViolationsSyntaxVisitor {
guard element.declarationKind == .varInstance, private(set) var violationPositions: [AbsolutePosition] = []
element.enclosedSwiftAttributes.contains(.ibinspectable),
let offset = element.offset override func visitPost(_ node: VariableDeclSyntax) {
else { let containsIBInspectable = node.attributes?.contains { attribute in
return nil attribute.as(AttributeSyntax.self)?.attributeName.tokenKind == .identifier("IBInspectable")
} } ?? false
return offset if containsIBInspectable {
} violationPositions.append(node.positionAfterSkippingLeadingTrivia)
} }
.map { }
StyleViolation(ruleDescription: Self.description,
severity: configuration.severity, override func visit(_ node: ClassDeclSyntax) -> SyntaxVisitorContinueKind {
location: Location(file: file, byteOffset: $0)) .skipChildren
} }
override func visit(_ node: ProtocolDeclSyntax) -> SyntaxVisitorContinueKind {
.skipChildren
}
override func visit(_ node: StructDeclSyntax) -> SyntaxVisitorContinueKind {
.skipChildren
}
override func visit(_ node: EnumDeclSyntax) -> SyntaxVisitorContinueKind {
.skipChildren
}
} }
} }