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 private extension IBInspectableInExtensionRule {
.flatMap { element in final class Visitor: SyntaxVisitor, ViolationsSyntaxVisitor {
return element.dictionary.substructure.compactMap { element -> ByteCount? in private(set) var violationPositions: [AbsolutePosition] = []
guard element.declarationKind == .varInstance,
element.enclosedSwiftAttributes.contains(.ibinspectable), override func visitPost(_ node: VariableDeclSyntax) {
let offset = element.offset let containsIBInspectable = node.attributes?.contains { attribute in
else { attribute.as(AttributeSyntax.self)?.attributeName.tokenKind == .identifier("IBInspectable")
return nil } ?? false
if containsIBInspectable {
violationPositions.append(node.positionAfterSkippingLeadingTrivia)
}
} }
return offset override func visit(_ node: ClassDeclSyntax) -> SyntaxVisitorContinueKind {
.skipChildren
} }
override func visit(_ node: ProtocolDeclSyntax) -> SyntaxVisitorContinueKind {
.skipChildren
} }
.map {
StyleViolation(ruleDescription: Self.description, override func visit(_ node: StructDeclSyntax) -> SyntaxVisitorContinueKind {
severity: configuration.severity, .skipChildren
location: Location(file: file, byteOffset: $0)) }
override func visit(_ node: EnumDeclSyntax) -> SyntaxVisitorContinueKind {
.skipChildren
} }
} }
} }