Files
swift-mirror/lib/Macros/Sources/ObservationMacros/Availability.swift
2024-10-16 16:33:14 -07:00

110 lines
2.6 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2023 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
//
//===----------------------------------------------------------------------===//
import SwiftSyntax
import SwiftSyntaxMacros
import SwiftDiagnostics
import SwiftSyntaxBuilder
extension AttributeSyntax {
var availability: AttributeSyntax? {
if attributeName.identifier == "available" {
return self
} else {
return nil
}
}
}
extension IfConfigClauseSyntax.Elements {
var availability: IfConfigClauseSyntax.Elements? {
switch self {
case .attributes(let attributes):
if let availability = attributes.availability {
return .attributes(availability)
} else {
return nil
}
default:
return nil
}
}
}
extension IfConfigClauseSyntax {
var availability: IfConfigClauseSyntax? {
if let availability = elements?.availability {
return with(\.elements, availability)
} else {
return nil
}
}
var clonedAsIf: IfConfigClauseSyntax {
detached.with(\.poundKeyword, .poundIfToken())
}
}
extension IfConfigDeclSyntax {
var availability: IfConfigDeclSyntax? {
var elements = [IfConfigClauseListSyntax.Element]()
for clause in clauses {
if let availability = clause.availability {
if elements.isEmpty {
elements.append(availability.clonedAsIf)
} else {
elements.append(availability)
}
}
}
if elements.isEmpty {
return nil
} else {
return with(\.clauses, IfConfigClauseListSyntax(elements))
}
}
}
extension AttributeListSyntax.Element {
var availability: AttributeListSyntax.Element? {
switch self {
case .attribute(let attribute):
if let availability = attribute.availability {
return .attribute(availability)
}
case .ifConfigDecl(let ifConfig):
if let availability = ifConfig.availability {
return .ifConfigDecl(availability)
}
@unknown default:
break
}
return nil
}
}
extension AttributeListSyntax {
var availability: AttributeListSyntax? {
var elements = [AttributeListSyntax.Element]()
for element in self {
if let availability = element.availability {
elements.append(availability)
}
}
if elements.isEmpty {
return nil
}
return AttributeListSyntax(elements)
}
}