Compare commits
1 Commits
main
...
marcelo/ib
Author | SHA1 | Date |
---|---|---|
![]() |
a999c78155 |
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue