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