Extract `EnumDeclSyntax.supportsRawValues` helper (#4727)

I'll want to use this elsewhere shortly.

Also adds `CGFloat` to the raw value types since we were missing that
one.
This commit is contained in:
JP Simard 2023-01-27 16:46:54 -05:00 committed by GitHub
parent 84c6d200b6
commit 0750d5d465
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 25 deletions

View File

@ -177,6 +177,30 @@ extension VariableDeclSyntax {
} }
} }
public extension EnumDeclSyntax {
/// True if this enum supports raw values
var supportsRawValues: Bool {
guard let inheritedTypeCollection = inheritanceClause?.inheritedTypeCollection else {
return false
}
let rawValueTypes: Set<String> = [
"Int", "Int8", "Int16", "Int32", "Int64",
"UInt", "UInt8", "UInt16", "UInt32", "UInt64",
"Double", "Float", "Float80", "Decimal", "NSNumber",
"NSDecimalNumber", "NSInteger", "String", "CGFloat"
]
return inheritedTypeCollection.contains { element in
guard let identifier = element.typeName.as(SimpleTypeIdentifierSyntax.self)?.name.text else {
return false
}
return rawValueTypes.contains(identifier)
}
}
}
extension FunctionDeclSyntax { extension FunctionDeclSyntax {
var isIBAction: Bool { var isIBAction: Bool {
attributes?.contains { attr in attributes?.contains { attr in

View File

@ -89,17 +89,14 @@ private extension ExplicitEnumRawValueRule {
override var skippableDeclarations: [DeclSyntaxProtocol.Type] { [ProtocolDeclSyntax.self] } override var skippableDeclarations: [DeclSyntaxProtocol.Type] { [ProtocolDeclSyntax.self] }
override func visitPost(_ node: EnumCaseElementSyntax) { override func visitPost(_ node: EnumCaseElementSyntax) {
if node.rawValue == nil, if node.rawValue == nil, node.enclosingEnum()?.supportsRawValues == true {
let enclosingEnum = Syntax(node).enclosingEnum(),
let inheritance = enclosingEnum.inheritanceClause,
inheritance.supportsRawValue {
violations.append(node.identifier.positionAfterSkippingLeadingTrivia) violations.append(node.identifier.positionAfterSkippingLeadingTrivia)
} }
} }
} }
} }
private extension Syntax { private extension SyntaxProtocol {
func enclosingEnum() -> EnumDeclSyntax? { func enclosingEnum() -> EnumDeclSyntax? {
if let node = self.as(EnumDeclSyntax.self) { if let node = self.as(EnumDeclSyntax.self) {
return node return node
@ -108,23 +105,3 @@ private extension Syntax {
return parent?.enclosingEnum() return parent?.enclosingEnum()
} }
} }
private extension TypeInheritanceClauseSyntax {
var supportsRawValue: Bool {
// Check if it's an enum which supports raw values
let implicitRawValueSet: Set<String> = [
"Int", "Int8", "Int16", "Int32", "Int64",
"UInt", "UInt8", "UInt16", "UInt32", "UInt64",
"Double", "Float", "Float80", "Decimal", "NSNumber",
"NSDecimalNumber", "NSInteger", "String"
]
return inheritedTypeCollection.contains { element in
guard let identifier = element.typeName.as(SimpleTypeIdentifierSyntax.self)?.name.text else {
return false
}
return implicitRawValueSet.contains(identifier)
}
}
}